Fundo de rolagem repetitivo sem fim
Eu tenho um problema com o AS3 e o AIR. Estou trabalhando em um jogo de rolagem lateral para smartphones com um avião e uso planos de fundo diferentes como camadas.
Antes de todos os outros: eu uso GPU e apenas bitmaps, a qualidade está baixa. Assim, as configurações de desempenho estão todas definidas para o uso do smartphone.
Coloquei-os em um retângulo usando a API de desenho e movi o fundo com uma matriz:
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 (
Dê uma olhada neste:http://plasticsturgeon.com/2010/06/infinite-scrolling-bitmap-backgrounds-in-as3/
Eu usei isso para criar meus fundos.
Com isso eu posso simular que meu avião está voando para a direita sem mover todo o fundo e eu posso usar um pequeno gráfico único que se repete toda vez (para a camada de primeiro plano).
Para a camada de fundo eu também uso este método, mas com um gráfico muito maior e eu o movo apenas com menos a velocidade do meu avião para simular um fundo distante.
Meu método de movimentação está em um evento de quadro de entrada. Então eu posso atualizar o fundo de cada quadro com o "movimento" do meu avião.
)
O avião pode exceder a altura dos bitmaps. Toda vez que o bitmap volta à janela / tela, ocorre um atraso muito longo. E quando o avião voa muito rápido, o jogo também começa a ficar lento.
Minha primeira abordagem foi usar arquivos .PNG (mas eles são muito grandes: tamanho de 1-3MB). Minha próxima abordagem foi usar arquivos .GIF (muito menos tamanho).
Com ambos é o mesmo. Então não pode ser isso.
Eu li sobre draw () e copyPixels (), mas eu não sei, como eu posso usá-los para repetir a imagem.
UPDATE1:
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);
}