Sprite kit SpriteKit物理体多层碰撞

Sprite kit SpriteKit物理体多层碰撞,sprite-kit,collision-detection,layer,skphysicsbody,Sprite Kit,Collision Detection,Layer,Skphysicsbody,好的,我正在为一个太空爆炸机游戏编写代码,除了这些关键问题,一切似乎都进展顺利 首先,我添加了一艘宇宙飞船(带有PhysicsBody)作为自己的孩子(游戏场景) 然后我添加了一个背景层作为节点,也作为self的子节点,在飞船后面,通过操纵杆控制在飞船后面移动背景来模拟运动 我添加了一个带有边界物理边循环体的节点,这样背景就不会移动到飞船之外,并将该节点添加为bgLayer的子节点 我有飞船要拍摄的对象,但我希望它们能像背景一样四处移动,所以我把它们作为背景层的子对象添加了进去 当然,当宇宙飞船

好的,我正在为一个太空爆炸机游戏编写代码,除了这些关键问题,一切似乎都进展顺利

首先,我添加了一艘宇宙飞船(带有PhysicsBody)作为自己的孩子(游戏场景)

然后我添加了一个背景层作为节点,也作为self的子节点,在飞船后面,通过操纵杆控制在飞船后面移动背景来模拟运动

我添加了一个带有边界物理边循环体的节点,这样背景就不会移动到飞船之外,并将该节点添加为bgLayer的子节点

我有飞船要拍摄的对象,但我希望它们能像背景一样四处移动,所以我把它们作为背景层的子对象添加了进去

当然,当宇宙飞船发射时,我需要一个激光器,所以我添加了这个以及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);  
    }