Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Поворот персонажа в изометрии (диметрии) (http://www.flasher.ru/forum/showthread.php?t=207958)

scorp2007 21.05.2014 11:46

Поворот персонажа в изометрии (диметрии)
 
Добрый всем день. Вобшем проблема такова что я делаю игру, делаю ее в изометрии, или правильнее сказать как прочел из статьи в диметрии, т.е. у меня один блок равен по высоте половине ширины (60*30). Сделал нахождение пути, вопрос собственно в том как правльно сделать определение в какую сторону смотрит персонаж во время перемещения из одной клетки в другую? Пытаюсь делать чрез стандартное нахождение градуов, вот так:

Код AS3:

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);

Но проблема в том как теперь правильно эти углы подсчитать (предполагается что персонаж может ходить и по диагонали и напрямую, т.е. итого 8 анимаций зодьбы и 8 диапазонов соответственно надо), пробовал делать напрямую проверку, ставил условия (если 0 градусов - спрайт1, если 90 градусов - анимация -2), но тут проблема возникла что эти градусы не всегда одинаковы и бывают отклоняются на несколько пикселей, наверняка есть у каждой стороны какой-то диапазон при котром должна показываться та или иная анимация (точнее спрайт, поворот). Но я так и не смог определить как это сделать :( В частности проблемы возникают когда персонажа отправляешь в другую точку на полпути, тут уж вообше отклонение не в 1-2 градуса а в десятки может быть, поэтому мне надо как-то диапазаон определть весь. Надеюс поможите, спасибо

Srednas 21.05.2014 13:16

Попробуйте выложить флешку и исходник, может тогда понятнее будет.

scorp2007 21.05.2014 14:07

Вложений: 1
Исходники врядли помогут там нет этого момента, кроме того что я написал выше в коде, попытки реализовать. Вот прилагаю картинку и постраюс сформулировать вопрос понятнее. Вот есть картинка, на ней синий ромб - это главный герой, красные стрелки - направление куда он может ходить, желтым и оранжевым отмечено как раз те месте которые мне нужно определять (сектора, диапозоны, не знаю как праивльно назвать). Например, как определить в каком из этих 8 секторов находится в данный момент мышь (относительно главного героя) ? И я говорю именно про направление, а не про тайлы (ромбы земли)... Вобщем во всех изометрических играх когда главный герой идет вверх - он показывается со спины, когда направо - он показывается справа, когда вниз - к нам лицом идет и так далее, вот для чего мне это нужно)...
Иначе говоря нужно определить направление персонажа, куда он движется (вверх, вниз, влево, вправо, влево-вверх, вправ-вверх, влево-вниз, вправо-вниз... известно текущее место персонажа (середина ромба персонажа) и точка середины ромба к которому он движется)...

ZackMercury 21.05.2014 14:35

Мне в своё время помогла неплохая статья по линейной алгебре. Вот, возьмите. Тут ответ на ваш вопрос.
http://habrahabr.ru/post/131931/

scorp2007 21.05.2014 15:03

спасибо.. буду рад если кто может ответить поконкретнее... я так понимаю нужно вычислить угол (что я делал в 1 посте) - но помимо этого нужно сделать поправку на изометрию, вот этого я не понимаю...

ZackMercury 21.05.2014 15:16

Нарисуйте 8 спрайтов ходьбы и на каждый диапазон задайте свой спрайт.(Если это не 3D, конечно)
Насколько я знаю, почти все изометрические игры так делают)
Если вектор движения(вектор скорости+направления) > 0, то уже можно вычислить направление и показать нужный спрайт.

scorp2007 21.05.2014 15:37

Блин понятное дело что нужно делать 8 спрайтов, вопрос как раз в том чтобы определить это направление и когда из них какой показывать, прошу не нужно писать "можно уже сделать" - если вы не хотите написать конкретное решение... понятное дело что можно все сделать. Ума не хватает у меня, поэтому прошу поделиться если у кого-то есть готовое решение или ссылка на урок\решение...

ZackMercury 21.05.2014 15:44

Ну я вообще имел в виду сразу персонажа, и поворачивать его относительно его скорости, а не расположения ячеек. Но если нужно именно от ячеек, то можно провести вектор от текущей ячейки до целевой, нормализировать и если вам именно нужен угол поворота, то передавайте значения вектора в Math.atan2.
P.S. Извиняюсь, недочитал шапку до конца...

alatar 21.05.2014 16:03

Цитата:

но помимо этого нужно сделать поправку на изометрию, вот этого я не понимаю...
http://www.compuphase.com/axometr.htm

Larry 09.12.2015 16:58

Вложений: 1
Топик старый, но все-таки, может кому пригодится.

В поисках решения аналогичного вопроса попал на этот топик. Быстрого решения не нашел, пораскинул мозгами. Решение, в принципе, очень простое. Берем окружность, которая размером в 2 * Math.PI и делим на 16 частей, получается что-то вроде того:

http://www.flasher.ru/forum/attachme...1&d=1449666259

И работаем уже с этими диапазонами.

Вот кривенький класс Helper по этим делам:
Код AS3:

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;
                }


dimarik 10.12.2015 21:29

Я скажу что переходу от одной системы координат в другую помогают матрицы трансформации. Это самый простой путь какой можно придумать. Преобразование пишется в три строчки.


Часовой пояс GMT +4, время: 15:25.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.