提问人:laatto 提问时间:11/7/2023 最后编辑:ESkrilaatto 更新时间:11/19/2023 访问量:31
无法在 Lua 中为事件侦听器指定表对象
Unable to specify a table object to a event listener in Lua
问:
我正在学习 Solar2d 教程 (https://docs.coronalabs.com/guide/programming/index.html),我正在尝试将前几节课组合成一个气球爆破游戏。我想在表格中放置气球对象,点击会导致气球消失。我添加了事件侦听器,我在其中用气球定义其他所有内容。但是,点击不会执行任何操作。我的问题是:
- 如何点击删除气球图像?
- 我应该在哪里添加代码以从表中删除已点击的气球?游戏循环中有一个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”错误代码。
答:
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 查看点击的气球索引,这样你就可以在那里管理你的表。
评论