Создайте гоночную трассу в Sprite Kit

Я изучаю и создаю с помощью Sprite Kits 2D-игры с момента их выпуска на ios7. Теперь у меня есть идея создать полностью загруженную гоночную игру с видом сверху, но я застрял на одном вопросе, как лучше всего подойти к созданию различных гоночных трасс. Изначально я думал, что просто создам гоночную трассу с помощью Tile Map (используя популярную программу Tiled), но потом понял, что, скорее всего, не смогу создать нужные мне закругленные углы трассы. Есть ли у кого-нибудь мысли о том, какой лучший подход для этого будет? Возможно, использование Tile Maps «является» лучшим подходом, но я упускаю ключевую функцию, касающуюся обработки обнаружения столкновений на закругленных углах.


person Mike Simz    schedule 16.04.2014    source источник
comment
Почему бы не создать базовые элементы трека и не объединить их динамически?   -  person AndrewShmig    schedule 21.04.2014


Ответы (1)


Создание фона с помощью Tiled, безусловно, будет проще и эффективнее, если вы планируете иметь несколько уровней.

В настоящее время вы можете создать физическое тело только с прямоугольником, кругом или многоугольником из пути. Я думаю, что самый простой и эффективный способ создать кривые — это использовать маленькие прямоугольники и наклонять их с равными шагами.

Если вы подклассируете это, вы можете легко повторно использовать свои кривые на каждом уровне.

На картинке я поворачиваю каждый прямоугольник еще на 10 градусов относительно предыдущего.

введите здесь описание изображения

Другой вариант — использовать bodyWithPolygonFromPath: и вспомогательный инструмент SKPhysicsBody Path Generator для создания пути к изображению. Результирующий код будет выглядеть примерно так:

SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"imageName.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, 398 - offsetX, 5 - offsetY);
 CGPathAddLineToPoint(path, NULL, 334 - offsetX, 4 - offsetY);
 CGPathAddLineToPoint(path, NULL, 274 - offsetX, 18 - offsetY);
 CGPathAddLineToPoint(path, NULL, 214 - offsetX, 40 - offsetY);
 CGPathAddLineToPoint(path, NULL, 161 - offsetX, 70 - offsetY);
 CGPathAddLineToPoint(path, NULL, 112 - offsetX, 109 - offsetY);
 CGPathAddLineToPoint(path, NULL, 74 - offsetX, 161 - offsetY);
 CGPathAddLineToPoint(path, NULL, 40 - offsetX, 211 - offsetY);
 CGPathAddLineToPoint(path, NULL, 19 - offsetX, 272 - offsetY);
 CGPathAddLineToPoint(path, NULL, 10 - offsetX, 336 - offsetY);
 CGPathAddLineToPoint(path, NULL, 8 - offsetX, 394 - offsetY);
 CGPathAddLineToPoint(path, NULL, 27 - offsetX, 395 - offsetY);
 CGPathAddLineToPoint(path, NULL, 26 - offsetX, 337 - offsetY);
 CGPathAddLineToPoint(path, NULL, 37 - offsetX, 276 - offsetY);
 CGPathAddLineToPoint(path, NULL, 57 - offsetX, 220 - offsetY);
 CGPathAddLineToPoint(path, NULL, 87 - offsetX, 168 - offsetY);
 CGPathAddLineToPoint(path, NULL, 124 - offsetX, 124 - offsetY);
 CGPathAddLineToPoint(path, NULL, 169 - offsetX, 85 - offsetY);
 CGPathAddLineToPoint(path, NULL, 222 - offsetX, 55 - offsetY);
 CGPathAddLineToPoint(path, NULL, 281 - offsetX, 34 - offsetY);
 CGPathAddLineToPoint(path, NULL, 339 - offsetX, 26 - offsetY);
 CGPathAddLineToPoint(path, NULL, 395 - offsetX, 25 - offsetY);

 CGPathCloseSubpath(path);

 sprite.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
person sangony    schedule 16.04.2014
comment
Значит, физические тела нужно будет создавать вручную для каждой отдельной кривой/изгиба гоночной трассы? Я знаю, что могу создать подкласс этой функции для повторного использования на каждом уровне, но это по-прежнему означает, что мне нужно создавать эти кривые для каждой кривой/изгиба на каждой гоночной трассе. - person Mike Simz; 16.04.2014
comment
К сожалению, да. По крайней мере, так, как сейчас работает фреймворк. Вы можете нарисовать путь, используя bodyWithPolygonFromPath: но я думаю, что это будет сложнее стандартизировать в игре. Вам решать, каким путем идти. - person sangony; 17.04.2014
comment
Спасибо за помощь sangony - очень признателен! - person Mike Simz; 24.04.2014
comment
В итоге это сработало отлично. Используя PhysicsEditor в сочетании с Tiled, было довольно просто создавать различные физические тела, которые мне нужны! - person Mike Simz; 07.08.2014