|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Feb 2013
Сообщений: 24
|
Поворот персонажа в изометрии (диметрии)
Добрый всем день. Вобшем проблема такова что я делаю игру, делаю ее в изометрии, или правильнее сказать как прочел из статьи в диметрии, т.е. у меня один блок равен по высоте половине ширины (60*30). Сделал нахождение пути, вопрос собственно в том как правльно сделать определение в какую сторону смотрит персонаж во время перемещения из одной клетки в другую? Пытаюсь делать чрез стандартное нахождение градуов, вот так:
var rx:Number = arrX[e.target.put[e.target.ind].x][e.target.put[e.target.ind].y].x - e.target.x; //получаем расстояние по по оси х var ry:Number = arrX[e.target.put[e.target.ind].x][e.target.put[e.target.ind].y].y - e.target.y; //получаем расстояние по по оси х var dist = Math.sqrt(rx * rx + ry * ry); var rad:int; rad = Math.atan2(mouseY - e.target.y, mouseX - e.target.x) * (360 / Math.PI); Последний раз редактировалось scorp2007; 21.05.2014 в 12:02. |
|
|||||
Регистрация: Nov 2010
Сообщений: 430
|
Попробуйте выложить флешку и исходник, может тогда понятнее будет.
__________________
Лучше спросить и выставить себя дураком на пять минут, чем не спросить и остаться дураком на всю жизнь. |
|
|||||
Регистрация: Feb 2013
Сообщений: 24
|
Исходники врядли помогут там нет этого момента, кроме того что я написал выше в коде, попытки реализовать. Вот прилагаю картинку и постраюс сформулировать вопрос понятнее. Вот есть картинка, на ней синий ромб - это главный герой, красные стрелки - направление куда он может ходить, желтым и оранжевым отмечено как раз те месте которые мне нужно определять (сектора, диапозоны, не знаю как праивльно назвать). Например, как определить в каком из этих 8 секторов находится в данный момент мышь (относительно главного героя) ? И я говорю именно про направление, а не про тайлы (ромбы земли)... Вобщем во всех изометрических играх когда главный герой идет вверх - он показывается со спины, когда направо - он показывается справа, когда вниз - к нам лицом идет и так далее, вот для чего мне это нужно)...
Иначе говоря нужно определить направление персонажа, куда он движется (вверх, вниз, влево, вправо, влево-вверх, вправ-вверх, влево-вниз, вправо-вниз... известно текущее место персонажа (середина ромба персонажа) и точка середины ромба к которому он движется)... Последний раз редактировалось scorp2007; 21.05.2014 в 14:23. |
|
|||||
Мне в своё время помогла неплохая статья по линейной алгебре. Вот, возьмите. Тут ответ на ваш вопрос.
http://habrahabr.ru/post/131931/
__________________
There is no thing in this world that is not simple. |
|
|||||
Регистрация: Feb 2013
Сообщений: 24
|
спасибо.. буду рад если кто может ответить поконкретнее... я так понимаю нужно вычислить угол (что я делал в 1 посте) - но помимо этого нужно сделать поправку на изометрию, вот этого я не понимаю...
|
|
|||||
Нарисуйте 8 спрайтов ходьбы и на каждый диапазон задайте свой спрайт.(Если это не 3D, конечно)
Насколько я знаю, почти все изометрические игры так делают) Если вектор движения(вектор скорости+направления) > 0, то уже можно вычислить направление и показать нужный спрайт.
__________________
There is no thing in this world that is not simple. |
|
|||||
Регистрация: Feb 2013
Сообщений: 24
|
Блин понятное дело что нужно делать 8 спрайтов, вопрос как раз в том чтобы определить это направление и когда из них какой показывать, прошу не нужно писать "можно уже сделать" - если вы не хотите написать конкретное решение... понятное дело что можно все сделать. Ума не хватает у меня, поэтому прошу поделиться если у кого-то есть готовое решение или ссылка на урок\решение...
|
|
|||||
Ну я вообще имел в виду сразу персонажа, и поворачивать его относительно его скорости, а не расположения ячеек. Но если нужно именно от ячеек, то можно провести вектор от текущей ячейки до целевой, нормализировать и если вам именно нужен угол поворота, то передавайте значения вектора в Math.atan2.
P.S. Извиняюсь, недочитал шапку до конца...
__________________
There is no thing in this world that is not simple. Последний раз редактировалось ZackMercury; 21.05.2014 в 19:07. |
|
|||||
Цитата:
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
Регистрация: Jun 2013
Сообщений: 4
|
Топик старый, но все-таки, может кому пригодится.
В поисках решения аналогичного вопроса попал на этот топик. Быстрого решения не нашел, пораскинул мозгами. Решение, в принципе, очень простое. Берем окружность, которая размером в 2 * Math.PI и делим на 16 частей, получается что-то вроде того: И работаем уже с этими диапазонами. Вот кривенький класс Helper по этим делам: public class IsoRotationStatesHelper { public static const D:String = "D"; public static const DL:String = "DL"; public static const L:String = "L"; public static const TL:String = "TL"; public static const T:String = "T"; public static const TR:String = "TR"; public static const R:String = "R"; public static const DR:String = "DR"; private static const PART:Number = (Math.PI * 2) / 16; private static const Ddiap:Object = { min: PART * 1, max: PART * 3 }; private static const DLdiap:Object = { min: PART * 3, max: PART * 5 }; private static const Ldiap:Object = { min: PART * 5, max: PART * 7 }; private static const TLdiap:Object = { min: PART * 7, max: PART * 9 }; private static const Tdiap:Object = { min: PART * 9, max: PART * 11 }; private static const TRdiap:Object = { min: PART * 11, max: PART * 13 }; private static const Rdiap:Object = { min: PART * 13, max: PART * 15 }; private static const DRdiap:Object = { min: PART * 15, max: PART * 1 }; // Передаем значение в радианах public static function getState(rotation:Number):String { if (checkDiap(Ddiap, rotation)) return D; if (checkDiap(DLdiap, rotation)) return DL; if (checkDiap(Ldiap, rotation)) return L; if (checkDiap(TLdiap, rotation)) return TL; if (checkDiap(Tdiap, rotation)) return T; if (checkDiap(TRdiap, rotation)) return TR; if (checkDiap(DRdiap, rotation)) return DR; if (checkDiap(Rdiap, rotation)) return R; return DR; } private static function checkDiap(object:Object, value:Number):Boolean { return value > object.min && value < object.max; } Последний раз редактировалось Larry; 09.12.2015 в 17:10. |
Часовой пояс GMT +4, время: 05:47. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|