Утверждение не удалось при использовании bodyWithPolygonFromPath: метод для формы яйца

Я моделирую физику для узла SKSprite в форме яйца. Однако возникает ошибка утверждения:

Ошибка утверждения: (edge.LengthSquared() > 1.19209290e-7F * 1.19209290e-7F), набор функций, файл /SourceCache/PhysicsKit_Sim/PhysicsKit-6.5.4/PhysicsKit/Box2D/Collision/Shapes/b2PolygonShape.cpp, строка 180 .

следующий код:

self.egg = [SKSpriteNode spriteNodeWithImageNamed:IMAGE_NAME_EGG];
    [self.egg setScale:0.2];
    self.egg.position = CGPointMake(self.size.width/2,self.size.height - self.egg.size.height/2);
    self.egg.name = IMAGE_NAME_EGG;

    CGPoint startPoint = CGPointMake(0, self.egg.size.height*0.4);
    CGPoint endPoint = CGPointMake(self.egg.size.width, startPoint.y);
    CGPoint controlPointLeft = CGPointMake(startPoint.x, self.egg.size.height);
    CGPoint controlPointRight = CGPointMake(endPoint.x, controlPointLeft.y);


    CGMutablePathRef pathRef = CGPathCreateMutable();        
    CGPathMoveToPoint(pathRef, NULL, startPoint.x, startPoint.y);
    CGPathAddQuadCurveToPoint(pathRef, NULL, controlPointLeft.x, controlPointLeft.y, self.egg.size.width/2, controlPointLeft.y);
    CGPathAddQuadCurveToPoint(pathRef, NULL, controlPointRight.x, controlPointRight.y, endPoint.x,endPoint.y);
    CGPathAddArc(pathRef, NULL, self.egg.size.width/2, startPoint.y, self.egg.size.width/2, 0, M_PI, NO);

    self.egg.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:pathRef];
    self.egg.physicsBody.dynamic = YES;
    self.egg.physicsBody.categoryBitMask = eggCategory;
    self.egg.physicsBody.contactTestBitMask = rabbitCategory;
    self.egg.physicsBody.collisionBitMask = rabbitCategory;
    self.egg.physicsBody.allowsRotation = YES;
    [self addChild:self.egg];

Что не так? может ли кто-нибудь помочь мне исправить? большое спасибо!


person Steve Lai    schedule 24.03.2014    source источник


Ответы (3)


Согласно утверждению, одно из ребер короче минимального размера, ожидаемого набором спрайтов.

Assertion failed: (edge.LengthSquared() > 1.19209290e-7F * 1.19209290e-7F)

Проверьте координаты пути и убедитесь, что он не слишком мал.

person Sam    schedule 24.03.2014

когда вы используете « bodyWithPolygonFromPath: », вы должны убедиться, что путь соответствует следующим условиям:

1). выпуклый многоугольный путь 2). обмотка против часовой стрелки 3). нет самопересечений. //Точки указываются относительно происхождения узла-владельца.

вы можете найти его в справочнике по применению класса для SKPhysicsBody здесь: https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKPhysicsBody_Ref/Reference/Reference.html#//apple_ref/occ/clm/SKPhysicsBody/bodyWithPolygonFromPath:

person walaa    schedule 31.03.2014

У меня была эта ошибка на более старом iPhone iOS7 при попытке сделать треугольный путь. Оказывается, добавление последней строки для возврата пути к начальной точке привело к ошибке (хотя более новые версии iOS это позволяют). IE:

CGPathMoveToPoint(path, nil, self.size.width/2, self.size.height/2)
CGPathAddLineToPoint(path, nil, -self.size.width/2, 0.0)
CGPathAddLineToPoint(path, nil, self.size.width/2, -self.size.height/2)
CGPathAddLineToPoint(path, nil, self.size.width/2, self.size.height/2) //REMOVED THIS LINE TO FIX
CGPathCloseSubpath(path)

Это объясняет, почему было слишком маленькое ребро для оценки — ребро между двумя одинаковыми точками равно 0!

person mikewagz    schedule 31.12.2014
comment
Причина краха в том, что яйцо не яйцо; это форма полумесяца. Если OP изменит NO на YES в вызове CGPathAddArc, это будет яйцо, и приложение не упадет. - person 0x141E; 31.12.2014