2013-11-23 1 views
1

У меня есть SKSpriteNode самолета. Вот изображение (300px х 83px):SKPhysicsBody кажется слишком большим

An airplane

Изображение назван [email protected] в моей Xcode проекте.

Теперь я добавляю физики тела в самолете:

CGFloat offsetX = self.size.width * self.anchorPoint.x; 
CGFloat offsetY = self.size.height * self.anchorPoint.y; 

CGMutablePathRef path = CGPathCreateMutable(); 

CGPathMoveToPoint(path, NULL, 24 - offsetX, 124 - offsetY); 
CGPathAddLineToPoint(path, NULL, 24 - offsetX, 47 - offsetY); 
CGPathAddLineToPoint(path, NULL, 339 - offsetX, 1 - offsetY); 
CGPathAddLineToPoint(path, NULL, 401 - offsetX, 3 - offsetY); 
CGPathAddLineToPoint(path, NULL, 452 - offsetX, 52 - offsetY); 
CGPathAddLineToPoint(path, NULL, 411 - offsetX, 78 - offsetY); 
CGPathAddLineToPoint(path, NULL, 295 - offsetX, 78 - offsetY); 
CGPathAddLineToPoint(path, NULL, 268 - offsetX, 93 - offsetY); 
CGPathAddLineToPoint(path, NULL, 95 - offsetX, 78 - offsetY); 
CGPathAddLineToPoint(path, NULL, 62 - offsetX, 124 - offsetY); 

CGPathCloseSubpath(path); 

self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path]; 

CGPath порождается SKPhysicsBody Path Generator

Для отладки физики тела самолета я добавил SKShapeNode с такой же, как и для CGPath физика тела:

SKShapeNode *shape = [[SKShapeNode alloc] init]; 
shape.path = path; 
shape.strokeColor = [SKColor colorWithRed:1.0 green:0 blue:0 alpha:0.5]; 
[self addChild:shape]; 

Вот результат:

result

Я делаю что-то неправильно?

PS: Замечания интересной штуковины. Если я указываю CGPath следующим образом:

CGPathMoveToPoint(path, NULL, 24/3.0 - offsetX, 124/3.0 - offsetY); 
CGPathAddLineToPoint(path, NULL, 24/3.0 - offsetX, 47/3.0 - offsetY); 

форма подходит самолет хорошо!

+0

Вы создали форму с генератором, используя версию изображения @ 2x? Попробуйте использовать изображение «@ 2x» и убедитесь, что установлен флажок Retina. В общем, попробуйте различные варианты, чтобы увидеть, как это выглядит на устройствах Retina и non Retina. Хотя форма выглядит не так, как будто она 2x масштабируется, больше похожа на 3x или 4x. – LearnCocos2D

+0

Я использую изображение, которое я приложил. Это же изображение относится к проекту Xcode. Форма выглядит как 3-кратное масштабирование. –

ответ

1

Возможно, это не относится к делу, но ваша определенная форма concave. Документы говорят, что это должно быть convex. Если вы воссоздаете свой путь с выпуклой формой, это поможет?

enter image description here

Примеры: Convex and Concave polygons

+0

Не могли бы вы связать документ, где он говорит, что? Я уверен, что он сказал, что ВЫ МОЖЕТЕ использовать вогнутый, но что вы получите laggy gameplay – Andriko13

+0

А, ок. Может быть, моя ошибка. Из всего, что я прочитал, вы не можете создавать вогнутые SKPhysicsBodies, но вы можете присоединиться к выпуклым телам вместе, чтобы создать тело, которое выглядит вогнутым, но составлено из выпуклых форм. (Https://developer.apple.ком/библиотека/ИОС/документация/SpriteKit/Справка/SKPhysicsBody_Ref/index.html # // apple_ref/ОКК/CLM/SKPhysicsBody/bodyWithPolygonFromPath :). Где вы читали о «..get laggy gameplay ...»? – RichS

+0

Ну, лаггая часть была моей доской, так как, как вы сказали, она требует большей скорости обработки, так как вам нужно будет использовать более сложные выпуклые чапы. – Andriko13

0

Вы должны использовать исходные размеры (320 х 480) или в случае iPhone5 + (320 х 568). @ 2x/@ 4x изображения предназначены только для обеспечения изображений с более высоким разрешением для устройств сетчатки. Но для причин обратной совместимости все устройства по-прежнему используют одну и ту же систему координат.

Таким образом, ваш путь должен быть что-то вроде:

SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"jPfsF.png"]; 

CGFloat offsetX = sprite.frame.size.width * sprite.anchorPoint.x; 
CGFloat offsetY = sprite.frame.size.height * sprite.anchorPoint.y; 

CGMutablePathRef path = CGPathCreateMutable(); 

CGPathMoveToPoint(path, NULL, 18 - offsetX, 41 - offsetY); 
CGPathAddLineToPoint(path, NULL, 31 - offsetX, 25 - offsetY); 
CGPathAddLineToPoint(path, NULL, 91 - offsetX, 31 - offsetY); 
CGPathAddLineToPoint(path, NULL, 95 - offsetX, 24 - offsetY); 
CGPathAddLineToPoint(path, NULL, 136 - offsetX, 26 - offsetY); 
CGPathAddLineToPoint(path, NULL, 148 - offsetX, 18 - offsetY); 
CGPathAddLineToPoint(path, NULL, 133 - offsetX, 2 - offsetY); 
CGPathAddLineToPoint(path, NULL, 75 - offsetX, 1 - offsetY); 
CGPathAddLineToPoint(path, NULL, 9 - offsetX, 16 - offsetY); 
CGPathAddLineToPoint(path, NULL, 11 - offsetX, 40 - offsetY); 

CGPathCloseSubpath(path); 

sprite.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path]; 
0

Я предполагаю, что вам нужно вычислить точки, а не пикселей. Если у вас есть изображение @ 1x, то он будет иметь одинаковый размер в точках и пикселях. Для @ 2x у вас будет одинаковое количество точек, но двойное число пикселей и т. Д. Для @ 3x ...

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

  • Нет связанных вопросов^_^