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

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

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

Регистрация: Sep 2008
Сообщений: 52
Post Некорректное перемещение плит игровой карты

Доброе время суток!
Пишу игру с плиточной картой в изометрии. При перемещении по карте двигается сама карта, а не персонаж. Все плиты находятся в массиве и перемещаются перебором массива в цикле. Есть функция, которая преобразует смещение карты на скорость в изометрическое представление(ИП). Логически все прекрасно работает, но при смещении плит со временем происходит наезд задних плит на передние, несмотря на то, что вроде как всем без исключения плитам добавляется одинаковое число к координатам и двигаться с разной скоростью они не должны! Единственное, что мне удалось обнаружить в коде возможное вызывать какие-то некорректности в перемещении это то, что результат перевода смещения координат в ИП округляется до десятых целого числа при добавлении результата к координатам плит.

Например, плита1._x=200;плита1._y=150; скорость=1; mapToScreen(скорость,0,-скорость) вернет смещение по x:1.11022302462516e-16 и y:0.707106781186547, но при смещении объекта _x+=x; _y+=y; в итоге плита1._x:200(!) плита1._y:150.7 ).

Я не силен в тригонометрии, но по-моему функция преобразования в ИП тут не при чем...Функцию позаимствовал из книги "Секреты разработки игр в МакромедиаФлешМХ" Джоба Макара, она там служила для перемещения персонажа по статической изометрической карте.

Смещение плит еле заметное в начале, но получается даже при смещении на 1 пиксель. Я трейсил _width и _height карты как до смещения так и после и результат изменялся. В моем представлении при передвижении всех плит на одинаковое расстояние: ни ширина, ни высота меняться не должны!

Буду рад любой помощи! И извините, если непонятно выразился где-то, спрашивайте!


Код AS1/AS2:
isometricAS = function ()
{
	this.theta = 30;
	this.alpha = 45;
	this.theta *= Math.PI/180;
	this.alpha *= Math.PI/180;
	this.sinTheta = Math.sin(this.theta);
	this.cosTheta = Math.cos(this.theta);
	this.sinAlpha = Math.sin(this.alpha);
	this.cosAlpha = Math.cos(this.alpha);	
}
isometricAS.prototype.mapToScreen = function (xpp, ypp, zpp)
{
	var yp = ypp;
	var xp = xpp*this.cosAlpha+zpp*this.sinAlpha;
	var zp = zpp*this.cosAlpha-xpp*this.sinAlpha;
	var x = xp;
	var y = yp*this.cosTheta-zp*this.sinTheta;
	//var z = zp*this.cosTheta+yp*this.sinTheta;
	return [x, y];
}
 
var iso = new isometricAS();
var spd:Number = 1; // Скорость движения
switch(direction) // Определение скорости по Х и У в зависимости от направления движения
{
	case UP:
	Xspd=0;
	Yspd=spd;
	break;
	case DOWN:
	Xspd=0;
	Yspd=-spd;
	break;
	case LEFT:
	Xspd=spd;
	Yspd=0;
	break;
	case RIGHT:
	Xspd=-spd;
	Yspd=0;
	break;
	default:
	break;
}
 
for(var i=0;i<mapList.length;i++)
	{
		var isoXY = iso.mapToScreen(Xspd, 0, -Yspd); // Перевод данных в изометрическое представление
		var iX=isoXY[0];
		var iY=isoXY[1];
		mapList[i]._x+=iX;
		mapList[i]._y+=iY;
	}


Последний раз редактировалось Offi; 11.11.2008 в 21:04.
Старый 11.11.2008, 21:39
scarbo вне форума Посмотреть профиль Отправить личное сообщение для scarbo Найти все сообщения от scarbo
  № 2  
Ответить с цитированием
scarbo
 
Аватар для scarbo

Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
Ну так округлите
__________________
Я просто добрый шутник.

