Я изучаю и создаю с помощью Sprite Kits 2D-игры с момента их выпуска на ios7. Теперь у меня есть идея создать полностью загруженную гоночную игру с видом сверху, но я застрял на одном вопросе, как лучше всего подойти к созданию различных гоночных трасс. Изначально я думал, что просто создам гоночную трассу с помощью Tile Map (используя популярную программу Tiled), но потом понял, что, скорее всего, не смогу создать нужные мне закругленные углы трассы. Есть ли у кого-нибудь мысли о том, какой лучший подход для этого будет? Возможно, использование Tile Maps «является» лучшим подходом, но я упускаю ключевую функцию, касающуюся обработки обнаружения столкновений на закругленных углах.
Создайте гоночную трассу в Sprite Kit
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
Значит, физические тела нужно будет создавать вручную для каждой отдельной кривой/изгиба гоночной трассы? Я знаю, что могу создать подкласс этой функции для повторного использования на каждом уровне, но это по-прежнему означает, что мне нужно создавать эти кривые для каждой кривой/изгиба на каждой гоночной трассе.
- person Mike Simz; 16.04.2014
К сожалению, да. По крайней мере, так, как сейчас работает фреймворк. Вы можете нарисовать путь, используя bodyWithPolygonFromPath: но я думаю, что это будет сложнее стандартизировать в игре. Вам решать, каким путем идти.
- person sangony; 17.04.2014
Спасибо за помощь sangony - очень признателен!
- person Mike Simz; 24.04.2014
В итоге это сработало отлично. Используя PhysicsEditor в сочетании с Tiled, было довольно просто создавать различные физические тела, которые мне нужны!
- person Mike Simz; 07.08.2014