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