2014-11-23 5 views
2

Я делаю игру iOS (быстрый 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

Почему вы не используете встроенное обнаружение столкновений из комплекта спрайтов? – Stefan

+0

Вы имеете в виду the didbegincontact? (См. Править) – DNC

+0

Да. См. Мой ответ с более подробной информацией. – Stefan

ответ

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 является точкой контакта.

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

+0

Хорошо. Извините, я этого не читал. В этом случае вы можете использовать SKConstraints для реализации следующего поведения. Я написал небольшой учебник в своем блоге. Может быть, это помогает: http://stefansdevplayground.blogspot.de/2014/09/howto-implement-targeting-or-follow.html – Stefan

+0

Есть ли более простой способ? Я пробовал свой путь, но он не работает, как я хочу, и как я могу предотвратить поворот последователя, когда он будет следовать? – DNC

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) нравится это? Когда я делаю это, он перемещается одинаково, но позиции разные, и я не знаю, почему, я пытался изменить с помощью player.position = CGPointMake(), но по какой-то причине это не работает? – DNC

+0

Что вы подразумеваете под «позициями разные»? Я предполагаю, что вы хотите, чтобы игрок был «поражен» автомобилем и вроде сидел на капоте, когда машина двигалась, правильно? Добавление игрока в качестве ребенка будет держать игрока в том же положении, где он был поражен автомобилем. – jonogilmour

+0

, и когда вы устанавливаете положение игрока, он устанавливает его относительно родителя. Поэтому вам нужно иметь в виду, что он больше не позиционируется по отношению к миру, а скорее к машине. – jonogilmour

Смежные вопросы