有人可以测试我的Corona项目并通过我的跳转功能识别问题吗?

时间:2014-06-13 06:03:37

标签: lua corona physics

我对这一切都很陌生,这个项目中的所有内容都只是占位符和废料工作。你们中的一些人可能会认识到其他Corona教程中使用的一些图形,但它可以帮助我变得更好,所以不要过于评判。这是Corona Simulator下载的链接:http://www.mediafire.com/download/6a78bsewgwsiyp2/GooMan.rar

无论如何,这是我的问题。跳跃按钮一开始看起来很好。如果我把它压低,这个角色会不断跳跃。如果我放手,他会停下来。如果我在按下其中一个箭头按钮的同时按住跳跃,他就会向那个方向跳跃。然而,似乎如果我跳一次,那么当角色与地面接触时我再次按下跳跃按钮,他不会跳跃。突然缺乏响应能力。我实际上必须稍微停下来等待角色完全击中地面才能再次成功跳跃。为什么?

以下是您要查看的所有相关代码:

我在一开始就帮助定义了goo角色的位置:

local spriteInAir = false
local yspeed = 0
local oldypos = 0
local holding = false

然后我创建了跳转按钮。

local bJump = display.newImage("Images/jumpbutton.png")
bJump.x = 445
bJump.y = 265
bJump.xScale = 0.78
bJump.yScale = 0.78

通过创建一个enterFrame运行时事件来跟进,该事件将更新我的goo角色在Y中的位置。如果相关,则以60fps运行游戏。

function checkSpeed()
yspeed = sprite.y - oldypos
oldypos = sprite.y
if yspeed == 0 then
spriteInAir = false
else
spriteInAir = true
end
end
Runtime:addEventListener( "enterFrame", checkSpeed )

然后是肉的全部。创建了一个名为hold的函数,它告诉游戏不仅让我的goo角色跳跃,而且只要按下bJump按钮,让我的goo角色不断跳跃。完美的工作。 "跳跃" function是一个侦听hold函数的触摸事件,所有这些事件都是由bJump按钮执行,用于监听跳转功能。

local function hold()
    if holding and spriteInAir == false then
      sprite:applyForce( 0, -8, sprite.x, sprite.y )
      sprite:setLinearVelocity(0, -350)
      spriteInAir = true
      return true
    end
end
local function jumping( event )
    if event.phase == "began" then
        display.getCurrentStage():setFocus( event.target )
        event.target.isFocus = true
        event.target.alpha = 0.6
        Runtime:addEventListener( "enterFrame", hold )
        holding = true
    elseif event.target.isFocus then
        if event.phase == "moved" then
        elseif event.phase == "ended" then
            holding = false
            event.target.alpha = 1
            Runtime:removeEventListener( "enterFrame", hold )
            display.getCurrentStage():setFocus( nil )
            event.target.isFocus = false
            spriteInAir = false
            return true
        end
    end
    return true
end
bJump:addEventListener("touch",jumping)

任何可以帮我识别这个问题的人,我都非常感激!

1 个答案:

答案 0 :(得分:1)

您正在使用速度检查来检测角色是否在地面上。在与Box2D发生碰撞后将其设置回零可能需要一段时间,因此更好的方法是使用碰撞传感器:

sprite.grounded = 0 -- Use a number to detect if the sprite is on the ground; a Boolean fails if the sprite hits two ground tiles at once

function sprite:collision(event)
  if "began" == event.phase then
    -- If the other object is a ground object and the character is above it...
    if event.other.isGround and self.contentBounds.yMax < event.other.contentBounds.yMin + 5 then
      sprite.grounded = sprite.grounded + 1 -- ...register a ground collision
    end
  elseif "ended" == event.phase then
    -- If the other object is a ground object and the character is above it...
    if event.other.isGround and self.contentBounds.yMax < event.other.contentBounds.yMin + 5 then
      sprite.grounded = sprite.grounded - 1 -- ...unregister a ground collision
    end
  end
end

sprite:addEventListener("collision")

然后,在您的跳转功能中,只需检查是否sprite.grounded > 0。如果是,则播放器停飞。