繁体   English   中英

SpriteKit - physicsBody不尊重边缘

[英]SpriteKit - physicsBody not respecting edge

我有这个对象,它有一个从路径创建的physicsBody。

整个场景区域(=整个屏幕)本身就是该对象不应该逃脱的边界。

此场景的边界由。定义

self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];

一切都像预期的那样有效。 物体在边缘碰撞并反弹,并且在大部分时间内被它们约束,但是如果你坚持几次,以高冲动向物体射击物体,物体将最终不尊重边缘并逃脱,可能是还有一个SpriteKit bug。

对象的类init是这样的:

self.physicsBody.dynamic = YES;

CGFloat offsetX = self.frame.size.width/2.0f;
CGFloat offsetY = self.frame.size.height/2.0f;

CGMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, NULL, 60 - offsetX, 79 - offsetY);
CGPathAddLineToPoint(path, NULL, 96 - offsetX, 69 - offsetY);
CGPathAddLineToPoint(path, NULL, 124 - offsetX, 44 - offsetY);
CGPathAddLineToPoint(path, NULL, 120 - offsetX, 23 - offsetY);
CGPathAddLineToPoint(path, NULL, 85 - offsetX, 0 - offsetY);
CGPathAddLineToPoint(path, NULL, 62 - offsetX, 3 - offsetY);
CGPathAddLineToPoint(path, NULL, 37 - offsetX, 19 - offsetY);
CGPathAddLineToPoint(path, NULL, 12 - offsetX, 29 - offsetY);
CGPathAddLineToPoint(path, NULL, 3 - offsetX, 39 - offsetY);
CGPathAddLineToPoint(path, NULL, 7 - offsetX, 58 - offsetY);
CGPathAddLineToPoint(path, NULL, 27 - offsetX, 46 - offsetY);
CGPathAddLineToPoint(path, NULL, 36 - offsetX, 61 - offsetY);

CGPathCloseSubpath(path);

self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
self.physicsBody.restitution = 0.0f;
self.physicsBody.usesPreciseCollisionDetection = YES;

我可以采取哪些措施来检测并防止物体离开屏幕?

谢谢。

我没有跟踪点,但看起来你有一个非凸多边形或一个顶点不跟随逆时针缠绕,或两者。 确保形状为凸面,顶点顺序(缠绕)按逆时针顺序排列。

如果此形状仅用于碰撞检测的静态(非移动)体,则可以使用bodyWithEdgeLoopbodyWithEdgeChain ,其中缠绕和凸起形状无关紧要。

PS:别忘了发布路径:

CGPathRelease(path);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM