当前位置: 首页 > 知识库问答 >
问题:

精灵套件中的碰撞检测

南宫书
2023-03-14

我正在使用Sprite Kit中的碰撞检测。它在起作用,防止我的精灵穿越路径。然而,我在didBeginContact中没有收到通知:而且我似乎无法控制物理引擎在发生碰撞时的响应。

我让各种汽车(SKSpriteNodes)使用SKAction followPath沿着以下路径行驶:as offset:oriento path:duration:

以前,如果两辆车相交,它们都会像往常一样继续行驶,一辆车越过另一辆车。为了实现冲突检测,我做了以下更改…

将此添加到我的@界面:

<SKPhysicsContactDelegate>

将此添加到我的@implementation:

static const uint32_t carCategory = 0x1 << 0;

在我的初始化方法中添加了这个:

self.physicsWorld.contactDelegate = self;
self.physicsWorld.gravity = CGVectorMake(0.0, 0.0);

我创造了我的蓝色汽车:

- (void)addBlueCar
{
    _blueCar = [SKSpriteNode spriteNodeWithImageNamed:@"Blue Car.png"];
    _blueCar.position = CGPointMake(818.0, -50.0);
    _blueCar.name = @"car";
    [self addChild:_blueCar];

    CGSize contactSize = CGSizeMake(_blueCar.size.width - 5.0, _blueCar.size.height - 5.0);
    _blueCar.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:contactSize];
    _blueCar.physicsBody.categoryBitMask = carCategory;
    _blueCar.physicsBody.collisionBitMask = carCategory;
    _blueCar.physicsBody.contactTestBitMask = carCategory;
}

我还创造了一辆红色汽车:

- (void)addRedCar
{
    _redCar = [SKSpriteNode spriteNodeWithImageNamed:@"Red Car.png"];
    _redCar = CGPointMake(818.0, -50.0);
    _redCar = @"car";
    [self addChild: _redCar];

    CGSize contactSize = CGSizeMake(_blueCar.size.width - 5.0, _blueCar.size.height - 5.0);
    _redCar.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:contactSize];
    _redCar.physicsBody.categoryBitMask = carCategory;
    _redCar.physicsBody.collisionBitMask = carCategory;
    _redCar.physicsBody.contactTestBitMask = carCategory;
}

还有其他车,但我只是用这两辆,直到我弄清楚问题所在。我想在任何两辆车发生碰撞时得到通知。这就是为什么我只使用一个类别,汽车类别。

第一个问题是我没有收到任何通知。我有这个,但它从不将任何内容记录到控制台:

- (void)didBeginContact:(SKPhysicsContact *)contact
{
    NSLog(@"Contact");
}

第二个问题是,当两辆车穿过道路时,它们开始互相推离路线。这没关系,但我似乎无法管理如何处理碰撞的任何方面。奇怪的是,当我对我的两种造车方法都这样做时,什么都没有改变:

- (void)addBlueCar
{
    _blueCar = [SKSpriteNode spriteNodeWithImageNamed:@"Blue Car.png"];
    _blueCar.position = CGPointMake(818.0, -50.0);
    _blueCar.name = @"car";
    [self addChild:_blueCar];

    CGSize contactSize = CGSizeMake(_blueCar.size.width - 5.0, _blueCar.size.height - 5.0);
    _blueCar.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:contactSize];
//    _blueCar.physicsBody.categoryBitMask = carCategory;
//    _blueCar.physicsBody.collisionBitMask = carCategory;
//    _blueCar.physicsBody.contactTestBitMask = carCategory;
}

碰撞检测仍然与两辆车注释掉的那三行相同。这对我来说似乎不对。只有当我也注释掉这一行时,碰撞检测才会停止:

    _blueCar.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:contactSize];

所以我的主要问题是:为什么contactTest没有报告任何内容?我的第二个问题是:为什么当我没有为任何汽车指定类别BitMask、collisionBitMasb或contactTestBitMask时,会发生碰撞检测?

