Sprite kit SpriteKit物理体多层碰撞
好的,我正在为一个太空爆炸机游戏编写代码,除了这些关键问题,一切似乎都进展顺利 首先,我添加了一艘宇宙飞船(带有PhysicsBody)作为自己的孩子(游戏场景) 然后我添加了一个背景层作为节点,也作为self的子节点,在飞船后面,通过操纵杆控制在飞船后面移动背景来模拟运动 我添加了一个带有边界物理边循环体的节点,这样背景就不会移动到飞船之外,并将该节点添加为bgLayer的子节点 我有飞船要拍摄的对象,但我希望它们能像背景一样四处移动,所以我把它们作为背景层的子对象添加了进去 当然,当宇宙飞船发射时,我需要一个激光器,所以我添加了这个以及bgLayer的子项Sprite kit SpriteKit物理体多层碰撞,sprite-kit,collision-detection,layer,skphysicsbody,Sprite Kit,Collision Detection,Layer,Skphysicsbody,好的,我正在为一个太空爆炸机游戏编写代码,除了这些关键问题,一切似乎都进展顺利 首先,我添加了一艘宇宙飞船(带有PhysicsBody)作为自己的孩子(游戏场景) 然后我添加了一个背景层作为节点,也作为self的子节点,在飞船后面,通过操纵杆控制在飞船后面移动背景来模拟运动 我添加了一个带有边界物理边循环体的节点,这样背景就不会移动到飞船之外,并将该节点添加为bgLayer的子节点 我有飞船要拍摄的对象,但我希望它们能像背景一样四处移动,所以我把它们作为背景层的子对象添加了进去 当然,当宇宙飞船
一切都很好,背景不会移动到宇宙飞船之外,其他物体会随着背景的移动而移动,激光会在被召唤时发射 我的第一个大难题是,当我的激光发射时,它不会随着背景的移动而移动,而是背景在它后面移动。我也许可以凑合,但如果激光总是与飞船平行移动,那看起来很有趣。这对我来说似乎很奇怪,因为我是bgLayer的孩子时加入了激光 第二,我的激光物理身体似乎无法识别EdgeLoop身体,并一直航行通过它。此外,我的宇宙飞船的physicsBody似乎能识别EdgeLoop天体,但它不能识别属于_bgLayer的其他物体 不是同一层的子物理体相互识别吗?
为什么我的激光与同一层的其他孩子的行为不一样呢?通过改变位置来移动世界会影响
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);
}
[自燃激光]在触摸中被称为当触摸特定的SpriteNode时开始。
激光发射得很漂亮,但不随背景滚动,而是相对于宇宙飞船移动。背景与PhysicsBody一起滚动,当操纵杆移动时调用setVelocity方法,从而模拟宇宙飞船的运动,而实际上宇宙飞船从未离开屏幕中心。物理类别防止背景物理体与任何物体碰撞。激光速度只是一个静态常数浮点。物理引擎中没有层。每个场景有一个物理世界。您只需设置碰撞类别之类的内容,并确保设置所有定义对象是否以及如何参与物理的内容。我很抱歉没有在我的编码示例中添加此内容,但我确实为它们设置了类别和碰撞位掩码,但是激光器似乎忽略了这些设置。我很抱歉没有在我的编码示例中添加这些设置,但我确实使用了setVelocity方法设置了激光器的运动。我的激光确实与我提到的其他物体相互作用,但与edgeLoop没有相互作用。你最后的评论引起了我的兴趣。我可以简单地从激光矢量的dx和dy中减去背景矢量的dx和dy吗?实际上,如果你把激光添加到世界节点,它应该可以适当地移动而不需要任何调整。我也是这么想的。但是,它仍然相对于场景而不是bgLayer节点移动。激光是像子弹还是像光流(即线)?我用项目符号实现了一个滚动背景,当我滚动背景图像时,项目符号会正确移动。例如,如果我在背景图像中向一个目标射击,无论我滚动背景多少次,子弹都会朝着该目标移动。它更像一颗子弹。给我一分钟,我会发布我的激光代码。
-(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);
}