Ios 用sk物理体探测碰撞
所以我正在创建一个游戏,我只想检测玩家节点和敌人发射的子弹之间的碰撞。因此,我为每个播放器和项目符号设置了适当的参数、categoryBitMask和contactTestBitMask 通过实现DIDBENG和didEnd函数,我希望在冲突开始和结束时执行一些代码。问题是,当我构建和运行项目时,物理子系统将子弹移动到播放器周围,而不是穿过播放器。这是因为isDynamic属性对于播放器、bullet或两者都设置得太真实。显然,首先要尝试的是将isDynamic属性设置为false;但是,当我这样做时,当发生冲突时,没有回调,并且没有执行didbeagin/didEnd函数 有人对如何解决这个问题有什么想法吗 玩家和子弹物理体的设置代码;以及下面的didbeagin函数供您参考Ios 用sk物理体探测碰撞,ios,swift,sprite-kit,skphysicsbody,Ios,Swift,Sprite Kit,Skphysicsbody,所以我正在创建一个游戏,我只想检测玩家节点和敌人发射的子弹之间的碰撞。因此,我为每个播放器和项目符号设置了适当的参数、categoryBitMask和contactTestBitMask 通过实现DIDBENG和didEnd函数,我希望在冲突开始和结束时执行一些代码。问题是,当我构建和运行项目时,物理子系统将子弹移动到播放器周围,而不是穿过播放器。这是因为isDynamic属性对于播放器、bullet或两者都设置得太真实。显然,首先要尝试的是将isDynamic属性设置为false;但是,当我这
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
编辑:我的碰撞和接触分步指南:
碰撞和接触测试位掩码指南:
操纵位掩码以关闭和打开单个碰撞和接触。
这太完美了!非常感谢