box.xpos3D = 0;
//3D y позиция одинакова для всех квадратов.
box.ypos3D = floor;
//Назначается z позиция. (Чем больше z, тем дальше квадрат от зрителя.)
box.zpos3D = startingDepth;
//Обновление глубины квадрата.
startingDepth -= zDistance;
//Расчет размеров квадрата в зависимости от дальности.
var scaleRatio = focalLength/(focalLength + box.zpos3D);
//Расчетные размеры задаются квадрату.
box.scaleX = box.scaleY = scaleRatio;
//Позиция квадрата на сцене (из 3D в 2D координаты)
box.x = vanishingPointX + box.xpos3D * scaleRatio;
box.y = vanishingPointY + box.ypos3D * scaleRatio;
//Помещаем квадрат в массив.
boxes.push(box);
//Добавляем квадрат в список отображения.
addChild(box);
}
Протестируйте ролик, должно получиться что-то вроде этого:
9. Чтобы наши квадратики начали двигаться, допишите следующий код ниже предыдущего в первом кадре TimeLine:
//Мы используем событие ENTER_FRAME для анимации квадратов
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
//Эта функция вызывается каждый кадр.
function enterFrameHandler(e:Event):void
{
//Цикл перебирает массив квадратов
for (var i=0; i < NUMBER_OF_BOXES; i++)
{
//Сохраняем квадрат в локальную переменную.
var box:MyBox = (MyBox)(boxes[i]);
//Уменьшаем глубину квадрата. (Приближаем его к зрителю.)
box.zpos3D -= 5;
//Если zpos3D <= -focalLength, то помещаем квадрат в самое начало, позади всех других.
if (box.zpos3D <= - focalLength)
{
//Последний квадрат в линии всегда первый в массиве, потому что квадраты сортируются по z-позиции с помощью функции sortZ();
box.zpos3D = boxes[0].zpos3D + zDistance;
}
//Расчет размеров квадрата в зависимости от дальности.
var scaleRatio = focalLength/(focalLength + box.zpos3D);
//Расчетные размеры задаются квадрату.
box.scaleX = box.scaleY = scaleRatio;
//Задаем прозрачность квадрата в зависимости от размера.
box.alpha = scaleRatio - 0.5;
//Позиция квадрата на сцене (из 3D в 2D координаты)
box