Вот как-то делал классик, не пинайте, 2011 год..

Код AS3:
package
{
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.Graphics;
import flash.display.IBitmapDrawable;
import flash.display.Sprite;
import flash.geom.Matrix;
/* * * * * * * * * *
* *
* @author wolsh *
* *
\* * * * * * * * * */
public class TiledBackground extends Sprite
{
private var _tile :BitmapData;
private var _offsetX :Number;
private var _offsetY :Number;
private var _tileAngle :Number;
private var _areaW :Number;
private var _areaH :Number;
private var _matrix :Matrix;
private var _smooth :Boolean;
private var _graphics :Graphics;
public function TiledBackground(areaWidth:Number, areaHeight:Number, tile:IBitmapDrawable, offsetX:Number = 0, offsetY:Number = 0, tileAngle:Number = 0, smooth:Boolean = true)
{
_offsetX = offsetX;
_offsetY = offsetY;
_tileAngle = tileAngle * Math.PI / 180;
_smooth = smooth;
_areaW = areaWidth;
_areaH = areaHeight;
_graphics = this.graphics;
if (tile is BitmapData)
{
_tile = (tile as BitmapData).clone();
}
else
{
var t:DisplayObject = tile as DisplayObject;
_tile = new BitmapData(t.width, t.height);
_tile.draw(tile);
}
_matrix = new Matrix();
fill();
}
private function fill():void
{
_matrix.identity();
_matrix.rotate(_tileAngle);
_matrix.tx = _offsetX;
_matrix.ty = _offsetY;
_graphics.clear();
_graphics.beginBitmapFill(_tile, _matrix, true, _smooth);
_graphics.drawRect(0, 0, _areaW, _areaH);
}
public function get offsetX():Number
{
return _offsetX;
}
public function set offsetX(value:Number):void
{
if (_offsetX != value)
{
_offsetX = value;
fill();
}
}
public function get offsetY():Number
{
return _offsetY;
}
public function set offsetY(value:Number):void
{
if (_offsetY != value)
{
_offsetY = value;
fill();
}
}
public function get smooth():Boolean
{
return _smooth;
}
public function set smooth(value:Boolean):void
{
_smooth = value;
fill();
}
public function get tileAngle():Number
{
return _tileAngle;
}
public function set tileAngle(value:Number):void
{
_tileAngle = value;
fill();
}
}
}
Тестовый Main:

Код AS3:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
/* * * * * * * * * *
* *
* @author wolsh *
* *
\* * * * * * * * * */
public class Main extends Sprite
{
private var _ts:TiledBackground;
[Embed(source='../lib/Drop_by_Drop_by_youngmoons___2.jpg')]
private var _img:Class;
private var _timer:Timer;
private var _top:Sprite;
private var _bottom:Sprite;
private var _left:Sprite;
private var _right:Sprite;
private var _dirX: int = 0;
private var _dirY: int = 0;
private var _speed:int = 1;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.showDefaultContextMenu = false;
// entry point
_ts = new TiledBackground(500, 500, new _img(), 0, 0, 45, true);
addChild(_ts);
_ts.x = 100, _ts.y = 100;
// кнопки управления
_top = scrollButton(_ts.width, 30);
_bottom = scrollButton(_ts.width, 30);
_left = scrollButton(30, _ts.height);
_right = scrollButton(30, _ts.height);
addChild(_top);
addChild(_bottom);
addChild(_left);
addChild(_right);
_top.x = 100, _top.y = 65;
_bottom.x = 100, _bottom.y = _ts.height + 105;
_left.x = 65, _left.y = 100;
_right.x = _ts.width + 105, _right.y = 100;
_top .addEventListener(MouseEvent.ROLL_OVER, overHandler);
_bottom.addEventListener(MouseEvent.ROLL_OVER, overHandler);
_left.addEventListener(MouseEvent.ROLL_OVER, overHandler);
_right.addEventListener(MouseEvent.ROLL_OVER, overHandler);
_top.addEventListener(MouseEvent.ROLL_OUT, outHandler);
_bottom.addEventListener(MouseEvent.ROLL_OUT, outHandler);
_left.addEventListener(MouseEvent.ROLL_OUT, outHandler);
_right.addEventListener(MouseEvent.ROLL_OUT, outHandler);
// таймер "движения"
_timer = new Timer(12);
}
private function outHandler(event:MouseEvent):void
{
_timer.removeEventListener(TimerEvent.TIMER, enterFrameHandler);
_timer.stop();
}
private function overHandler(event:MouseEvent):void
{
var targ:Sprite = event.currentTarget as Sprite;
switch(targ)
{
case _top : _dirX = 0; _dirY = _speed;
break;
case _bottom : _dirX = 0; _dirY = -_speed;
break;
case _left : _dirX = _speed; _dirY = 0;
break;
case _right : _dirX = -_speed; _dirY = 0;
break;
}
_timer.addEventListener(TimerEvent.TIMER, enterFrameHandler);
_timer.start();
}
private function enterFrameHandler(event:TimerEvent):void
{
_ts.offsetX += _dirX;
_ts.offsetY += _dirY;
//_ts.tileAngle += 0.005;// тест поворота
event.updateAfterEvent();
}
private function scrollButton(width:Number, height:Number):Sprite
{
var s:Sprite = new Sprite();
s.graphics.beginFill(0xDDDDDD);
s.graphics.drawRect(0, 0, width, height);
return s;
}
}
}
Во флэшке ниже — наводить мышку на серые полоски вокруг картинки