我对这一切都很陌生,这个项目中的所有内容都只是占位符和废料工作。你们中的一些人可能会认识到其他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)
任何可以帮我识别这个问题的人,我都非常感激!
答案 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
。如果是,则播放器停飞。