Ios 怎样才能使物理体的一侧在SpriteKit中活跃?

Ios 怎样才能使物理体的一侧在SpriteKit中活跃?,ios,sprite-kit,Ios,Sprite Kit,我有一个英雄,一块地和一张桌子。我想激活一个桌面,以便与hero进行碰撞和联系。但英雄应该能够不跳到顶端,只要跑“穿过”并跳上它,如果玩家想要它,无论他想去哪里。为了更好地说明我正在努力实现的目标,请想想马里奥。当你在地面上跑步时,会出现一些天空平台。你可以跳到站台中间,呆在那里。所以我需要物理身体,当英雄从底部接触它时,不要阻止他,但如果他在上面,就要抓住他。 到目前为止,我正在为表格使用body with texture: self.table.physicsBody = SKPhy

我有一个英雄,一块地和一张桌子。我想激活一个桌面,以便与hero进行碰撞和联系。但英雄应该能够不跳到顶端,只要跑“穿过”并跳上它,如果玩家想要它,无论他想去哪里。为了更好地说明我正在努力实现的目标,请想想马里奥。当你在地面上跑步时,会出现一些天空平台。你可以跳到站台中间,呆在那里。所以我需要物理身体,当英雄从底部接触它时,不要阻止他,但如果他在上面,就要抓住他。 到目前为止,我正在为表格使用body with texture:

    self.table.physicsBody = SKPhysicsBody(texture:table.texture, size:self.table.size)
self.table.physicsBody?.dynamic = false
self.table.physicsBody?.categoryBitMask = ColliderType.Table.rawValue
self.table.physicsBody?.contactTestBitMask = ColliderType.Hero.rawValue
self.table.physicsBody?.collisionBitMask = ColliderType.Hero.rawValue

很明显,它不起作用。我怎样才能实现这样的事情?

< p>我不确定你的平台是什么样子的(基于边缘的或基于体积的身体),但是你可以考虑其中的一些:

1。检查位置

  • 检查英雄的位置.y是否在平台下方/上方,并忽略/处理碰撞
2。检查速度

  • 或者检查玩家节点是否下落,由负的velocity.dy值指示
我不能说这些是否能完全帮助你的游戏或者你的设置是否可行,但是你可以从哪里开始


可以通过更改玩家和平台的碰撞位掩码来启用/禁用碰撞。如果可能的话,尽量避免跟踪状态,如isInTheAir、isOnPlatform、isFaling、isJumping和类似的状态,因为随着状态数量的增加,它会变得混乱。例如,您可以检查velocity.dy是否为负数,以查看播放器是否在下降,而不是添加名为“isFalling”的自定义布尔变量并持续保持其状态

这个问题的答案其实并不太难,但是在一个成熟的游戏中实现它对您来说要困难得多。对于一个新手程序员来说,这不是一开始就要做的事情

首先是相同的代码项目(点击/点击屏幕跳转):

#导入“GameScene.h”
类型定义NS_选项(uint32_t,1级物理目录){

CategoryPlayer=1使用swift,您可以创建如下sprite节点子类:

class TableNode: SKSpriteNode {

    var isBodyActivated: Bool = false {
        didSet {
            physicsBody = isBodyActivated ? activatedBody : nil
        }
    }

    private var activatedBody: SKPhysicsBody?

    init(texture: SKTexture) {

        super.init(texture: texture, color: SKColor.clearColor(), size: texture.size())

        // physics body setup. Assuming anchorPoint = (0.5, 0.5)
        let bodyInitialPoint = CGPoint(x: -size.width/2, y: +size.height/2)
        let bodyEndPoint = CGPoint(x: +size.width/2, y: +size.height/2)

        activatedBody = SKPhysicsBody(edgeFromPoint: bodyInitialPoint, toPoint: bodyEndPoint)
        activatedBody!.categoryBitMask = ColliderType.Table.rawValue
        activatedBody!.collisionBitMask = ColliderType.Hero.rawValue

        physicsBody = isBodyActivated ? activatedBody : nil

        name = "tableNode"
    }
}
然后,更新游戏场景中的所有tableNodes:

override func didSimulatePhysics() {
    self.enumerateChildNodesWithName("tableNode") {
        node, stop in 

        if let tableNode = node as? TableNode {
            // Assuming anchorPoint = (0.5, 0.5) for table and hero
            let tableY = tableNode.position.y + tableNode.size.height/2
            let heroY = hero.position.y - hero.size.height/2
            tableNode.isBodyActivated = heroY > tableY
        }
    }
}

我尝试更改平台冲突位掩码,但效果不佳。我找到了不同的解决方案

在update()函数中,您可以检查以下内容

if player.physicsBody?.velocity.dy <= 0 {
    player.physicsBody?.collisionBitMask = PhysicsCategory.Platform
} else {
    player.physicsBody?.collisionBitMask = PhysicsCategory.None
}

如果player.physicsBody?.velocity.dy,你是对的!现在对我来说有点太难了。我想我会开始寻找其他方法来做类似的事情。不过谢谢你,这是一个很好的例子!
if player.physicsBody?.velocity.dy <= 0 {
    player.physicsBody?.collisionBitMask = PhysicsCategory.Platform
} else {
    player.physicsBody?.collisionBitMask = PhysicsCategory.None
}