我在尝试将两个具有物理实体的 block 彼此叠放时遇到问题。
http://s1173.photobucket.com/user/Kyle_Decot/media/example_zps02f027fe.mp4.html
正如您在视频中看到的那样,我可以将我的积木放在堆叠的积木上,即使它们是相互叠放的。
玩家方 block 和其他方 block 都继承自一个基本的 Block 类,看起来像这样
#import "Block.h"
@implementation Block
+ (void)loadSharedAssets {
}
- (id)initWithColorUIColor *)color sizeCGSize)size {
self = [super initWithColor:color size:size];
if (self) {
self.texture = [SKTexture textureWithImageNamed"tile"];
self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize: self.size];
self.physicsBody.usesPreciseCollisionDetection = YES;
self.physicsBody.dynamic = NO;
}
return self;
}
@end
更新
我添加了一张图片以使问题更加清晰。本质上的问题是,即使蓝色 block 彼此正上方,我仍然能够跳起来(带红色 block )并坐在底部蓝色 block 的边缘(这应该是不可能的)。似乎有些东西与物理物体或其他东西有关。
您可以看到,由于某种原因,红色 block 略高于相邻的蓝色 block ,并且“坐在”底部蓝色 block 的边缘。当我跳起来反对它时。
Best Answer-推荐答案 strong>
编辑:用答案替换原来的建议
滚动到box2d documentation 的4.5 边缘形状部分你会找到原因(SpriteKit 在其物理实现中使用 Box2D)
In many cases a game environment is constructed by connect several edge shapes end-to-end. This can give rise to an unexpected artifact when a polygon slides along the chain of edges. In the figure below we see a box colliding with an internal vertex. These ghost collisions are caused when the polygon collides with an internal vertex generating an internal collision normal.
这里的两条边(edge1 和 edge2)是游戏中两个蓝色框的左侧边(所以想象一下它逆时针旋转了 90 次)
Box2D 引入了 ChainShapes 来解决这个问题(您可以在 5.6 Edge Shapes 部分找到引用。
这个想法是在同时生成多个盒子时用这些顶点链替换成组的方形物理体。
我相信您可以使用 bodyWithEdgeChainFromPath 在 SpriteKit 中访问这些内容。并传入一个核心图形路径,该路径由要组合的框的角点组成,以形成碰撞链
关于ios - 相邻的 SKPhysicsBody 无法正常工作,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/21734959/
|