好吧,所以我正在编写一个太空爆炸游戏的代码,所有这些似乎都很顺利,减去这些关键问题。
首先,我添加了一艘宇宙飞船(使用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的其他物体。
不是同一层儿童的物理实体是否相互认可? 为什么我的激光表现不像同一层的其他孩子?
答案 0 :(得分:0)
通过改变其位置来移动世界将会影响
通过施加力/冲动或通过设置移动世界其速度将影响
不是通过设置速度来移动世界,而是可以向世界添加相机(带物理主体的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浮点数。