Как создать путь для лабиринта с физическим телом в SpriteKit
Я хочу создать лабиринт для моей игры SpriteKit, но у меня проблемы с настройкой правильного физического тела. Взгляните на этот пример:
синий: CGPath
зеленый: лабиринт (ширина линии CGPath=10)
красный: физическое тело, которое я хочу создать
Я пытался нарисовать лабиринт с помощью CGPath и SKShapeNode, но как я могу настроить физическое тело для внутренних границ моего лабиринта?
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 38, 266);
CGPathAddLineToPoint(path, NULL, 37, 23);
CGPathAddLineToPoint(path, NULL, 127, 22);
CGPathAddLineToPoint(path, NULL, 127, 184);
CGPathAddLineToPoint(path, NULL, 273, 185);
CGPathAddLineToPoint(path, NULL, 273, 98);
CGPathAddLineToPoint(path, NULL, 274, 184);
CGPathAddLineToPoint(path, NULL, 127, 184);
CGPathAddLineToPoint(path, NULL, 127, 23);
CGPathAddLineToPoint(path, NULL, 364, 23);
CGPathAddLineToPoint(path, NULL, 364, 266);
CGPathCloseSubpath(path);
SKShapeNode *labyrinth = [SKShapeNode shapeNodeWithPath:path];
labyrinth = [SKColor greenColor];
labyrinth.lineWidth = 10;
[self addChild:labyrinth];
,
labyrinth.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromPath:path];
не работает. Мне нужна опция, чтобы включить ширину линии моего пути для тела физики.
Любые предложения или другие варианты для реализации лабиринта, как это?
3 ответа
Спасибо @primaryartemis! с вашим предложением я создал следующий код:
for (int i=0; i< [points_array count]-1; i++) {
// first point
CGPoint p1 = CGPointMake(points_array[i].x, points_array[i].y);
// second point
CGPoint p2 = CGPointMake(points_array[i+1].x, points_array[i+1].y);
// midpoint
CGPoint p3 = CGPointMake(p1.x-p2.x, p1.y-p2.y);
float angle = atanf(p3.y/p3.x);
NSInteger length = sqrt(p3.x*p3.x + p3.y*p3.y);
SKSpriteNode *frameElement = [SKSpriteNode spriteNodeWithColor:[SKColor yellowColor] size:CGSizeMake(length+10, 10)];
frameElement.zRotation = angle;
frameElement.position = CGPointMake(p1.x-p3.x/2, p1.y-p3.y/2);
frameElement.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:frameElement.size];
[self addChild:frameElement];
}
оно работает. Вот пример вывода: (красный цвет - физическое тело, синий - середина)
Рассматривали ли вы создание лабиринта из ритуалов?
Каждая стена лабиринта может быть прямоугольной формой или узлом спрайта, тогда вы будете использовать bodyWithRectangleOfSize: чтобы дать каждому узлу формы / спрайта физическое тело такого же размера, как и они сами.
Если вы не тратите часы на перевод своего кода, просто создайте тело с окончательным изображением из вашего SKShapeNode.
Ваш узел должен быть в представлении, так как вы будете использовать метод SKView с именем textureFromNode: следующим образом.
if(labyrinth.scene.view)
{
SKTexture *texture = [labyrinth.scene.view textureFromNode: labyrinth];
labyrinth.physicsBody = [SKPhysicsBody bodyWithTexture:texture alphaThreshold:0.0 size:texture.size];
labyrinth.physicsBody.dynamic = NO;
}