Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.05.2014, 11:46
scorp2007 вне форума Посмотреть профиль Отправить личное сообщение для scorp2007 Найти все сообщения от scorp2007
  № 1  
Ответить с цитированием
scorp2007

Регистрация: Feb 2013
Сообщений: 24
По умолчанию Поворот персонажа в изометрии (диметрии)

Добрый всем день. Вобшем проблема такова что я делаю игру, делаю ее в изометрии, или правильнее сказать как прочел из статьи в диметрии, т.е. у меня один блок равен по высоте половине ширины (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 градуса а в десятки может быть, поэтому мне надо как-то диапазаон определть весь. Надеюс поможите, спасибо


Последний раз редактировалось scorp2007; 21.05.2014 в 12:02.
Старый 21.05.2014, 13:16
Srednas вне форума Посмотреть профиль Отправить личное сообщение для Srednas Найти все сообщения от Srednas
  № 2  
Ответить с цитированием
Srednas

Регистрация: Nov 2010
Сообщений: 430
Попробуйте выложить флешку и исходник, может тогда понятнее будет.
__________________
Лучше спросить и выставить себя дураком на пять минут, чем не спросить и остаться дураком на всю жизнь.

Старый 21.05.2014, 14:07
scorp2007 вне форума Посмотреть профиль Отправить личное сообщение для scorp2007 Найти все сообщения от scorp2007
  № 3  
Ответить с цитированием
scorp2007

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


Последний раз редактировалось scorp2007; 21.05.2014 в 14:23.
Старый 21.05.2014, 14:35
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 4  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Мне в своё время помогла неплохая статья по линейной алгебре. Вот, возьмите. Тут ответ на ваш вопрос.
http://habrahabr.ru/post/131931/
__________________
There is no thing in this world that is not simple.

Старый 21.05.2014, 15:03
scorp2007 вне форума Посмотреть профиль Отправить личное сообщение для scorp2007 Найти все сообщения от scorp2007
  № 5  
Ответить с цитированием
scorp2007

Регистрация: Feb 2013
Сообщений: 24
спасибо.. буду рад если кто может ответить поконкретнее... я так понимаю нужно вычислить угол (что я делал в 1 посте) - но помимо этого нужно сделать поправку на изометрию, вот этого я не понимаю...

Старый 21.05.2014, 15:16
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 6  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Нарисуйте 8 спрайтов ходьбы и на каждый диапазон задайте свой спрайт.(Если это не 3D, конечно)
Насколько я знаю, почти все изометрические игры так делают)
Если вектор движения(вектор скорости+направления) > 0, то уже можно вычислить направление и показать нужный спрайт.
__________________
There is no thing in this world that is not simple.

Старый 21.05.2014, 15:37
scorp2007 вне форума Посмотреть профиль Отправить личное сообщение для scorp2007 Найти все сообщения от scorp2007
  № 7  
Ответить с цитированием
scorp2007

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

Старый 21.05.2014, 15:44
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 8  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Ну я вообще имел в виду сразу персонажа, и поворачивать его относительно его скорости, а не расположения ячеек. Но если нужно именно от ячеек, то можно провести вектор от текущей ячейки до целевой, нормализировать и если вам именно нужен угол поворота, то передавайте значения вектора в Math.atan2.
P.S. Извиняюсь, недочитал шапку до конца...
__________________
There is no thing in this world that is not simple.


Последний раз редактировалось ZackMercury; 21.05.2014 в 19:07.
Старый 21.05.2014, 16:03
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 9  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
но помимо этого нужно сделать поправку на изометрию, вот этого я не понимаю...
http://www.compuphase.com/axometr.htm
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 09.12.2015, 16:58
Larry вне форума Посмотреть профиль Отправить личное сообщение для Larry Найти все сообщения от Larry
  № 10  
Ответить с цитированием
Larry

Регистрация: Jun 2013
Сообщений: 4
Топик старый, но все-таки, может кому пригодится.

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



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

Вот кривенький класс 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;
		}
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 604
Размер:	75.5 Кб
ID:	31896  


Последний раз редактировалось Larry; 09.12.2015 в 17:10.
Создать новую тему Ответ Часовой пояс GMT +4, время: 05:47.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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