SpriteKitゲームで衝突を検出するのが難しくなりました。私はミサイルと敵とボートの衝突を検出したいだけです。衝突を検出していません
は私がColliderTypeを持っている:
struct ColliderType {
static let Boat: UInt32 = 1
static let Enemy: UInt32 = 2
static let Wall: UInt32 = 3
static let Bullet: UInt32 = 4
}
class GameplayScene: SKScene, SKPhysicsContactDelegate {
var player = SKSpriteNode()
var enemy = SKSpriteNode()
var boat = SKSpriteNode()
var missile = SKSpriteNode()
didBegin接触:私は
toview didMoveで "physicsWorld.contactDelegate =自己" を追加した
func didBegin(_ contact: SKPhysicsContact) {
var firstBody = SKPhysicsBody()
var secondBody = SKPhysicsBody()
if contact.bodyA.node?.name == "Missile" {
firstBody = contact.bodyA
secondBody = contact.bodyB
} else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}
if firstBody.node?.name == "Missile" && secondBody.node?.name ==
"Enemy" {
incrementScore()
secondBody.node?.removeFromParent()
} else if firstBody.node?.name == "Missile" &&
secondBody.node?.name == "Boat" {
incrementScore()
}
}
- 私はまた、関連するすべてのスプライトノードに物理学を追加しました:
func fireMissile() { let missile = SKSpriteNode(color: .yellow, size: CGSize(width: 20, height: 5)) missile.name = "Missile" missile.position = CGPoint(x: player.position.x + 28, y: player.position.y + 10) missile.zPosition = 2 missile.physicsBody = SKPhysicsBody(rectangleOf: missile.size) missile.physicsBody?.isDynamic = false missile.physicsBody?.categoryBitMask = ColliderType.Bullet missile.physicsBody?.collisionBitMask = ColliderType.Enemy | ColliderType.Boat missile.physicsBody?.contactTestBitMask = ColliderType.Enemy | ColliderType.Boat self.addChild(missile) } func createEnemies() { let enemy = SKSpriteNode(imageNamed: "Enemy1") enemy.name = "Enemy" enemy.anchorPoint = CGPoint(x: 0.5, y: 0.5) enemy.physicsBody = SKPhysicsBody(circleOfRadius: enemy.size.height /2) enemy.physicsBody?.categoryBitMask = ColliderType.Enemy enemy.physicsBody?.affectedByGravity = false enemy.physicsBody?.isDynamic = false enemy.zPosition = 3 enemy.position.y = self.frame.height + 100 enemy.position.x = CGFloat.randomBetweenNumbers(firstNum: -347.5, secondNum: -85) self.addChild(enemy) } func createBoat() { let boat = SKSpriteNode(imageNamed: "Boat") boat.name = "Boat" boat.anchorPoint = CGPoint(x: 0.5, y: 0.5) boat.physicsBody = SKPhysicsBody(circleOfRadius: boat.size.height/ 2) boat.physicsBody?.categoryBitMask = ColliderType.Boat boat.physicsBody?.affectedByGravity = false boat.physicsBody?.isDynamic = false boat.zPosition = 3 boat.position.y = self.frame.height + 100 boat.position.x = CGFloat.randomBetweenNumbers(firstNum: 0, secondNum: 0) self.addChild(boat) }
私は、ビットマスクがSprite-Kitでどのように動作するかについて、ドキュメンテーションサイトに長いポストを持っていますが、文書がすぐに削除されるため、リンクを投稿できません。 –
私はそれを変更しましたが、それでも動作しません。私は他のすべてのカテゴリでも衝突を検出しようとしましたが、どちらも動作しません:/ – Flinigan
OK - あなたの物理体のすべてが 'isDynamic'プロパティをfalseに設定していることに気がつきました.-これは、身体は接触を誘発しません。 「ミサイル」に「敵」または「ボート」のいずれかとの接触を生成させたい場合は、ミサイル攻撃またはダイナミック攻撃、または両方の敵とボートが必要です(連絡先に関与する2つのオブジェクトのうち1つだけが動的にする必要があります) .. –