не плавная прокрутка в AS3

#flash #actionscript-3 #scroll

#вспышка #actionscript-3 #прокрутка

Вопрос:

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

вот ссылка на swf (30 кадров в секунду) :

http://megaswf.com/serve/1221647

код: `пакет{

 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;
        }
    }
}
  

}
`

Спасибо

Комментарии:

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

2. ^^^ x2, пожалуйста, опубликуйте некоторый код, но, просто взглянув на то, как он ведет себя, похоже, что количество прокрутки является дробным значением (например: 1.1, 0.7, 2.5 и т.д.), Но на дисплее используются целые пиксели (вероятно, из-за copyPixels или scrollRect).). Попробуйте настроить количество прокрутки на целое число (например: 1, 2, 3, 4 и т.д.).

3. Пожалуйста, также опубликуйте свои настройки FPS

4. я включил fps и код 🙂

Ответ №1:

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

 target.x -= 5;
  

и придание ему меньшего значения, такого как:

 target.x -= 1;
  

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

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

Ответ №2:

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

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

 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.

Комментарии:

1. привет, я попробовал ваш код, и прокрутка все та же, что и раньше. я также использовал blitting, но результат был все тем же:(

2. не могли бы вы показать мне свой SWF-файл? я установил fps на 60, но я все еще получаю прерывистый результат :/

Ответ №3:

Взгляните на это:

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;
        }
    }
}