Старый 11.11.2008, 22:09
Offi вне форума Посмотреть профиль Отправить личное сообщение для Offi Найти все сообщения от Offi
  № 3  
Ответить с цитированием
Offi
 
Аватар для Offi

Регистрация: Sep 2008
Сообщений: 52
при округлении результат еще плачевней некорректное смещение ещё заметней и движение карты происходит явно в не изометрических направлениях!

Старый 11.11.2008, 23:45
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ну вообще при движении всегда происходит округление координат, и этого Вы никак не избежите. Выход смещать на целый пиксель Вас вряд ли устроит, изображение будет "дергаться". Для начала я бы посоветовал попробовать вычислять новую координату плиты не из ее собственной, уже округленной и неправильной, а вычислить например _у только нижнего ряда, а всех верхних - вычитая из нижнего высоту плиты. Улавливаете?))) Она константна, и наезда не будет.
__________________
Reality.getBounds(this);

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

Регистрация: Sep 2008
Сообщений: 52
Wolsh
дело говорите! я не могу понять почему плиты наезжают друг на друга если к каждой плите применяется одинаковое(!) смещение...такое ощущение, что смещение для плиты №1 не такое как для плиты №-n...если ряд за 1 кадр сдвигается на 5 шагов, то длинна его должна остаться той же, шаги то у элементов ряда одинаковые...а в моем варианте получается что у кого-то не такой шаг как у другого...

при том правый ряд(сверху-вниз) непоколебим и не поддается на провокацию глюка, а остальные ведут себя неподобающе. Больше всего смещение наблюдается начиная с левой верхней плиты, не зависимо от направления движения(стабильный ряд тоже стоит вне зависимости от направления). Подумал, может в цикле каждый раз(неизвестным образом) генерируется разное число: вынес расчет смещения из цикла:

Код AS1/AS2:
var isoXY = iso.mapToScreen(Xspd, 0, -Yspd); 
var iX=isoXY[0];
var iY=isoXY[1];
for(var i=0;i<mapList.length;i++)
	{
		mapList[i]._x+=iX;
		mapList[i]._y+=iY;
	}
но не помогло


Последний раз редактировалось Offi; 12.11.2008 в 00:30.
Старый 12.11.2008, 00:35
scarbo вне форума Посмотреть профиль Отправить личное сообщение для scarbo Найти все сообщения от scarbo
  № 6  
Ответить с цитированием
scarbo
 
Аватар для scarbo

Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
Цитата:
правый ряд(сверху-вниз) непоколебим
Ну так от него и считайте.
__________________
Я просто добрый шутник.

Старый 12.11.2008, 00:40
Offi вне форума Посмотреть профиль Отправить личное сообщение для Offi Найти все сообщения от Offi
  № 7  
Ответить с цитированием
Offi
 
Аватар для Offi

Регистрация: Sep 2008
Сообщений: 52
я то посчитаю но оптимальней было бы просто смещать плиты, а не высчитывать их положение! Хочу выяснить почему данный метод работает вразрез с логикой, где ошибка....

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

Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
Потому что Флеш так дроби считает
__________________
Я просто добрый шутник.

Старый 12.11.2008, 00:49
Offi вне форума Посмотреть профиль Отправить личное сообщение для Offi Найти все сообщения от Offi
  № 9  
Ответить с цитированием
Offi
 
Аватар для Offi

Регистрация: Sep 2008
Сообщений: 52
ясно, ладно буду вычислять положение...ох, чувствую тормозить будет...

Старый 12.11.2008, 01:30
scarbo вне форума Посмотреть профиль Отправить личное сообщение для scarbo Найти все сообщения от scarbo
  № 10  
Ответить с цитированием
scarbo
 
Аватар для scarbo

Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
Смотря,как считать...
__________________
Я просто добрый шутник.

Создать новую тему Ответ Часовой пояс GMT +4, время: 12:53.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
игра , изометрия , карта , перемещение , плиты

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

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


 


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


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