swift - 仅在着陆时跳跃
Posted
技术标签:
【中文标题】swift - 仅在着陆时跳跃【英文标题】:swift - Jump only when landed 【发布时间】:2015-08-09 11:54:10 【问题描述】:我希望限制我的角色(猫),只在它在地面上(虚拟 SKNode)或在树上(treeP SKNode)时才跳跃。
目前我对touchesBegan
没有任何限制,因此如果用户快速连续点击,猫就可以在空中飞翔,虽然这在其他游戏中可能有用,但这里不受欢迎。
如果有人可以帮助我,我会非常高兴。
如果猫与假人或树接触,我想做但没有经验的是启用点击(跳跃),如果没有接触假人或树,同样禁用点击。
这里有所有可能有用的东西......
class GameScene: SKScene, SKPhysicsContactDelegate
let catCategory: UInt32 = 1 << 0
let treeCategory: UInt32 = 1 << 1
let worldCategory: UInt32 = 1 << 1
override func didMoveToView(view: SKView)
// part of cat code
cat = SKSpriteNode(texture: catTexture1)
cat.position = CGPoint(x: self.frame.size.width / 2.2, y: self.frame.size.height / 7.0 )
cat.physicsBody?.categoryBitMask = catCategory
cat.physicsBody?.collisionBitMask = crowCategory | worldCategory
cat.physicsBody?.contactTestBitMask = crowCategory | contact2Category
// part of the ground code
var dummy = SKNode()
dummy.position = CGPointMake(0, groundTexture.size().height / 2)
dummy.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.frame.size.width, groundTexture.size().height))
dummy.physicsBody!.dynamic = false
dummy.physicsBody?.categoryBitMask = worldCategory
dummy.physicsBody?.collisionBitMask = 0
dummy.physicsBody?.contactTestBitMask = 0
moving.addChild(dummy)
// part of the tree code
func spawnTrees()
var treeP = SKNode()
treeP.position = CGPointMake( self.frame.size.width + treeTexture1.size().width * 2, 0 );
treeP.zPosition = -10;
var height = UInt32( self.frame.size.height / 4 )
var y = arc4random() % height;
var tree1 = SKSpriteNode(texture: treeTexture1)
tree1.position = CGPointMake(0.0, CGFloat(y))
tree1.physicsBody = SKPhysicsBody(rectangleOfSize: tree1.size)
tree1.physicsBody?.dynamic = false
tree1.physicsBody?.categoryBitMask = treeCategory;
tree1.physicsBody?.collisionBitMask = 0
tree1.physicsBody?.contactTestBitMask = 0
treeP.addChild(tree1)
treeP.runAction(moveAndRemoveTrees)
trees.addChild(treeP)
// all of touchesBegan
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)
/* Called when a touch begins */
if (moving.speed > 0)
cat.physicsBody!.velocity = CGVectorMake(0, 0)
cat.physicsBody!.applyImpulse(CGVectorMake(0, 20))
else if (canRestart)
self.resetScene()
【问题讨论】:
【参考方案1】:您可以使用一些名为isOnTheGround
的自定义布尔变量来限制在空中跳跃。这个变量需要你自己更新。注意,角色不一定在地面上,只要它与“平台”接触(例如,可能发生侧面接触)。因此,由您来定义“在地面上”的含义。当你定义它时,就很容易了:
提示:您可以将角色的 y 位置与平台的 y 位置进行比较,以查看角色是否真的在平台上。
假设角色和平台的锚点都不变(0.5,0.5),要计算角色的腿y位置,你可以这样做(伪代码):
characterLegsY = characterYPos - characterHeight/2
并且为了获得平台的表面:
platformSurfaceYPos = platformYPos + platformHeight/2
防止在空中跳跃
在 touchesBegan 中:
如果isOnTheGround
-> 跳转
在 didEndContact 中:
在这里您将isOnTheGround
设置为 false(角色结束与地面/平台的接触)
在 didBeginContact 中:
检查角色是否真的在地上 将isOnTheGround
变量设置为true
Here你可以找到类似的例子......
【讨论】:
【参考方案2】:我最近遇到了这个问题。这就是我修复它的方法。在游戏场景中创建这个变量:
var ableToJump = true
然后在更新方法中放入这段代码:
if cat.physicsBody?.velocity.dy == 0
ableToJump = true
else
ableToJump = false
上面的代码可以工作,因为更新方法在游戏的每一帧都运行。它检查您的猫是否在 y 轴上移动的每一帧。如果您没有更新方法,只需键入 override func update 它应该会自动完成。
现在最后一步是将这段代码放在 touchesBegan 中:
if ableToJump == true
cat.physicsBody!.applyImpulse(CGVectorMake(0,40))
注意:您可能需要调整冲动以获得所需的跳跃高度
【讨论】:
完美,你是我的新宠!谢谢。 小心,如果这是唯一的检查,那么你可以在角色在跳跃过程中达到最高点时跳跃。这将允许您继续在空中跳跃。下坡时,此检查也不起作用。 您可以根据需要创建另一个检查,但实际上有人能够在跳跃的顶部抓住它的可能性不大。您可以通过检查位置是否小于跳跃中的任何点来修复它。我只是假设我回答时没有任何斜坡。以上是关于swift - 仅在着陆时跳跃的主要内容,如果未能解决你的问题,请参考以下文章
通过在 SpriteKit/Swift 中向上滑动来跳跃角色