簡體   English   中英

檢測精靈之間的碰撞

[英]Detect collision between sprites

我的代碼有問題。

我正在創建一個游戲,我需要一個可以同時出現多次的sprite,為此,我創建了一個類,以便可以多次執行addChild(obstacle),它將生成一個與另一個完全相同的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)

    }

}

}

如何檢測玩家何時與任何障礙物碰撞?

要檢測碰撞,您可以使用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")
       }
    }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM