我目前正在制作卡片对战游戏。在主战场景中,我试图展示积极争斗的牌,他们的健康栏减少,最终武器也在场景中移动。
目前,当它进入战斗循环时,显示屏会冻结,但我一直记录正在发生的事情并且战斗仍在进行,就在幕后。我已经将战斗循环分离到代码顶部的自己的函数,并使用tap事件调用该函数。
我通过使用while循环中的print语句验证它是否正在运行,该语句将卡的当前运行状况和卡的名称打印到控制台。卡的当前健康状况正在发生变化,它只是不改变场景,而是冻结旧版,而不是主动显示正在发生的事情。
以下是整个场景的代码:
function battleScene(playerCards, enemyCards, allCards, cardHealth)
while not checkIfDead(playerCards) and not checkIfDead(enemyCards) do
for i=1, 6 do
if allCards[i]~=0 then
allCards[i]:battle()
end
print( allCards[i]:getCurHealth().." "..allCards[i]:getName() )--The test to see current health of card
cardHealth[i]:setHealth(allCards[i]:getCurHealth(),allCards[i]:getHealth())
if checkIfDead(playerCards) or checkIfDead(enemyCards) then
break
end
usleep(2000)
end
end
end
---------------------------------------------------------------------------------
-- "scene:show()"
function scene:show( event )
local sceneGroup = self.view
local phase = event.phase
if ( phase == "will" ) then
-- Called when the scene is still off screen (but is about to come on screen).
elseif ( phase == "did" ) then
--The current health of each card is set to max
--and then the card is rendered along with health bars
local card1=test1:render()
card1.x=display.contentCenterX-100
card1.y=display.contentCenterY-100
sceneGroup:insert(card1)
local card1Health=HealthBar:new()
card1Health.x=display.contentCenterX-100
card1Health.y=display.contentCenterY-40
card1Health:setHealth(test1:getCurHealth(), test1:getHealth())
sceneGroup:insert(card1Health)
playerCards={test4, test5, test6}
enemyCards={test1, test2, test3}
for i=1, 3 do
if playerCards[i]:getClass()=="Tank" or playerCards[i]:getClass()=="Damage" then
playerCards[i]:setBattleSet(enemyCards)
else
playerCards[i]:setBattleSet(playerCards)
end
end
for i=1, 3 do
if enemyCards[i]:getClass()=="Tank" or enemyCards[i]:getClass()=="Damage" then
enemyCards[i]:setBattleSet(playerCards)
else
enemyCards[i]:setBattleSet(enemyCards)
end
end
local allCards={test1, test2, test3, test4, test5, test6}
bubbleSort(allCards)
local cardHealth= {card1Health,card2Health,card3Health,card4Health,card5Health,card6Health}
local startBattleButton=display.newText( "Start Battle", 0, 0, globals.font.regular, 18 )
startBattleButton.x = display.contentCenterX
startBattleButton.y = display.contentCenterY
local function onTap(event)
startBattleButton.isVisible=false
battleScene(playerCards, enemyCards, allCards, cardHealth)
end
startBattleButton:addEventListener( "tap", onTap )
sceneGroup:insert(startBattleButton)
if checkIfDead(playerCards) then
win=false
end
end
end
答案 0 :(得分:1)
问题是您的战斗场景功能正在循环并修改场景,但场景引擎仅在事件处理呼叫之间更新场景。即,如果调用了tap函数并对其进行了修改,则只有在tap函数返回并且场景引擎处理了新场景状态后才会看到更改。
所以不要这样做:
function battleScene(args)
while condition do
do stuff
end
end
改为
function battleScene(args)
if condition then
do stuff
timer.performWithDelay(2, function() battleScene(args) end)
end
end
执行"做东西"当条件为真时,并安排调用battleScene
以供日后使用。如果显示引擎有更新GUI的机会,battleScene
将立即返回,2毫秒后,将再次调用battleScene
,直到最终条件为假并且不会安排重新调用。请注意,我必须创建一个临时匿名函数,因为battleScene
接受参数,而performWithDelay
不会将任何参数传递给调度函数,但它们可以通过匿名函数隐式赋予upvalues。要明确的是,如果battleScene
没有采取任何行动,你可以做到这一点:
function battleScene()
if condition then
do stuff
timer.performWithDelay(2, battleScene)
end
end