碰撞时将节点粘贴到另一个节点

时间:2014-11-23 21:12:16

标签: xcode swift sprite-kit collision-detection collision

我正在制作iOS游戏(swift xcode)。

有一辆不断移动的汽车(SKAction)和一个可以用滑动手势移动的玩家。

一切都很好,但现在我想要的是,如果玩家接触到汽车,它会随着汽车一样移动(它会粘在汽车上)

现在我该怎么做?

我尝试过很多东西,但没有一个能顺利运作..

我尝试使用

if (CGRectIntersectsRect(car.frame, player.frame)) {
car.position = player.position
}

这有效,但是玩家被踢到了车的中间,我不想要这个。 我想要的是,如果玩家接触到汽车的底部,它就会粘在汽车的底部。

我该怎么做?

对于碰撞检测我也尝试使用:

 func didBeginContact(contact: SKPhysicsContact!) {
    var firstBody:SKPhysicsBody
    var secondBody:SKPhysicsBody

    if(contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask){
        firstBody = contact.bodyA
        secondBody = contact.bodyB
    }else{
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }


    if((firstBody.categoryBitMask & CarCategory) != 0 && (secondBody.categoryBitMask & playerCategory) != 0)
    {


    }

}

但是我不知道在括号之间放什么,以使它像我想要的那样顺利运作。

4 个答案:

答案 0 :(得分:3)

您可以使用固定的物理关节连接两个节点。通常,物理关节连接场景中的两个物理主体。固定版本SKPhysicsJointFixed加入两个实体,使它们作为一个整体。

以下是如何将两个物理实体与固定关节连接的示例:

首先,将其添加到您的SKScene子类(例如,GameScene.m)

func joinPhysicsBodies(bodyA:SKPhysicsBody, bodyB:SKPhysicsBody, point:CGPoint) {
    let joint = SKPhysicsJointFixed.jointWithBodyA(bodyA, bodyB: bodyB, anchor: point)
    self.physicsWorld.addJoint(joint)
}

并将其添加到if

中的didBeginContact语句中
self.joinPhysicsBodies(firstBody, bodyB:secondBody, point:contact.contactPoint)

其中contact.contactPoint是联系点。

答案 1 :(得分:2)

在没有物理的情况下更简单的方法是使用constraints

if (CGRectIntersectsRect(car.frame, player.frame)) {
    player.constraints=[SKConstraint.distance(SKRange(upperLimit: 100), toNode: car)]
}

这将确保玩家离车最远100点(您可以更改此数字以使其更加真实)

当你想要分离玩家时:

player.constraints=[]

答案 2 :(得分:0)

实施SKPhysicsContactDelegate协议:

class GameScene: SKScene, SKPhysicsContactDelegate

在didMoveToView

的末尾设置委托
override func didMoveToView(view: SKView) {
  ...

  self.physicsWorld.contactDelegate = self
}

创建全局变量以存储碰撞类别:

let collisionCar: UInt32  = 0x1 << 0
let collisionPlayer: UInt32    = 0x1 << 1

为汽车和玩家创建一个物理主体:

car.physicsBody = SKPhysicsBody(rectangleOfSize: car.size)
car.physicsBody?.affectedByGravity = false
car.physicsBody?.dynamic = false
car.physicsBody?.categoryBitMask = collisionCar
car.physicsBody?.contactTestBitMask = collisionPlayer
car.physicsBody?.collisionBitMask = 0x0;

player.physicsBody = SKPhysicsBody(rectangleOfSize: player.size)
player.physicsBody?.affectedByGravity = false
player.physicsBody?.dynamic = false
player.physicsBody?.categoryBitMask = collisionPlayer
player.physicsBody?.contactTestBitMask = collisionCar
player.physicsBody?.collisionBitMask = 0x0;

实施didBeginContact:

    func didBeginContact(contact: SKPhysicsContact) {
...
    }

答案 3 :(得分:0)

有两种方法可以做到这一点。

您可以使用关节,详见How to create joints in Sprite Kit (Xcode)?

或者您可以从世界中移除玩家节点并将其添加为车辆节点的子节点,在这种情况下,车辆节点和玩家节点将被链接并将一起移动。使用removeChildWithName()addChild()执行此操作。