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 ответа
Перемещение мира путем изменения его положения повлияет
- Дети с физическими телами
- Дети без физики тела
Перемещение мира с применением силы / импульса или с помощью настроек, его скорость будет влиять
- Дети без физики тела
Вместо того, чтобы перемещать мир, устанавливая его скорость, вы можете добавить камеру (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 - это просто статическое константное плавание.