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

Xcode 碰撞时将节点粘贴到另一个节点,xcode,swift,sprite-kit,collision-detection,collision,Xcode,Swift,Sprite Kit,Collision Detection,Collision,我正在制作一个iOS游戏(swift xcode) 有一辆汽车可以不停地移动(SKAction),还有一个玩家可以用滑动手势移动 一切都很好,但现在我想,如果玩家触碰汽车,它将与汽车一起移动(它会粘在汽车上) 现在我该怎么做 我尝试了很多事情,但没有一件成功 我试着用 if (CGRectIntersectsRect(car.frame, player.frame)) { car.position = player.position } 这是可行的,但是玩家被踢到了车中央,我不想这样。 我想要

我正在制作一个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)
    {


    }

}
func didBeginContact(联系人:skphysiccontact!){
var firstBody:SKPhysicsBody
var第二个主体:SKPhysicsBody
if(contact.bodyA.categoryBitMask

但我不知道如何将其放在括号之间,以使其像我所希望的那样顺利运行。

实现SKPhysicContactDelegate协议:

class GameScene: SKScene, SKPhysicsContactDelegate
在didMoveToView的末尾设置委托

override func didMoveToView(view: SKView) {
  ...

  self.physicsWorld.contactDelegate = self
}
创建全局变量以存储冲突类别:

let collisionCar: UInt32  = 0x1 << 0
let collisionPlayer: UInt32    = 0x1 << 1
实施didBeginContact:

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

可以使用固定的物理关节连接两个节点。通常,物理关节连接场景中的两个物理实体。固定版本,
skphysicjointfixed
,将两个实体连接在一起,使它们充当单个实体

下面是一个示例,演示如何使用固定关节连接两个物理实体:

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

并在
didBeginContact

self.joinPhysicsBodies(firstBody, bodyB:secondBody, point:contact.contactPoint)

其中,
触点。触点
是触点。

在没有物理的情况下,一种更简单的方法是使用:

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

当您要分离播放器时:

player.constraints=[]

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

您可以使用关节,如下所述


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

执行此操作为什么不使用sprite工具包中的内置碰撞检测?您是指didbegincontact吗?(参见编辑)是。更多细节请参见我的答案。是的,谢谢,我已经有了,但我不知道在didbegincontact的函数中添加什么才能让它像我想要的那样保持不变。你能帮我吗?好的。对不起,我没读过。在这种情况下,您可以使用SKConstraints实现以下行为。我在我的博客上写了一个小教程。也许这会有帮助:有没有更简单的方法?我试过你的方法,但它不能像我想要的那样工作,我怎样才能防止跟随者在跟随时旋转?也许吧。但是我现在没有别的主意。像这样的车。游戏机?当我这样做时,它移动相同,但位置不同,我不知道为什么,我试图用player.position=CGPointMake()进行更改,但由于某种原因,它不起作用??你说的“位置不同”是什么意思?我猜你想让玩家被车“撞”到,然后坐在引擎盖上,随着车的移动,对吗?将玩家添加为子玩家将使玩家保持在被汽车撞到的相同位置。当您设置玩家的位置时,它将相对于父玩家进行设置。所以你需要记住,它不再是相对于世界的位置,而是相对于汽车的位置。是的,但是汽车被添加到x.position=50,当我添加玩家作为汽车的子玩家时,玩家被添加到位置。x=50来自汽车。正如我刚才所说,玩家将被放置在相对于汽车的位置。
self.joinPhysicsBodies(firstBody, bodyB:secondBody, point:contact.contactPoint)
if (CGRectIntersectsRect(car.frame, player.frame)) {
    player.constraints=[SKConstraint.distance(SKRange(upperLimit: 100), toNode: car)]
}
player.constraints=[]