2016-07-10 5 views
0

私のコードに問題があります。スプライト間の衝突を検出します

私はゲームを作成していますが、同時に複数回出現するスプライトを持たなければならないので、クラスを作成してaddChild(障害物)を複数回実行し、1つのSKSpriteNode他のものとまったく同じです。

私の問題は、自分のプレーヤーと障害物の衝突をチェックしたいのですが、それは同じSkSpriteNodeのものなので、私が話している障害をコンピュータが知ることができません。ここで

は、私はプレーヤーと障害物を作成する方法は次のとおりです。

import SpriteKit 

class Obstacle: SKSpriteNode { 

    init() { 
     let obstacleTexture = SKTexture(imageNamed: "obstacle") 
     super.init(texture: obstacleTexture, color: UIColor.clearColor(), size: CGSize(width: 80, height: 80)) 
    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

} 

class GameScene: SKScene { 

    var player:SKSpriteNode! 

    override func didMoveToView(view: SKView) { 

     //player setup 
     let playerTexture = SKTexture(imageNamed: "player") 
     player = SKSpriteNode(texture: playerTexture) 
     player.position = CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.2) 

    } 

    //how I spawn an obstacle 
    func spawnObstacle() { 

     let obstacle = Obstacle() 

     //obstacle position setup 
     obstacle.position.x = CGFloat(arc4random()) % self.frame.size.width 
     obstacle.position.y = self.frame.size.height + 200 

     //random spin action setup 
     var rotateObstacle = SKAction.rotateByAngle(CGFloat(M_PI), duration: Double((drand48() + 1) * 0.75)) 

     if random() % 2 == 0 { 
      rotateObstacle = SKAction.rotateByAngle(CGFloat(M_PI), duration: Double((drand48() + 1) * 0.75)) 
     }else{ 
      rotateObstacle = SKAction.rotateByAngle(-CGFloat(M_PI), duration: Double((drand48() + 1) * 0.75)) 
     } 

     let rotateObstacleForever = SKAction.repeatActionForever(rotateObstacle) 

     //random move action setup 
     let moveObstacle = SKAction.moveTo(CGPointMake(CGFloat(arc4random()) % self.frame.size.width, -200), duration: Double((drand48() + 1) * 1.5)) 

     //running the actions 
     obstacle.runAction(rotateObstacleForever) 
     obstacle.runAction(moveObstacle) 

     addChild(obstacle) 

    } 

} 

} 

プレイヤーはいずれかの障害物に衝突したときに検出する方法は?

+0

*いかなる* 'physicsBody'はまだ、あなたは設定変更する必要がある、あなたは基本的にすべきSpriteKitの物理シミュレーションの仕組みをお読みください。 – luk2302

+0

私はphysicsBodyをセットアップしようとしましたが、動作しませんでした。プレイヤーが障害物を通過して何も起こらない – BenTrd

+0

チュートリアルを読むと、物理的な体を設定するだけの単純さではありません。 – luk2302

答えて

0

衝突を検出するには、SpriteKit物理を使用できます。

ここでは、仮想的な衝突に関与して3つの要素があります。

  • 境界(またはお使いのプレーヤーとどこがあなたの障害を持っている が住んフィールド)
  • プレーヤー
  • 障害

アドバイス

物理学を見るためにあなたのデバッグ相に、このパラメータを設定し

は境界オブジェクト:

skView.showsPhysics = true 

コードの例(警告: - このコードは私にはない、あなたの物理学を実現するために開始する唯一のポイントになりますあなたはそれが)あなたのオブジェクトのためのより良いだと信じて、あなたの仕事を修正することになりますので、あなたのプロジェクトの残りの部分を知っている:あなたが指定していない

enum CollisionTypes: UInt32 { 
    case Field = 1 
    case Player = 2 
    case Obstacle = 4 
} 

class GameScene: SKScene, SKPhysicsContactDelegate { 
    override func didMoveToView(view: SKView) { 
     self.physicsWorld.gravity = CGVectorMake(0, 0) // set your gravity value 
     self.physicsWorld.contactDelegate = self 
     let fieldBody = SKPhysicsBody.init(edgeLoopFromRect: self.frame) 
     self.physicsBody = fieldBody 
     self.physicsBody!.affectedByGravity = false 
     self.physicsBody!.usesPreciseCollisionDetection = true 
     self.physicsBody!.dynamic = true 
     self.physicsBody!.mass = 0.8 
     self.physicsBody!.friction = 0 
     self.physicsBody!.linearDamping = 0 
     self.physicsBody!.angularDamping = 0 
     self.physicsBody!.restitution = 0 
     self.physicsBody!.categoryBitMask = CollisionTypes.Field.rawValue 
     self.physicsBody!.contactTestBitMask = CollisionTypes.Player.rawValue 

     // Prepare the player 
     player.physicsBody = SKPhysicsBody(circleOfRadius: player.frame.width/2) 
     player.physicsBody!.affectedByGravity = false 
     player.physicsBody!.restitution = 0.0 
     player.physicsBody!.linearDamping = 0 
     player.physicsBody!.friction = 0.3 
     player.physicsBody!.dynamic = true 
     player.physicsBody!.mass = 0.2 
     player.physicsBody!.allowsRotation = false 
     player.physicsBody!.categoryBitMask = CollisionTypes.Player.rawValue 
     player.physicsBody!.contactTestBitMask = CollisionTypes.Field.rawValue | CollisionTypes.Obstacles.rawValue 
     player.physicsBody!.collisionBitMask = CollisionTypes.Field.rawValue | CollisionTypes.Obstacles.rawValue 

     //Prepare the obstacles (you must do it in your obstacle class) 
     obstacle.physicsBody = SKPhysicsBody(circleOfRadius: obstacle.frame.width/2) 
     obstacle.physicsBody!.affectedByGravity = false 
     obstacle.physicsBody!.restitution = 0.0 
     obstacle.physicsBody!.linearDamping = 0 
     obstacle.physicsBody!.friction = 0.3 
     obstacle.physicsBody!.dynamic = true 
     obstacle.physicsBody!.mass = 0.8 
     obstacle.physicsBody!.allowsRotation = true 
     obstacle.physicsBody!.categoryBitMask = CollisionTypes.Obstacle.rawValue 
     obstacle.physicsBody!.contactTestBitMask = CollisionTypes.Player.rawValue 
     obstacle.physicsBody!.collisionBitMask = CollisionTypes.Player.rawValue 
    } 
    func didBeginContact(contact: SKPhysicsContact) { 
     if (contact.bodyA.categoryBitMask == CollisionTypes.Player.rawValue && 
     contact.bodyB.categoryBitMask == CollisionTypes.Obstacle.rawValue) { 
     print("contact between Player and Obstacle") 
     } 
     if (contact.bodyA.categoryBitMask == CollisionTypes.Player.rawValue && 
     contact.bodyB.categoryBitMask == CollisionTypes.Field.rawValue) { 
     print("contact between Player and Field") 
     } 
    } 
} 
+0

助けてくれてありがとう。私はクラスに障害物物理を入れようとしましたが、 "未解決の識別子 '障害物の使用"と言います。私に何ができる? – BenTrd

+0

私は障害物を作成したり初期化した後ではなく、物理学を挿入する必要があると思います。 –

+0

なぜ、プレーヤーがボーダーに触れると、プレーヤーは消えますか? ところで、どうもありがとうございました! – BenTrd

関連する問題