Приветствую.
Не знаю как правильно реализовать бесконечное движение фона по 2м осям.
Пока попробовал так, но результат не нравится. Создал текстуру bgr и копировал ее 9 раз для замещения, тех участков, что выходят за границы видимости. Движение текстуры вызывает обьект obj, который сам тоже движется.
Чувствую,что все должно быть намного проще.
Еще хочу спросить, как убрать резкий переход при смене направления движения фона?
Смотрел через диспетчер: флешка эта жрет 300 мб памяти.Для изображения 1920*1080 это нормально? Может растрировать как-то или еще что-то?

Код AS3:
stage.displayState = StageDisplayState.FULL_SCREEN;
import flash.display.MovieClip;
/////
var flag:String = null;
var speedbg:int = 5;
var bg:MovieClip = new bgr ;
var bg1:MovieClip = new bgr ;
var bg2:MovieClip = new bgr ;
var bg3:MovieClip = new bgr ;
var bg4:MovieClip = new bgr ;
var bg5:MovieClip = new bgr ;
var bg6:MovieClip = new bgr ;
var bg7:MovieClip = new bgr ;
var bg8:MovieClip = new bgr ;
addChildAt(bg,0);
addChildAt(bg1,0);
addChildAt(bg2,0);
addChildAt(bg3,0);
addChildAt(bg4,0);
addChildAt(bg5,0);
addChildAt(bg6,0);
addChildAt(bg7,0);
addChildAt(bg8,0);
bg.x = 0;
bg.y = 0;
bg1.x = -1920;//stage.stageWidth-stage.stageWidth*2;
bg1.y = 0;
bg2.x = 1920;//stage.stageWidth;
bg2.y = 0;
bg3.x = 0;//stage.stageWidth;
bg3.y = -1080;
bg4.x = 0;//stage.stageWidth;
bg4.y = 1080 * 2;
// и так далее
bg8.x = 1920;
bg8.y = 1080;
//////////////////////////////////////////////
var fnX = -500;
var fnY = 0;
var dir:Number = Math.atan2(mouseY-obj.y, mouseX-obj.x) / Math.PI * 180;
dir += 180;
var speed:Point = new Point(Math.cos(dir/180*Math.PI), Math.sin(dir/180*Math.PI));
stage.addEventListener(MouseEvent.CLICK, fnGetXY);
addEventListener(Event.ENTER_FRAME, enterFrame);
function enterFrame(e:Event):void
{
// при положительной скорости идем за курсором
// при отрицательной - от курсора
var speed:Number = -1;
//fnGetXY();
var p:Point = new Point(fnX - obj.x, fnY - obj.y);
p.normalize(speed);
obj.x += p.x;
obj.y += p.y;
if (bg.x + 1920 < 0)
{
startPosition();
}
if (bg1.x + 1920 < -1920)
{
startPosition();
}
if (bg2.x + 1920 == 0)
{
startPosition();
}
if (bg.x == 1920)
{
startPosition();
}
if (bg1.x == 0)
{
startPosition();
}
if (bg2.x == 1920 * 2)
{
startPosition();
}
if (bg.y==-1080)
{
startPosition();
}
if (bg.y==1080)
{
startPosition();
}
// и так далее
////////////////////////////////
// Влево
if (obj.x < fnX)
{
bg.x = bg.x - speedbg;
bg1.x = bg1.x - speedbg;
bg2.x = bg2.x - speedbg;
bg3.x = bg3.x - speedbg;
// и так далее
flag = "left";
}
//Вправо
if (obj.x > fnX)
{
bg.x = bg.x + speedbg;
bg1.x = bg1.x + speedbg;
bg2.x = bg2.x + speedbg;
bg3.x = bg3.x + speedbg;
// и так далее
flag = "right";
}
//Вверх
if (obj.y < fnY)
{
bg.y = bg.y - speedbg;
bg1.y = bg1.y - speedbg;
bg2.y = bg2.y - speedbg;
bg3.y= bg3.y - speedbg;
bg4.y= bg4.y - speedbg;
// и так далее
flag = "up";
}
// Вниз
if (obj.y > fnY)
{
bg.y = bg.y +speedbg;
bg1.y = bg1.y +speedbg;
bg2.y = bg2.y +speedbg;
bg3.y= bg3.y +speedbg;
bg4.y= bg4.y +speedbg;
// и так далее
flag = "down";
}
}
function fnGetXY(event:MouseEvent):void
{
fnX = stage.mouseX;
fnY = stage.mouseY;
}
function startPosition():void
{
bg.x = 0;
bg1.x = -1920;
bg2.x = 1920;
bg3.x = 0;
bg4.x = 0;
bg.y=0;
bg1.y =0;
bg2.y =0;
bg3.y = -1080;
bg4.y = 1080 * 2;
// и так далее bg5-bg8;
}