не плавная прокрутка в AS3 - PullRequest
3 голосов
/ 07 ноября 2011

Я пытаюсь сделать игру с боковой прокруткой в ​​AS3, но когда я пытаюсь сделать простой бесконечный фон прокрутки, анимация не плавная.Кто-нибудь может решить эту проблему?

вот ссылка на SWF (30fps):

http://megaswf.com/serve/1221647

код: `package {

import flash.display.*;
import flash.events.*;
public class testscroll extends MovieClip{
    public function testscroll(){
        var bg = new bg1();
        var bg2 = new bg1();
        addChild(bg);
        addChild(bg2);
        bg2.x = 500;
        bg2.addEventListener(Event.ENTER_FRAME,mainloop);
        bg.addEventListener(Event.ENTER_FRAME,mainloop);
    }
    public function mainloop(e:Event){
        var target = e.currentTarget as MovieClip;
        target.x -= 5;
        if(target.x<=-500){
            target.x = 500;
        }
    }
}

} `

Спасибо

Ответы [ 3 ]

2 голосов
/ 07 ноября 2011

Попробуйте взять эту часть своего кода:

target.x -= 5;

и сделать его более низким значением, таким как:

target.x -= 1;

Как сейчас, вы сдвигаете 5 пикселей в каждом кадре, который может выглядеть прерывистым. Это замедлит скорость прокрутки, но сделает ее более плавной. Возможно, вы захотите поиграть с частотой кадров, чтобы изменить скорость.

Также, если ваш фон уже не является растровым изображением, вы должны кэшировать его как растровое изображение для повышения скорости (проще прокрутить растровое изображение, чем вектор).

0 голосов
/ 23 ноября 2011

Посмотрите на это:

http://megaswf.com/serve/1368761/

Требуется другой подход: рисовать исходный mc в растровом изображении, а затем рисовать прямоугольник движущегося источника в статическое растровое изображение.

package 
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.geom.Point;
    import flash.geom.Rectangle;

    [SWF(backgroundColor="#FFFFFF", frameRate="60", width="500", height="400")]
    public class Main extends Sprite
    {
        [Embed(source="assets/swf/assets.swf", symbol="Background")]
        private var Background:Class;

        private var __app_w:int = 500;
        private var __app_h:int = 400;
        private var __src_rect:Rectangle = new Rectangle(0, 0, __app_w, __app_h);
        private var __src_bmpd:BitmapData;
        private var __dest_bmpd:BitmapData = new BitmapData(__app_w, __app_h);
        private var __dest_pt:Point = new Point();


        /* Constructor
        ----------------------------------------------------------------------------------------------*/
        public function Main()
        {
            stage.addEventListener(Event.RESIZE, _onStageResized, false, 0, true);
            stage.align     = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;

            // Initialise
            __src_bmpd       = _bmpd;            
            scrollRect       = __src_rect;
            cacheAsBitmap    = true;
            opaqueBackground = 0xFFFFFF;

            addChild(new Bitmap(__dest_bmpd)) as Bitmap;
            addEventListener(Event.ENTER_FRAME, _onEnterFrame, false, 0, true);
        }

        private function _onStageResized(event:Event):void
        {            
            x = (stage.stageWidth >> 1)  - (__app_w >> 1);
            y = (stage.stageHeight >> 1) - (__app_h >> 1);
        }

        public function _onEnterFrame(event:Event):void
        {
            __src_rect.x = (__src_rect.x == __app_w) ? 0 : __src_rect.x + 2;                
            __dest_bmpd.copyPixels(__src_bmpd, __src_rect, __dest_pt);
        }

        private function get _bmpd():BitmapData
        {
            var mc:Sprite = new Sprite(),
                b1:Sprite = mc.addChild(new Background()) as Sprite,
                b2:Sprite = mc.addChild(new Background()) as Sprite,
                bmpd:BitmapData;

            b1.x = 0;
            b2.x = b1.width;

            bmpd = new BitmapData(mc.width, mc.height, false); 
            bmpd.draw(mc);

            return bmpd;
        }
    }
}
0 голосов
/ 08 ноября 2011

Ниже показано использование бликов для уменьшения нагрузки на процессор и полезный прием, который ограничивает область перерисовки до минимальной видимой части.

Я также довольно широко прокомментировал вне темы: я понимаю, что это грубый и готовый тест, но он может быть полезен для кого-то.

package 
{
    import flash.display.*;
    import flash.geom.Rectangle;
    import flash.utils.setTimeout;
    import flash.utils.setInterval;
    import flash.events.Event;

    // Best practice naming convention: CamelCase for classes
    public class TestScroll extends Sprite
    {
        private var __bmp:Bitmap;


        public function TestScroll()
        {           
            __bmp = addChild(new Bitmap(_bmpd)) as Bitmap;

            // These two instructions act in concert to 
            // reduce the area redrawn onEnterFrame
            // to that defined by the scrollRect
            cacheAsBitmap = true;
            scrollRect = new Rectangle(0, 0, 500, 400);

            // Always a good habit to set the value for useWeakReference to true
            // when adding event listeners: helps with garbage collection.
            // See http://gskinner.com/blog/archives/2006/07/as3_weakly_refe.html
            // That said, ALWAYS remove your listeners as soon as they're no longer required:
            // http://gingerbinger.com/2010/07/actionscript-3-0-events-the-myth-of-useweakreference/
            addEventListener(Event.ENTER_FRAME, _onEnterFrame, false, 0, true);
        }

        public function _onEnterFrame(event:Event):void
        {
            // Running @ 60fps: reduced move rate               
            __bmp.x = (__bmp.x > -500) ? __bmp.x - 2 : 0;
        }

        // Personal preference of mine: break out basic instantiation
        // into subfunctions to keep the constructor as terse as possible
        // Renamed the references to the library items in line with naming 
        // convention for classes: bg1 -> Background
        private function get _bmpd():BitmapData
        {
            var mc:Sprite = new Sprite(),
                b1:Sprite = mc.addChild(new Background()) as Sprite,
                b2:Sprite = mc.addChild(new Background()) as Sprite,
                bmpd:BitmapData;

            b2.x = 500;

            bmpd = new BitmapData(mc.width, mc.height, true, 0);
            bmpd.draw(mc);

            return bmpd;
        }
    }
}

См. http://jacksondunstan.com/articles/629 для более полного объяснения метода scrollRect / cacheAsBitmap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...