SKPhysicsBodies 之间的碰撞被忽略

Posted

技术标签:

【中文标题】SKPhysicsBodies 之间的碰撞被忽略【英文标题】:Collisions between SKPhysicsBodies being ignored 【发布时间】:2014-04-07 16:46:48 【问题描述】:

我在我的应用中使用 sprite kit 进行物理和碰撞检测。

我有一些球掉进了一个盒子里。盒子的内部是使用 bodyWithPolygonFromPath 定义的

我把一些球扔进盒子里,它们直接掉了下来。

这是定义盒子的代码

SKSpriteNode* boxFront = [SKSpriteNode spriteNodeWithImageNamed: [boxData objectForKey: @"box_image"]];
boxFront.position = CGPointMake(0, -screenHeight*0.22);
boxFront.zPosition = 10;
[self addChild: boxFront];

CGFloat offsetX = boxFront.frame.size.width * boxFront.anchorPoint.x;
CGFloat offsetY = boxFront.frame.size.height * boxFront.anchorPoint.y;

CGMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, NULL, 3 - offsetX, 129 - offsetY);
CGPathAddLineToPoint(path, NULL, 0 - offsetX, 129 - offsetY);
CGPathAddLineToPoint(path, NULL, 0 - offsetX, 85 - offsetY);
CGPathAddLineToPoint(path, NULL, 200 - offsetX, 85 - offsetY);
CGPathAddLineToPoint(path, NULL, 200 - offsetX, 129 - offsetY);
CGPathAddLineToPoint(path, NULL, 197 - offsetX, 129 - offsetY);
CGPathAddLineToPoint(path, NULL, 196 - offsetX, 87 - offsetY);
CGPathAddLineToPoint(path, NULL, 3 - offsetX, 87 - offsetY);

CGPathCloseSubpath(path);

boxFront.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
boxFront.physicsBody.dynamic = NO;

SKShapeNode* shape = [[SKShapeNode alloc] init];
shape.path = path;
shape.strokeColor = [UIColor redColor];
shape.zPosition = 101;
shape.lineWidth = 2;
[boxFront addChild: shape];

SKShapeNode 的最后一位只是为了调试目的绘制了框的轮廓。绘制的框是我期望碰撞框所在的位置。

这是我放入盒子中的球的代码。

SKSpriteNode* circle1 = [SKSpriteNode spriteNodeWithImageNamed: @"ball.png"];
circle1.position = CGPointMake(0, screenHeight*0.7);
circle1.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius: 20];
circle1.zPosition = 100;
[self addChild: circle1];

SKSpriteNode* circle2 = [SKSpriteNode spriteNodeWithImageNamed: @"ball.png"];
circle2.position = CGPointMake(-10, screenHeight);
circle2.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius: 20];
circle2.zPosition = 100;
[self addChild: circle2];

上面所有的self实例到sn-ps的代码都是同一个SKNode,直接附加到SKScene。

关于什么可能导致碰撞检测被忽略的任何建议?

【问题讨论】:

你在哪里添加 boxFront 到场景中? 对不起,我忘了添加那行,因为我可以在屏幕上看到图像,所以肯定会添加它。我将编辑以添加它。 设置physicsBody后尝试添加 我刚试过,好像没什么区别。 尝试使用 bodyWithEdgeLoopF​​romPath 而不是 bodyWithPolygonFromPath 【参考方案1】:

我没有看到您为您的盒子或球声明 physicsBody.categoryBitMaskphysicsBody.collisionBitMask 属性。如果您不为您的对象定义这些,您的代码将不知道哪些物理实体应该相互交互。

【讨论】:

根据 Apple 文档,默认值应该是与所有内容发生冲突。无论如何,我尝试设置它们只是以防万一,但没有任何区别。

以上是关于SKPhysicsBodies 之间的碰撞被忽略的主要内容,如果未能解决你的问题,请参考以下文章

忽略模型本身之间的碰撞

为啥扫描测试忽略碰撞(阅读编辑)?

在unity3d(2d)中碰撞后忽略物理

使用ansys workbench 的LSDYNA模块研究碰撞的接触设置

[小巩u3d] u3d基础知识

斯威夫特:分数增加两次,因为碰撞被检测到两次?