无尽重复滚动背景(Endless repeating scrolling background)

2019-07-29 17:11发布

我买了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);
}

Answer 1:

我认为你是一个位图,而不是使用图形与填充对象更好。 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;
        }

    }

}

不理想,并没有足够的打磨还为博客文章,而应该让你开始。

编辑:最后,我没有写博客文章 。



Answer 2:

http://www.greensock.com/blitmask

这可能有助于虽然不是免费的



文章来源: Endless repeating scrolling background