检查球和砖块之间的碰撞

时间:2019-07-11 15:05:08

标签: lua cheat-engine

由于我在Lua中具有碰撞检查功能:

    function onCollision(obj1,obj2)
     obj1x = obj1.left
     obj1y = obj1.top
     obj1w = obj1.width
     obj1h = obj1.height
     obj2x = obj2.left
     obj2y = obj2.top
     obj2w = obj2.width
     obj2h = obj2.height
     if obj2x + obj2w >= obj1x and obj2y + obj2h >= obj1y and obj2y <= obj1y + obj1h and obj2x <= obj1x + obj1w then
    return true
    end
   end

我确实使用窗体上的数组表将某些面板制成砖块,通过此功能,我进行了窗体各面的球之间的碰撞检查,没有问题。

function createBricks()
 for row = 1, brickRows do
   bricks[row] = {}
    for col = 1, brickColumns do
     local x = (col - 1) * (width + gap) -- x offset
     local y = (row - 1) * (height + gap) -- y offset
     local newBrick = createPanel(gamePanel)
     newBrick.width = brickWidth
     newBrick.height = brickHeight
     newBrick.top = y + 15
     newBrick.left = x + 15
     newBrick.BorderStyle = 'bsNone'
     if level == 1 then newBrick.color = '65407' -- green
     elseif level == 2 then newBrick.color = '858083' -- red
     elseif level == 3 then newBrick.color = '9125192' -- brown
     elseif level == 4 then newBrick.color = math.random(8,65255) end
     bricks[row][col] = newBrick
    end
 end
end

接下来如何检测球是否与砖块碰撞?到目前为止,我做到了:

for row = 1, brickRows do
       bricks[row] = {}
        for col = 1, brickColumns do
         dBrick = bricks[row][col]
         if onCollision(gameBall,dBrick) then
          dBrick.destroy()  -- destroy the collided brick
         end
        end
      end

我想学习如何在VB Net脚本中实现该冲突逻辑,这对我来说更容易实现VB脚本,我使用VB Net进行了整个游戏项目,现在我尝试使用CE Lua重新编写该项目。

Private brickArray(brickRows, brickColumns) As Rectangle
Private isBrickEnabled(brickRows, brickColumns) As Boolean

For rows As Integer = 0 To brickRows
 For columns As Integer = 0 To brickColumns
  If Not isBrickEnabled(rows, columns) Then Continue For
   If gameBall.IntersectsWith(brickArray(rows, columns)) Then
      isBrickEnabled(rows, columns) = False

      If gameBall.X + 10 < brickArray(rows, columns).X Or _
        gameBall.X > brickArray(rows, columns).X + brickArray(rows, columns).Width _
        Then
         xVel = -xVel
     Else
        yVel = -yVel
     End If
    End If
   Next
  Next

还有这个私人子,怎么写CE Lua?

Sub loadBricks()
        Dim xOffset As Integer = 75, yOffset As Integer = 100
        For row As Integer = 0 To brickRows
            For column As Integer = 0 To brickColumns
                brickArray(row, column) = New Rectangle(xOffset, yOffset, brickWidth, brickHeight)
                xOffset += brickWidth + 10
                isBrickEnabled(row, column) = True
            Next
            yOffset += brickHeight + 10
            xOffset = 75
        Next
    End Sub

    Function getBrickCount() As Integer
        Dim Count As Integer = 0
        For Each brick As Boolean In isBrickEnabled
            If brick = True Then Count += 1
        Next
        Return Count
    End Function

1 个答案:

答案 0 :(得分:0)

function onCollision(obj1,obj2)
     obj1x = obj1.left
     obj1y = obj1.top
     obj1w = obj1.width
     obj1h = obj1.height
     obj2x = obj2.left
     obj2y = obj2.top
     obj2w = obj2.width
     obj2h = obj2.height
     if obj2x + obj2w >= obj1x and obj2y + obj2h >= obj1y and obj2y <= obj1y + obj1h and obj2x <= obj1x + obj1w then
    return true
    end
   end

然后检测碰撞并从表中删除碰撞

-- Drawback table
local function tcount( t )
  local c = 0
  for k,v in pairs(t) do
   c = c + 1
  end
  return c
end

 local count = #brickArray
       for x = 1, count do
        if onCollision(gameBall, brickArray[x]) then
         if gameBall.Left + 10 < brickArray[x].Left or gameBall.Left > brickArray[x].Left + brickArray[x].Width then
            xVel = -xVel else yVel = -yVel
          end
           playSound(findTableFile('strikeball.wav'))
           brickArray[x] = brickArray[count]
           brickArray[x] = x
           brickArray[count] = nil
           brickArray[x].Visible = false
           tcount(brickArray)
        end
       end

上面的代码检测到碰撞,并从表中删除了该对象,但未从显示中删除该对象。如何使用Cheat Engine Lua脚本从表和显示中删除积木?