我买了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);
}
UPDATE2(
看看这个: http://plasticsturgeon.com/2010/06/infinite-scrolling-bitmap-backgrounds-in-as3/
我用这个来建立我的背景。
有了这个,我可以模拟我的飞机是飞往右边不动,整个背景,我可以使用的重复每次(对于前景层)小的单个图形。
因为我用这个方法了,但是一个更大的图形,我只用移动它的背景层少我的飞机的速度来模拟远的背景。
我招法是enterFrame事件。 因此,我可以更新背景与我的飞机的“运动”每帧。
)
这架飞机可以超过位图的高度。 每次位图回来到窗口/屏幕一个真正的长期滞后发生。 而当飞机飞行速度非常快,比赛开始落后了。
我的第一个方法是使用.png文件(但他们都非常大:1-3MB大小)。 我的下一个方法是使用gif文件(大小要少得多)。
与这两个是一样的。 所以,不能说。
我读到的draw()和copyPixels(),但我不知道,我该如何使用这些重复的图像。
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);
}
我认为你是一个位图,而不是使用图形与填充对象更好。 copyPixels是非常快的。 所以你会做的仅仅是在顶部无论在那里之前copyPixels,假定一切都是不透明的。 如果一切都不是不透明的,你需要用你的源位图作为自己的阿尔法数据,因此以前绘制的像素不显示出来。
让我们重新塑造你的画布所以它是一个位图,而不是一个MC。 新代码如下:
protected function drawCanvas():void {
canvas.bitmapData.copyPixels(scrollingBitmap, new Rectangle(0, 0, scrollingBitmap.width, scrollingBitmap.height), new Point(0,0), scrollingBitmap);
}
哦,看看这个! 这不仅是代码快,这只是一行代码!
编辑:添加代码工作
package {
import flash.display.MovieClip;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.Event;
import flash.geom.Rectangle;
import flash.geom.Point;
public class EndlessBG extends MovieClip{
//this one stays stationary, we're getting the pixels for the right side of the pic from here
private var _source:BitmapData;
//this is the one moving to the left (the pixels for the right side are not visible except for once a cycle);
private var _movingPixels:BitmapData;
private var _canvas:Bitmap;
private var _xOffset:int = 0;
private var _rect:Rectangle = new Rectangle();;
private var _point:Point = new Point();
public function EndlessBG() {
super();
_source = new BathroomStillLife();
_canvas = new Bitmap(new BitmapData(_source.width, _source.height));
_canvas.bitmapData.draw(_source);
_canvas.x = stage.stageWidth/2 - _canvas.width/2;
_canvas.y = 5;
addChild(_canvas);
addEventListener(Event.ENTER_FRAME, gameLoop);
setGeometryDefaults();
_movingPixels = new BitmapData(_source.width, _source.height);
_movingPixels.copyPixels(_source, _rect, _point);
//turn this on to watch red pixels be drawn where the source pixels are coming in
//_source = new BitmapData(_source.width, _source.height, false, 0xFF0000);
}
private function gameLoop(e:Event):void {
_xOffset--;//where the background is moving to
if (_xOffset < -_source.width) {
_xOffset = 0;
//this doesn't seem to work correctly:
//_movingPixels.scroll(_source.width, 0);
_movingPixels = new BitmapData(_source.width, _source.height);
_movingPixels.copyPixels(_source, _rect, _point);
}
trace(_xOffset);
setGeometryDefaults();
_movingPixels.scroll(-1, 0);
//draw the moved part of the canvas
_canvas.bitmapData.copyPixels(_movingPixels, _rect, _point);
//If we stop here, we get a smear to the right
//so, get the remaining pixels directly from the source
//1) reset our rect and point to be to the right side
_rect.x = 0;
_rect.width = -_xOffset;
_point.x = _source.width + _xOffset;
//2) copy from the source
_canvas.bitmapData.copyPixels(_source, _rect, _point);
}
private function setGeometryDefaults():void {
_rect.x=0;
_rect.y=0;
_rect.width = _source.width;
_rect.height = _source.height;
_point.x = 0;
_point.y = 0;
}
}
}
不理想,并没有足够的打磨还为博客文章,而应该让你开始。
编辑:最后,我没有写博客文章 。
http://www.greensock.com/blitmask
这可能有助于虽然不是免费的