![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Nov 2009
Сообщений: 300
|
Нужно сделать змейку, чтобы она работала по принципу паровоза - за головой идут остальные звенья - как вагоны паровоза.
Алгоритм я придумал такой: 1. Поворачиваем голову на заданный угол 2. Двигаем голову на N пикселей 3. Поворачиваем следующее звено в сторону предыдущего 4. Двигаем это звено на N пикселей Повторяем 3,4 пункты для остальных звеньев. Но так как с геометрией/тригонометрией/алгеброй туго, алгоритм работает не так как задумано, и звенья при повороте, постепенно сбиваются в кучу. Подскажите пожалуйста правильный алгоритм. Код главного класса: public class Snake extends Sprite { public var dir:int = 0;//Направление головы змейки private var speed:int = 2;//Скорость змейки private var speedX:Number;//Скорость по x private var speedY:Number;//Скорость по y private var piecesNum:int = 5;//Количество звеньев змейки private var pieces:Array = [];//Массив для звеньев private const PI:Number = Math.PI;//Чтобы быстрее обращаться к PI public function Snake():void { for (var i:int = 0; i < piecesNum; i++) { pieces[i] = new Link(400 + i * 16, 200);//Добавляем части змейки addChild(pieces[i]); } stage.addEventListener(KeyboardEvent.KEY_DOWN, onKDown); addEventListener(Event.ENTER_FRAME, loop); } private function onKDown(e:KeyboardEvent):void { //Поворачиваем голову змейки switch (e.keyCode) { case 40: pieces[0].rotation += 15; break; case 38: pieces[0].rotation -= 15; break; } } private function loop(e:Event):void { speedX = Math.cos(pieces[0].rotation/180*PI) * speed;//Вычисляем на сколько передвигать голову по x speedY = Math.sin(pieces[0].rotation/180*PI) * speed;//Вычисляем на сколько передвигать голову по y pieces[0].x -= speedX;//Передвигаем голову по x pieces[0].y -= speedY;//Передвигаем голову по y //Пытаемся двигать остальные звенья за головой for (var i:int = 1; i < piecesNum; i++) { pieces[i].rotation = Math.atan2(pieces[i-1].y - pieces[i].y, pieces[i-1].x - pieces[i].x) * (180 / PI) + 180;//Вычисляем угол между текущим звеном и предыдущим, и поворачиваем текущее звено на этот угол speedX = Math.cos(pieces[i].rotation/180*PI) * speed;//Вычисляем на сколько передвигать текущее звено по x speedY = Math.sin(pieces[i].rotation/180*PI) * speed;//Вычисляем на сколько передвигать текущее звено по y pieces[i].x -= speedX;//Передвигаем текущее звено по x pieces[i].y -= speedY;//Передвигаем текущее звено по y } } } public function Link(_x:int, _y:int) { x = _x; y = _y; graphics.lineStyle(10, 0x75C525, 1, false, "normal", "none"); graphics.lineTo( -16, 0); } http://megaswf.com/serve/1292233 Клавишами вверх/вниз, меняем направление. Красные точки - это центр звена. И на всякий случай, проект во вложении. |
|
|||||
|
Высчитываем новые параметры головы, старые отдаем 2 звену из него старые 3ему, и так далее.
Вообще можно сделать односторонний список и по нему спускаться до хвоста.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. Последний раз редактировалось GBee; 16.11.2011 в 10:27. |
|
|||||
|
Регистрация: Mar 2006
Адрес: Ростов-на-Дону
Сообщений: 80
|
почему скорость звена константа, когда в поворотах она далжна быть разная для каждого из них. грубо говоря скорость звена - расстояние между звеньями минус длина звена.
//Пытаемся двигать остальные звенья за головой for (var i:int = 1; i < piecesNum; i++) { pieces[i].rotation = Math.atan2(pieces[i-1].y - pieces[i].y, pieces[i-1].x - pieces[i].x) * (180 / PI) + 180;//Вычисляем угол между текущим звеном и предыдущим, и поворачиваем текущее звено на этот угол var v:Point = new Point(pieces[i-1].x - pieces[i].x, pieces[i-1].y - pieces[i].y); var s:Number = v.length - 16; speedX = Math.cos(pieces[i].rotation/180*PI) * s;//Вычисляем на сколько передвигать текущее звено по x speedY = Math.sin(pieces[i].rotation/180*PI) * s;//Вычисляем на сколько передвигать текущее звено по y pieces[i].x -= speedX;//Передвигаем текущее звено по x pieces[i].y -= speedY;//Передвигаем текущее звено по y } ток получилась веревка вместо змеи)) |
|
|||||
|
Регистрация: Nov 2009
Сообщений: 300
|
Цитата:
хороший вариант, тоже думал о нем. Если допилить, будет как раз то что я хотел. Если просто отдавать следующему звену параметры текущего, то все звенья сбиваются в кучу. Нужно как-то запоминать шаги звена, и отдавать следующему не текущие параметры, а которые были N шагов назад. Цитата:
![]() Цитата:
![]() |
![]() |
![]() |
Часовой пояс GMT +4, время: 20:36. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|