2014-12-16 2 views
2

Хорошо, поэтому я пишу код для космической бластерной игры, и все, кажется, идет хорошо, минус эти важные проблемы.Физические тела SpriteKit Коллизии в нескольких слоях

Во-первых, я добавил космический корабль (с физикой) как ребенок сам (GameScene).

Затем я добавил фоновый слой как узел также как дитя себя, за космическим кораблем и имитировал движение, перемещая фон вокруг космического корабля с помощью джойстика.

Я добавил узел с физическим телом граничной физики Edge Loop, чтобы фон не выходил за пределы корабля и добавил этот узел как дочерний элемент bgLayer.

У меня есть объекты для запуска космического корабля, но я хочу, чтобы они перемещались в фоновом режиме, поэтому я добавил их как детей из bgLayer.

Конечно, мне нужен был лазер, когда стрелял космический корабль, поэтому я добавил его, а также ребенка из bgLayer.


_spaceship.physicsBody = (custom physicsBody code); 
[self addChild:_spaceship]; 

_bgLayer = [SKNode node]; 
[self addChild:_bgLayer]; 

_bounds = [SKNode node]; 
_bounds.physicsBody = (physicsBody edgeLoop code); 
[_bgLayer addChild:_bounds]; 

_otherObjects.physicsBody = (custom physicsBody code); 
[_bgLayer addChild:_otherObjects]; 

_laser.physicsBody = (custom physicsBody code); 
[_bgLayer addChild:_laser]; 

Все хорошо, фон не выйти за пределы космического корабля, другие объекты перемещаются в качестве фона движется, и лазерные огни, когда призвали.

Моя первая большая дилемма - когда мой лазер срабатывает, он не перемещается по мере движения фона, но фон движется за ним. Возможно, я мог бы сделать, но это выглядит забавно, если лазер всегда двигается параллельно с кораблем. Это кажется странным для меня, так как я добавил лазер в детстве _bgLayer.

Во-вторых, физика моего лазера, похоже, не распознает тело EdgeLoop и не проплывает прямо через него. Кроме того, мой физический корабль космического корабля, похоже, распознает тело EdgeLoop, но он не распознает другие объекты, которые являются дочерними элементами _bgLayer.

Физические тела, которые не являются детьми одного слоя, узнают друг друга? И почему мой лазер не ведет себя так же, как другие дети того же слоя?

+0

В физическом двигателе нет слоев. В каждой сцене есть один физический мир. Вам просто нужно установить категории столкновений и что-то подобное, и обязательно настройте все, что определяет, если и как объект участвует в физике. – uchuugaka

+0

Я прошу прощения за то, что я не добавил это в свой пример кодирования, но я установил для них категорию и бит-бит столкновений, но лазер, похоже, игнорирует эти настройки. – wtivie05

ответ

0

Перемещение мира, изменяя его положение будет влиять на

  1. детей с физическими телами
  2. Детей без физических тел

Moving мира путем применения силы/импульса или настроек его скорости будет влиять на

  1. Дети без физических тел

Вместо того чтобы двигаться миром, установив его скорость, вы можете добавить камеру (SKNode с физическим телом) в мир, перемещать камеру, установив ее скорость, а затем обновить положение в мире в центр камеры. Вы можете центрировать камеру в методе didFinishUpdate.

+0

Прошу прощения за то, что я не добавил это в свой пример кодирования, но я установил лазер в движение с помощью метода setVelocity. Мой лазер взаимодействует с другими объектами, о которых я упоминал, но не с edgeLoop. Ваш последний комментарий интригует меня. Я бы просто вычл dx и dy вектора фона из dx и dy вектора лазера? – wtivie05

+0

На самом деле, лазер должен двигаться соответствующим образом без какой-либо регулировки, если вы добавили его в мировой узел. – 0x141E

+0

Вот что я тоже подумал. Однако он по-прежнему перемещается относительно сцены вместо узла _bgLayer. – wtivie05

0
-(void)fireLaser 
{ 
    _laser = [SKSpriteNode spriteNodeWithImageNamed: [NSString stringWithFormat:@"blueLaser"]];; 
    _laser.zRotation = _spaceShip.zRotation; 
    CGVector rotationVector = RadiansToVector(_spaceShip.zRotation); 
    _laser.position = (Custom code for positioning the laser just in front of the spaceship); 

    _laser.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_laser.size]; 
    [_bgLayer addChild:_laser]; 

    _laser.physicsBody.velocity = CGVectorMake(rotationVector.dx * LASER_SPEED, rotationVector.dy * LASER_SPEED); 
} 

[self fireLaser] вызывается в touchhesBegan, когда затрагивается конкретный SpriteNode. Лазер стреляет красиво, но не прокручивает фон, а перемещается относительно космического корабля. Фоновые свитки с помощью PhysicalBody и метода setVelocity вызывается, когда движется джойстик, таким образом имитируя движение космического корабля, когда на самом деле космический корабль никогда не покидает центр экрана. Категории физики не позволяют фоновой физике не сталкиваться ни с чем. LASER_SPEED - это просто статический const float.

+0

Лазерный код @ 0x141E – wtivie05

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