作曲家中的电晕主动战斗场景

时间:2014-04-15 20:00:54

标签: lua corona

我目前正在制作卡片对战游戏。在主战场景中,我试图展示积极争斗的牌,他们的健康栏减少,最终武器也在场景中移动。

目前,当它进入战斗循环时,显示屏会冻结,但我一直记录正在发生的事情并且战斗仍在进行,就在幕后。我已经将战斗循环分离到代码顶部的自己的函数,并使用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

1 个答案:

答案 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