【问题标题】:Detect collision between the player and an object with Sprite kit使用 Sprite 套件检测玩家和物体之间的碰撞
【发布时间】:2019-04-20 14:09:19
【问题描述】:

我在 xcode 中使用 sprite kit 制作游戏,我想让游戏在玩家触摸怪物时结束,你知道如何使用 categorymask 吗?

这里是部分代码:

导入 SpriteKit 导入 GameplayKit 导入 CoreMotion

类 GameScene:SKScene、SKPhysicsContactDelegate {

var player : SKSpriteNode!
var playerCategory : UInt32 = 0x1 << 0
var gameTimer2 : Timer!
var possiblealien = ["alien", "alien2", "alien3"]
let alienCategory : UInt32 = 0x1 << 1

override func didMove(to view: SKView) {


    player = SKSpriteNode (imageNamed: "player")
    player.position = CGPoint (x: self.frame.size.width / 2 - 500 , y: 
    player.size.height / 2 - 560)
    player.size = CGSize(width: player.size.width * 6 ,
                         height: player.size.height * 6)
    self.addChild(player)
    player.zPosition = 2

    self.physicsWorld.gravity = CGVector (dx: 0 , dy: 0 )
    self.physicsWorld.contactDelegate = self
    player.physicsBody?.contactTestBitMask = playerCategory
    player.physicsBody? = SKPhysicsBody(rectangleOf: player.size)
    player.physicsBody?.isDynamic = true
    player.physicsBody?.categoryBitMask = monsterCategory
    player.physicsBody?.collisionBitMask = 0


    gameTimer2 = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(addalien), userInfo: nil, repeats: true)
     motionManager.accelerometerUpdateInterval = 0.2
     motionManager.startAccelerometerUpdates(to: OperationQueue.current!) { ( data: CMAccelerometerData?, error:Error?)in

     if let accelerometerData = data {
     let acceleration = accelerometerData.acceleration
     self.xAcceleration = CGFloat(acceleration.x) * 0.65 + self.xAcceleration * 0.25
     }
    }

@objc func addalien () {

possiblealien = GKRandomSource.sharedRandom().arrayByShufflingObjects(in: possiblealien) as! [String]

let alien = SKSpriteNode(imageNamed: possiblealien[0])

let randomalienposition = GKRandomDistribution(lowestValue: -480, highestValue:  +800 )

let position = CGFloat(randomalienposition.nextInt())

alien.position = CGPoint (x: position - 200 , y: self.frame.size.height * 0.5 + alien.size.height)

alien.physicsBody = SKPhysicsBody(rectangleOf: alien.size)
alien.physicsBody?.isDynamic = true

alien.physicsBody?.categoryBitMask = alienCategory
alien.physicsBody?.contactTestBitMask = playerCategory
alien.physicsBody?.collisionBitMask = 0
alien.zPosition = 2
alien.size = CGSize(width: alien.size.width * 1 ,
                      height: alien.size.height * 1)
self.addChild(alien)

let animationduration:TimeInterval = 6
var actionArray = [SKAction]()

actionArray.append(SKAction.move(to: CGPoint(x: position, y: -1000 ),duration: animationduration))
actionArray.append(SKAction.removeFromParent())

alien.run(SKAction.sequence(actionArray))

}

【问题讨论】:

  • 你确定吗? player.physicsBody?.categoryBitMask = monsterCategory,应该是 player.physicsBody?.categoryBitMask= playerCategory,contactBitMask = monsterCategory

标签: xcode sprite-kit collision


【解决方案1】:

我看到你的问题,你需要在物理类别中声明它的物理体,否则,根本没有它的体

struct PhysicsCategory {

static let None:UInt32 = 0

static let All:UInt32 = UInt32.max

static let Player:UInt32 = 0b1

此外,contactbitmasks 应该是它们将与collisiontestbitmask 发生碰撞的对象。 catergorybitmask 应该是结构体中精灵的类别

例如:

let alien = SKSpritenode()
alien.physicsBody?.categoryBitMask = PhysicsCategory.Alien
alien.physicsBody?.contactBitMask = PhysicsCategory.Player
alien.physicsBody?.collisionTestBitMask = PhysicsCategory.Player

此外,您可以使用 |声明它们是否会与多个事物发生碰撞

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多