Niekończące się powtarzające się przewijane tło
Mam problem z AS3 i AIR. Pracuję nad grą z przewijaniem bocznym dla smartfonów z samolotem i używam różnych środowisk jako warstw.
Przed wszystkimi innymi: używam GPU i tylko bitmapy, jakość jest ustawiona na niską. Tak więc ustawienia wydajności są ustawione na używanie smartfona.
Umieściłem je w prostokącie używając API rysowania i przesunąłem tło za pomocą macierzy:
protected var scrollingBitmap:BitmapData;
protected var canvas:Graphics;
protected var matrix:Matrix;
public function move(dx:Number, dy:Number):void {
matrix.translate(dx, dy);
if(dx != 0) matrix.tx %= scrollingBitmap.width;
if(dy != 0) matrix.ty %= scrollingBitmap.height;
drawCanvas();
}
protected function drawCanvas():void {
canvas.clear();
canvas.beginBitmapFill(scrollingBitmap, matrix, true, true);
canvas.drawRect(0, -scrollingBitmap.height, 1404, scrollingBitmap.height);
}
UPDATE2 (
Popatrz na to:http://plasticsturgeon.com/2010/06/infinite-scrolling-bitmap-backgrounds-in-as3/
Użyłem tego do stworzenia tła.
Dzięki temu mogę symulować, że mój samolot leci w prawo bez przesuwania całego tła i mogę użyć małej pojedynczej grafiki, która powtarza się za każdym razem (dla warstwy pierwszego planu).
Do warstwy tła używam również tej metody, ale ze znacznie większą grafiką i poruszam ją tylko z mniejszą prędkością mojej płaszczyzny, aby symulować odległe tło.
Moja metoda przeniesienia dotyczy zdarzenia typu Enterframe. Mogę więc aktualizować tło każdej klatki „ruchem” mojego samolotu.
)
Samolot może przekroczyć wysokość bitmap. Za każdym razem, gdy bitmapa wraca do okna / ekranu, występuje prawdziwe długie opóźnienie. A kiedy samolot leci bardzo szybko, gra też zaczyna się opóźniać.
Moim pierwszym podejściem było użycie plików .PNG (ale są bardzo duże: rozmiar 1-3 MB). Moim następnym podejściem było użycie plików .GIF (znacznie mniejszy rozmiar).
Oba są takie same. Więc tak nie może być.
Czytałem o draw () i copyPixels (), ale nie wiem, jak mogę ich użyć do powtórzenia obrazu.
AKTUALIZACJA1:
protected var scrollingBitmap:BitmapData;
protected var canvas:Bitmap;
protected function init(e:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
canvas = new Bitmap(new BitmapData(1404, scrollingBitmap.height, true), "auto", true);
this.addChild(canvas);
drawCanvas();
}
public function move(dx:Number, dy:Number):void {
if(dx != 0) dx %= scrollingBitmap.width;
if(dy != 0) dy %= scrollingBitmap.height;
drawCanvas(dx, dy);
}
protected function drawCanvas(xPos:Number = 0, yPos:Number = 0):void {
canvas.bitmapData.copyPixels(scrollingBitmap, new Rectangle(0, 0, 1404, scrollingBitmap.height), new Point(xPos, yPos), scrollingBitmap);
}