共有3个答案

锺星洲
2023-03-14

这对我有帮助:碰撞和接触是不同的事情。

碰撞由物理引擎处理,设置碰撞BitMask将决定物理世界中哪些物体相互碰撞和交互。默认情况下,你所有的身体都会相互碰撞,这有点道理。

接触是事件——当身体接触时,它们会创建一个通知,你可以在委托方法中使用它来做更有趣的事情。如果你有一个球,你想用桨打,你希望他们至少碰撞。但是如果你有一个球在云中移动,你可能不希望他们在物理世界中碰撞,但是你可能想注册这个联系人。

凤凡
2023-03-14

只是一个小观察,也许你应该设置你的节点,并在场景的didMoveToView方法中设置contact代理。

如果这不能解决它,你有没有机会将一些工作代码发布到github进行调试?

康文昌
2023-03-14

< code>collisionBitMask的默认值是0xFFFFFFFF(所有位置位)。因此,节点将与场景中的每个< code >物理实体发生碰撞。

 类似资料:
  • 我已经寻找并找到了单个碰撞的答案,但我正在寻找一种检测多种类型的碰撞的方法。我正在制作一个游戏,其中有3个我想要的碰撞。用户飞机与敌方子弹相撞,用户子弹与敌机相撞(我已经工作过),敌方子弹与用户子弹相撞。我已经设置并更正了所有类别BitMask和contactTestBitMask。这是我的委托方法。

  • 我是IOS开发的新手,目前在didBeginContact方法中遇到一些sprite工具包冲突问题。 如果一个碰撞的物理物体被移走了,我如何摆脱或者停止didBeginContact的运行?例:一颗子弹与两个重叠的敌人相撞。因为子弹击中第一个敌人并被摧毁,所以在第二个敌人上运行的碰撞检查抛出异常,因为子弹不再存在。 我试过检查nil和NSNULL值,但运气不好。我收到的错误代码是“线程1:EXC_

  • 在开始学习相关知识点之前,我们有必要先学习精灵和碰撞检测的含义。 精灵(英文译为 Sprite),其实在一个游戏程序中,精灵本质指的是一张张小尺寸的图片,比如游戏中的各种道具、人物、场景装饰等,它们都可以看做成一张张小的“精灵”图。除此之外,人物的移动也可以看做是一系列小精灵图构成的序列(按帧组成的序列),如下图所示: 图1:动作逐帧分解图 如果将逐帧分解后的动作,按照一定的频率播放,那么就形成了

  • 我的游戏有两个职业,它们都产生精灵,唯一的区别是它们的精灵向不同的方向移动。 然而,我如何检测另一个类的精灵是否与这个类碰撞,两个类都产生了很多精灵。我的想法是也使用池为每个精灵创建一个矩形。

  • 这就是正在发生的事情,游戏不断停止,因为两个圆圈相互碰撞,我正在尝试通过确保ID是正方形ID来防止这种情况,我试图让圆圈碰撞在一起,而忽略碰撞,但它没有这样做,我不知道如何确切地阻止它相互碰撞,只允许它与正方形碰撞。 基本上我想阻止这个圆与另一个圆碰撞,并允许它与正方形碰撞。 任何帮助都会很好谢谢 游戏引擎引擎类 这是我在扩展game.engine.engine包的game类中检查冲突的地方。 游

  • 使用< code >加速计,我的精灵图像会左右移动,如果我触摸屏幕,精灵会移动到Y轴。我想在不同的精灵之间进行碰撞检测,这样如果精灵穿过一个物体,它就会停下来藏在那个物体里。我已经看了这个https://www.youtube.com/watch?v=T1aN-vTqLc的教程,但什么也没发生。进行碰撞检测的正确方法是什么?我不知道我的编码有什么问题。任何建议或更好的教程谢谢和进步 这是我的编码