检测球和砖块数组之间的碰撞

由于我在 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' -- 绿色
     elseif level == 2 then newBrick.color = '858083' -- 红色
     elseif level == 3 then newBrick.color = '9125192' -- 棕色
     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()  -- 摧毁与之碰撞的砖块
         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
点赞
用户3670853
用户3670853
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

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

-- 缺点表
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

上面的代码检测到碰撞并从表中删除对象,但是它没有从显示中删除。如何使用作弊引擎 Lua 脚本从表和显示中删除这些砖块?

2019-07-13 03:58:47