2014-02-02 4 views
0

Я пытаюсь инициализировать SKPhysicsBody с помощью Polygon от CGPath. Подразумевается выглядеть следующим образом: star polygonSpriteKit: ошибка polygon физики

Мой код CGPath настроен так:

-(CGPathRef)GetStarPath{ 



    //Draw Object 1 
    { 
     //Create Path 
     CGMutablePathRef path = CGPathCreateMutable(); 
     CGPoint pos = CGPointMake(177, 184.42); //Center Position 
     CGAffineTransform trans = CGAffineTransformMake(1, 0, 0, 1, pos.x, pos.y); //Transform of object 
     { //SubPath 0 
      CGFloat d[] = {-3.0518e-05,-14.924,-3.0518e-05,-14.924,4.8492,-5.0988,4.8492,-5.0988, 4.8492,-5.0988,4.8492,-5.0988,15.692,-3.5232,15.692,-3.5232, 15.692,-3.5232,15.692,-3.5232,7.8462,4.125,7.8462,4.125, 7.8462,4.125,7.8462,4.125,9.6983,14.924,9.6983,14.924, 9.6983,14.924,9.6983,14.924,-9.1553e-05,9.8256,-9.1553e-05,9.8256, -9.1553e-05,9.8256,-9.1553e-05,9.8256,-9.6986,14.924,-9.6986,14.924, -9.6986,14.924,-9.6986,14.924,-7.8463,4.1249,-7.8463,4.1249, -7.8463,4.1249,-7.8463,4.1249,-15.692,-3.5234,-15.692,-3.5234, -15.692,-3.5234,-15.692,-3.5234,-4.8492,-5.0989,-4.8492,-5.0989, -4.8492,-5.0989,-4.8492,-5.0989,-3.0518e-05,-14.924,-3.0518e-05,-14.924 }; 
      CGPathMoveToPoint(path, &trans, d[0], d[1]); 
      for(int i=0; i<10; i++) 
      { 
       CGPathAddCurveToPoint(path, &trans, d[i*8+2], d[i*8+3], d[i*8+4], d[i*8+5], d[i*8+6], d[i*8+7]); 
      } 
      CGPathCloseSubpath(path); 
     } 

     return path; 
    } 



} 

Но Xcode бросает некоторые странные исключения:

Утверждение не удалось: (edge.LengthSquared()> 1.19209290e-7F * 1.19209290e-7F), функция Set, file /SourceCache/PhysicsKit/PhysicsKit-4.6/PhysicsKit/Box2D/Collision/Shapes/b2PolygonShape.cpp, строка 176.

(исключение точки останова останавливается на [SKPhysicsBody bodyWithPolygonFromPath:star_path];)

Любая помощь оценили.

ответ

2

Прежде всего, в сообщении об ошибке Box2d указано, что одно из ваших измерений просто слишком мало для обработки.

Во-вторых, создание тела в форме звезды приведет к неожиданному поведению - как указано в documentation, bodyWithPolygonFromPath: будет принимать только выпуклые пути для полигонов (без углов на 180 градусов внутри полигона - ваша звезда имеет 5 из них). Он также не должен иметь самопересечений, и ожидается, что обмотка будет направлена ​​против часовой стрелки.

Если звезды достаточно малы, вы можете попробовать использовать круговое физическое тело (bodyWithCircleOfRadius:) под приближением. Если вы настаиваете на том, чтобы иметь звездный объект, вы можете попробовать добавить несколько физических тел в качестве детей к одному узлу, чтобы иметь звездное тело: один пятиугольник и 5 треугольников, прикрепленных к нему.

+0

все в порядке, спасибо. Является ли это общим ограничением в физическом двигателе? – mutex36

+0

Это, по сути, ограничения, специфичные для Box2d, который интегрирован в комплект Sprite (хотя Box2d имеет более жесткое ограничение на 8 вершин на полигон, насколько я помню). – Batalia

Смежные вопросы