SpriteKit物理体在多层中的碰撞

时间:2014-12-16 02:36:13

标签: sprite-kit collision-detection layer skphysicsbody

好吧,所以我正在编写一个太空爆炸游戏的代码,所有这些似乎都很顺利,减去这些关键问题。

首先,我添加了一艘宇宙飞船(使用PhysicsBody)作为自我的孩子(GameScene)。

然后我添加了一个背景图层作为一个节点,也作为一个自我的孩子,在太空船后面,并通过操纵杆控制在太空船后面移动背景来模拟运动。

我添加了一个带有边界物理边缘循环体的节点,因此背景不会移动到船外,并将该节点添加为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 个答案:

答案 0 :(得分:0)

通过改变其位置来移动世界将会影响

  1. 有物理团体的儿童
  2. 没有物理机构的儿童
  3. 通过施加力/冲动或通过设置移动世界其速度将影响

    1. 没有物理机构的儿童
    2. 不是通过设置速度来移动世界,而是可以向世界添加相机(带物理主体的SKNode),通过设置速度移动相机,然后更新世界的位置使相机居中。您可以使用didFinishUpdate方法对相机进行居中。

答案 1 :(得分: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);  
}
当触摸特定的SpriteNode时,在touchesBegan中调用

[self fireLaser]。 激光射击精美,但不会随背景滚动,而是相对于宇宙飞船而言。当操纵杆移动时,调用具有PhysicsBody和setVelocity方法的背景滚动,从而模拟太空飞船运动,而实际上太空船永远不会离开屏幕的中心。物理类别可防止背景物理主体与任何物体发生碰撞。 LASER_SPEED只是一个静态const浮点数。