SpriteKit Физические столкновения тел в нескольких слоях

Итак, я пишу код для игры Space Blaster, и кажется, что все идет хорошо, за исключением этих важных вопросов.

Во-первых, я добавил космический корабль (с PhysicsBody), как дитя себя (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.

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

2 ответа

Решение

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

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

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

  1. Дети без физики тела

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

-(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] вызывается в touchesBegan при касании определенного SpriteNode. Лазер красиво стреляет, но не прокручивается на фоне, а движется относительно космического корабля. Фоновая прокрутка с помощью PhysicsBody и метода setVelocity вызывается при перемещении джойстика, имитируя движение космического корабля, когда в действительности космический корабль никогда не покидает центр экрана. Физические категории не позволяют фоновому физическому телу сталкиваться с чем-либо. LASER_SPEED - это просто статическое константное плавание.

Другие вопросы по тегам