Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SpriteKit-身体不尊重边缘_Ios_Iphone_Ipad_Sprite Kit - Fatal编程技术网

Ios SpriteKit-身体不尊重边缘

Ios SpriteKit-身体不尊重边缘,ios,iphone,ipad,sprite-kit,Ios,Iphone,Ipad,Sprite Kit,我有一个从路径创建的physicsBody对象 整个场景区域(=整个屏幕)本身是该对象不应逃逸的边界 此场景的边界由定义 self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame]; 一切正常。对象在边缘上碰撞和反弹,并且大部分时间受到边缘的约束,但是如果您坚持几次,以高脉冲向边缘发射对象,对象最终将不尊重边缘并逃逸,这可能是另一个SpriteKit错误 对象的类init如下所示: self.physicsBod

我有一个从路径创建的physicsBody对象

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

此场景的边界由定义

self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
一切正常。对象在边缘上碰撞和反弹,并且大部分时间受到边缘的约束,但是如果您坚持几次,以高脉冲向边缘发射对象,对象最终将不尊重边缘并逃逸,这可能是另一个SpriteKit错误

对象的类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;
我可以采取什么措施来检测并防止对象离开屏幕


谢谢。

我没有追踪这些点,但看起来有一个或一个顶点不遵循逆时针方向缠绕,或者两者都有。确保形状为凸面,且顶点顺序(缠绕)为逆时针顺序

如果此形状仅用于碰撞检测的静态(非移动)车身,则可以使用
BodyWithEdgeLop
bodyWithEdgeChain
,其中缠绕和凸面形状无关紧要

注意:不要忘记释放路径:

CGPathRelease(path);

bodyWithEdgeLoop
bodyWithEdgeChain
之间有什么区别?我用PolygonFromPath替换了bodyWithEdgeLoop和其他2个,对象停止移动。完全不受重力或力的影响。就像我说的,如果身体是静态的(非移动的,不受重力或接触的影响),你可以使用边/链方法,否则你必须确保多边形设置正确,才能使用BodyWithPolygonFromPath你是对的!!!!!!!!!!!问题是形状不是凸的!!!!谢谢。你能解决这个问题吗?我在圆体和边上遇到了类似的问题。在尝试施加一些力后,物体从边缘逃脱,再也无法回到屏幕上。。。不确定是否真的是Spritek是bug是的但这不适用于我的情况。我有一个圆形的物理体,问题还在发生…@Khanh SpriteKit是一辆该死的马车。六个月前,我为SpriteKit直接向苹果公司提交了15份bug报告,但苹果公司对此毫不在乎。但是另一个物体的碰撞形状呢?是的,我同意。我只有2个基于多边形的形状,我肯定已经遵循了指导原则。最后,我有一个小补丁来检查它是否已经到达边缘,然后取消速度…如果圆的形状给你带来了问题,试着创建一个类似于圆的形状,看看会发生什么。