无法在 Lua 中为事件侦听器指定表对象

Unable to specify a table object to a event listener in Lua

提问人:laatto 提问时间:11/7/2023 最后编辑:ESkrilaatto 更新时间:11/19/2023 访问量:31

问:

我正在学习 Solar2d 教程 (https://docs.coronalabs.com/guide/programming/index.html),我正在尝试将前几节课组合成一个气球爆破游戏。我想在表格中放置气球对象,点击会导致气球消失。我添加了事件侦听器,我在其中用气球定义其他所有内容。但是,点击不会执行任何操作。我的问题是:

  1. 如何点击删除气球图像?
  2. 我应该在哪里添加代码以从表中删除已点击的气球?游戏循环中有一个for循环吗?

提前致谢!

`-----------------------------------------------------------------------------------------
--
-- main.lua
--
-----------------------------------------------------------------------------------------

--prep the physics
local physics = require("physics")
physics.start()
physics.setGravity(0, -20)

--seed the random number generator
math.randomseed( os.time() )

--prep the graphic groups
local backGroup = display.newGroup()
local mainGroup = display.newGroup()
local uiGroup = display.newGroup()

--prep variables
local newBalloon
local tappedBalloon
local balloonTable = {}

--load background
local background = display.newImageRect(backGroup,  "pictures/mainGroup/background.png", 360, 570)
background.x = display.contentCenterX
background.y = display.contentCenterY

--load boundaries
local border = display.newImageRect(mainGroup, "pictures/mainGroup/border.png", 281, 35)
border.x = display.contentCenterX
border.y = display.contentHeight-440
physics.addBody( border, "static" )

local function popBalloon( event )
    local tappedBalloon = event.target
    if event.phase == "began" then
        display.remove(tappedBalloon)
        --removing balloon from table?
    end
end


--creating and storing balloons
local function createBalloon ()
    local newBalloon = display.newImageRect(mainGroup, "pictures/mainGroup/balloon2.png", 118, 118)
    if newBalloon then
        table.insert(balloonTable, newBalloon)
        physics.addBody( newBalloon, "dynamic", { radius=50, bounce=0.2 } )
        --newBalloon.isBullet = true
        newBalloon.alpha = 0.8
        newBalloon.myName = "balloon"
        newBalloon:addEventListener("tap", popBalloon)
    end
    
    local placement = math.random(3)

    if (placement == 1) then
        newBalloon.x = math.random( display.contentWidth )
        newBalloon.y = math.random( 250,500 )
    elseif ( placement == 2 ) then
        newBalloon.x = math.random( display.contentWidth )
        newBalloon.y = math.random( 250,500 )
    elseif ( placement == 3 ) then
        newBalloon.x = math.random( display.contentWidth )
        newBalloon.y = math.random( 250,500 )
    end
end

local function gameLoop()
    createBalloon()
end

gameLoopTimer = timer.performWithDelay( 500, gameLoop)`

我尝试将事件侦听器放在气球创建之外,但导致“nil value”错误代码。

lua addeventlistener coronasdk

评论


答:

0赞 krystal 11/19/2023 #1

“点击”事件侦听器没有事件阶段。如果要控制相位,则应使用“触摸”侦听器。像这样移除你的对象是可以的;

local function popBalloon( event )
   local tappedBalloon = event.target
   display.remove(tappedBalloon)
end

此外,您的游戏循环只工作一次,因为 performWithDelay 的第三个参数默认为 1,如果您想重复创建气球,请使用;

gameLoopTimer = timer.performWithDelay( 500, gameLoop, 0 )

您还可以在 popBalloon 函数中从表中删除对象。首先全局创建一个索引计数器;

local index = 1

将索引设置为气球并递增它;

newBalloon.index = index
index = index + 1

现在回到你的 popBalloon 函数,你可以通过 tappedBalloon.index 查看点击的气球索引,这样你就可以在那里管理你的表。