swift - 仅在落地时跳跃

标签 swift sprite-kit gamekit touchesbegan sknode

我希望限制我的角色(猫),使其仅在地面上(虚拟 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()
    }

}

最佳答案

您可以使用一些名为 isOnTheGround 的自定义 bool 变量来限制在空中的跳跃。此变量需要由您更新。请注意,如果角色与“平台”接触,则角色不一定在地面上(例如,可能发生侧面接触)。因此,由您来定义“在地面上”的含义。当您定义它时,就很容易了:

提示:您可以将角色的 y 位置与平台的 y 位置进行比较,看看角色是否真的在平台上。

假设角色和平台的 anchor 都没有改变 (0.5,0.5),要计算角色的腿的 y 位置,您可以这样做(伪代码):

characterLegsY = characterYPos - characterHeight/2

并获得平台的表面:

platformSurfaceYPos = platformYPos + platformHeight/2

防止在空中跳跃

在touchesBegan:

  • 如果 isOnTheGround -> 跳转

在 didEndContact 中:

  • 在这里你将 isOnTheGround 设置为 false(角色结束与地面/平台的接触)

在 didBeginContact 中:

  • 检查角色是否真的在地上
  • isOnTheGround 变量设置为 true

Here你可以找到类似的例子......

关于swift - 仅在落地时跳跃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31903934/

相关文章:

ios - 如何将 UINavigationBar 与动画重叠?

ios - 无法将 SKEffectNode 视为具有建议效果的 child

Swift Sprite Kit Audio API 而不是 AVFoundation?

objective-c - iOS:以逐渐增加的速度触发方法

ios - inviteHandler 从未调用过

iphone - 使用 NSCoder 编码 NSArray 或 NSDictionary

swift - 如何在 Swift 中检查 NSDecimalNumber.zero()

SwiftUI:如何更改 NavigationView.toolbar 背景颜色

Swift UITest - 找不到具有可访问性标识符的文本字段的匹配项

ios - SpriteKit - Objective C - 相机约束