【问题标题】:Lua for loop does not iterate properlyLua for 循环无法正确迭代
【发布时间】:2014-12-24 07:07:51
【问题描述】:

我急需有关 for 循环的帮助。我正在尝试使用 Corona SDK 在 Lua 中进行 for 循环,但我做错了,但我不知道是什么。我的代码见下文:

function moveLift(event)
    for j=1,4,1 do
        if event.phase == "began" then
            markY = event.target.y

        elseif event.phase == "moved" then
            local y = (event.y - event.yStart) + markY
            event.target.y = y

        elseif event.phase == "ended" then

            if (hasCollided( event.target, hotSpots[j] )) then

                print("hasCollided with floor: ", hotSpots[j].floor)

                if (event.target.destination == hotSpots[j].floor) then
                    print("correct floor")
                    succesfullPassengers = succesfullPassengers + 1

                    if succesfullPassengers == PASSENGER_AMOUNT then
                        print("game over")
                    end
                else
                    print("Wrong! elevator has collided with floor: ", hotSpots[j].floor)
                end
            end
        end
        return true
    end
end

我在这里要做的是检查我何时将电梯拖放到屏幕上的哪个楼层。我已经创建了热点(基本上是 hitboxes,目前用作艺术占位符)并将它们放置在 hotSpot 表中,如下所示:

-- Create elevator hotspots
for k=1,4,1 do
    hotSpots[k] = display.newRect( gameAreaGroup, 0, 0, 50, 75 )
    hotSpots[k].alpha = 0.25  --Show hotspots with alpha
    hotSpots[k].floor = k -- The floor id
    print("Created hotspot on floor: ",hotSpots[k].floor)
    hotSpots[k].x = display.contentWidth *0.5
    hotSpots[k].y = firstFloor - (FLOOR_HEIGHT * k)
    hotSpots[k]:setFillColor( 255,0,0 )
    hotSpots[k]:addEventListener( "tap", returnFloor ) -- Check floor value
    gameAreaGroup:insert(hotSpots[k])
end

我使用一个名为 returnFloor 的测试函数检查每个热点是否具有唯一的楼层值,它们有 (1,2,3,4)。当我将电梯拖放到一楼时,我收到消息“错误!电梯与楼层发生碰撞:1”,但在任何其他楼层我收到消息:“与楼层发生碰撞:1”。所以我的 moveLift 函数中的 for 循环一定有问题,因为它只返回第 1 层而不返回任何其他楼层。

PS:正确的楼层是4楼,顶楼。

【问题讨论】:

    标签: for-loop lua drag-and-drop coronasdk collision


    【解决方案1】:

    你的 for 循环中有“return true”,所以它永远不会超过 j=1。我认为您可能需要将该语句向上移动到最后一个 if 语句中,或者在它后面的“结束”下方(不知道完整的逻辑,我不确定返回值的用途)。

    【讨论】:

    • 永远不会超过 1 是完全有道理的!从未将退货视为问题。提高回报,它就像一个魅力,thnx!
    【解决方案2】:

    最后几行代码不应该是end end return true end end,而是 end end end return true end 所以返回是在循环完成之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-29
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 2015-02-22
      相关资源
      最近更新 更多