2014-11-23 109 views
2

我正在制作iOS游戏(swift xcode)。碰撞时将节点粘贴到另一个节点

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

都好,但现在我想的是,如果玩家触摸的车,它会移动相同的同车(它被贴到汽车)

现在我该怎么办呢?

我试过很多东西,但他们没有工作顺利..

我试图用

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

这工作,但球员被踢倒在车的中间,我不想这个。 我想要的是,如果玩家触摸到汽车的底部,它会粘在汽车的底部。

我该怎么做?

的碰撞detecion我还试图用:

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) 
    { 


    } 

} 

,但我不知道该怎么括号之间放,使其顺利运作就像我想要的。

+0

为什么不使用sprite套件中的内置碰撞检测? – Stefan 2014-11-23 21:47:54

+0

你的意思是didbegincontact? (见编辑) – DNC 2014-11-23 21:52:39

+0

是的。更多细节见我的答案。 – Stefan 2014-11-23 21:58:49

回答

3

你可以用一个固定的物理联合连接这两个节点。一般来说,物理关节连接着场景中的两个物理实体。固定版本,SKPhysicsJointFixed,加入两个身体,使他们作为一个单一的身体。

这里是如何连接与固定接头2个物理机构一个例子:

首先,将它添加到您的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语句是接触点。

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) { 
... 
    } 
+0

是的,谢谢你,我已经有了,但是我不知道在didbegincontact中放置什么功能让它像我想要的那样粘在一起。你能帮助我吗? – DNC 2014-11-23 22:00:15

+0

好的。对不起,我还没有读过。在这种情况下,您可以使用SKConstraints来实现以下行为。我在博客中写了一个小教程。也许这有助于:http://stefansdevplayground.blogspot.de/2014/09/howto-implement-targeting-or-follow.html – Stefan 2014-11-23 22:02:47

+0

有没有更简单的方法?我尝试了你的方式,但它不能像我想要的那样工作,以及如何防止追随者在跟随时旋转? – DNC 2014-11-23 22:15:16

1

更简单的方法来做到这一点没有物理是使用constraints

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

这将确保玩家最多从车100分之遥(你可以改变这个数字,使之更加切合实际)

而且当你要分离的玩家:

player.constraints=[] 
0

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

您可以使用关节,因为这里详述How to create joints in Sprite Kit (Xcode)?

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

+0

car.addChild(播放器)是这样的吗?当我这样做时,它移动相同,但位置不同,我不知道为什么,我试图改变与player.position = CGPointMake(),但由于某种原因,不工作? – DNC 2014-11-25 23:30:23

+0

“职位不同”是什么意思?我假设你希望玩家在赛车运动时能够被赛车“撞击”并坐在发动机罩上,对吗?将玩家添加为小孩将使玩家保持在与汽车碰撞的相同位置。 – jonogilmour 2014-11-26 00:06:39

+0

当你设置玩家的位置时,它会将其设置为相对于父级。所以你需要记住它不再是相对于世界的定位,而是相反的。 – jonogilmour 2014-11-26 00:08:09

相关问题