AS3 と AIR で問題が発生しました。私は飛行機でスマートフォン用の横スクロール ゲームに取り組んでおり、さまざまな背景をレイヤーとして使用しています。
他のすべての前に: 私は GPU を使用し、ビットマップのみを使用します。品質は低に設定されています。というわけで、パフォーマンスの設定はすべてスマートフォン用に設定。
描画 API を使用してそれらを四角形に配置し、マトリックスを使用して背景を移動します。
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);
}
更新2 (
これを見てください:http://plasticsturgeon.com/2010/06/infinite-scrolling-bitmap-backgrounds-in-as3/
これを使って背景を作りました。
これにより、背景全体を動かさずに飛行機が右に飛んでいるようにシミュレートでき、(前景レイヤーに) 毎回繰り返す小さな単一のグラフィックを使用できます。
背景レイヤーにもこの方法を使用しますが、はるかに大きなグラフィックを使用し、飛行機の速度を落として移動して、遠くの背景をシミュレートします。
私の move-method は enterframe イベントにあります。そのため、飛行機の「動き」でフレームごとに背景を更新できます。
)
平面はビットマップの高さを超えることができます。ビットマップがウィンドウ/スクリーンに戻るたびに、非常に長い遅延が発生します。また、飛行機が非常に速く飛ぶと、ゲームも遅れ始めます。
私の最初のアプローチは、.PNG ファイルを使用することでした (ただし、ファイルは非常に大きく、1 ~ 3 MB のサイズです)。私の次のアプローチは、.GIF ファイル (はるかに小さいサイズ) を使用することでした。
どちらも同じです。だからそんなことありえない。
draw() と copyPixels() について読みましたが、それらを使用して画像を繰り返す方法がわかりません。
更新1:
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);
}