Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 用sk物理体探测碰撞_Ios_Swift_Sprite Kit_Skphysicsbody - Fatal编程技术网

Ios 用sk物理体探测碰撞

Ios 用sk物理体探测碰撞,ios,swift,sprite-kit,skphysicsbody,Ios,Swift,Sprite Kit,Skphysicsbody,所以我正在创建一个游戏,我只想检测玩家节点和敌人发射的子弹之间的碰撞。因此,我为每个播放器和项目符号设置了适当的参数、categoryBitMask和contactTestBitMask 通过实现DIDBENG和didEnd函数,我希望在冲突开始和结束时执行一些代码。问题是,当我构建和运行项目时,物理子系统将子弹移动到播放器周围,而不是穿过播放器。这是因为isDynamic属性对于播放器、bullet或两者都设置得太真实。显然,首先要尝试的是将isDynamic属性设置为false;但是,当我这

所以我正在创建一个游戏,我只想检测玩家节点和敌人发射的子弹之间的碰撞。因此,我为每个播放器和项目符号设置了适当的参数、categoryBitMask和contactTestBitMask

通过实现DIDBENG和didEnd函数,我希望在冲突开始和结束时执行一些代码。问题是,当我构建和运行项目时,物理子系统将子弹移动到播放器周围,而不是穿过播放器。这是因为isDynamic属性对于播放器、bullet或两者都设置得太真实。显然,首先要尝试的是将isDynamic属性设置为false;但是,当我这样做时,当发生冲突时,没有回调,并且没有执行didbeagin/didEnd函数

有人对如何解决这个问题有什么想法吗

玩家和子弹物理体的设置代码;以及下面的didbeagin函数供您参考

    playerNode!.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: playerNode!.size.width/2, height: playerNode!.size.height/2))  //sets the physics body for the player
    playerNode!.physicsBody!.isDynamic = false                                                                                        //we dont want the physics to be simulated by the subsystem
    playerNode!.physicsBody!.affectedByGravity = false
    playerNode!.physicsBody!.pinned = false
    playerNode!.physicsBody!.allowsRotation = false
    playerNode!.physicsBody!.categoryBitMask = PhysicsCategory.Player
    playerNode!.physicsBody!.contactTestBitMask = PhysicsCategory.Bullet

    self.bullet?.physicsBody = SKPhysicsBody(circleOfRadius: bullet!.size.width * 0.5)
    self.bullet?.physicsBody?.isDynamic = true
    self.bullet?.physicsBody?.pinned = false
    self.bullet?.physicsBody?.allowsRotation = false
    self.bullet?.physicsBody?.affectedByGravity = false
    self.bullet?.physicsBody?.categoryBitMask = PhysicsCategory.Bullet
    self.bullet?.physicsBody?.contactTestBitMask = PhysicsCategory.Player

func didBegin(_ contact: SKPhysicsContact) {
    let collision = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

    if collision == PhysicsCategory.Player | PhysicsCategory.Bullet {
        print("There was a collision with the player and a bullet")
    }
}

//Defines the physics category for the game
struct PhysicsCategory {
    static let None: UInt32   = 0
    static let Player: UInt32 = 0b1
    static let Bullet: UInt32 = 0b10
}

子弹在玩家周围“移动”,而不是穿过它,因为你已经打开了碰撞。默认情况下,所有物理体都会与所有其他物理体碰撞,而默认情况下,物理体之间没有注册的接触

首先要做的是关闭玩家和子弹之间的碰撞,反之亦然,同时保持所有其他碰撞不受影响:

playerNode.physicsBody?.collisionBitMask&=~physicsCategory.bullet
bullet.physicsBody?.collisionBitMask&=~physicsCategory.player

编辑:我的碰撞和接触分步指南:

碰撞和接触测试位掩码指南:

操纵位掩码以关闭和打开单个碰撞和接触。

这太完美了!非常感谢