Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Слот СПИН, плавность (http://www.flasher.ru/forum/showthread.php?t=214780)

ZergMaster 28.11.2017 14:01

Цитата:

Сообщение от Appleman (Сообщение 1203212)
высокие fps кажутся нам "кинематографичнее" из-за того, что человеческий глаз банально не может различить больше 24 кадров в секунду

Это довольно распространенное заблуждение. Сильно устаревшие данные. 24 кадра связаны не с частотой, воспринимаемой глазом, а техническими возможностями, которыми располагало человечество на момент создания кино. На самом деле человек различает до 60-ти в среднем, а так вообще это очень индивидуально. Например, разницу между 30-ю и 60ю я вижу отлично, как и между 60-ю и 240. И, кстати, 24 кадра без блюра будут дерганные.

По поводу блюров, когда делал первые автоматы, в итоге сделал в точности, как говорит Zebestov. Долго эксперементировал и так и эдак, пришел к тому, что хочу, чтобы они вертелись быстро и красиво. Попробовал заблюрить, оказалось прям хорошо. В результате пришел к тому, что на каждый барабан сделал по три кадра в кашу заблюреных слотов (так, что просто цветное месиво) и при анимации кручения их просто поочередно менял. Получилось настолько неожиданно красиво и реалистично, что так и оставил.

undefined 28.11.2017 16:03

Да,кстати,ТС, а сколько fps стоит то?На 24 плавную анимацию не получится никак.

Wolsh 28.11.2017 17:16

Цитата:

тормоза появятся от пересчета их матриц при меремещении
Что, реально будет для каждой картинки пересчитывать матрицу? А что случилось, что у нее поменялось? Поворот, координаты в контейнере, масштабирование, размеры?

Насчет идеи отрисовать всю ленту в одну битмапину — не забывайте, что для этого вам придется создать НОВУЮ битмапдату высотой в несколько тысяч пикселей, 5 таких штук, и занять ими память (напомню, что битмапы отдельных картинок показывают свои битмапдаты прямо с исходника).

ZergMaster 28.11.2017 17:32

Кстати, пользуясь случаем, небольшой оффтопчик: хотел уточнить теорию BitmapData. Я правильно помню, что когда мы создаем статическую BitmapData, а потом на её основе неограниченное количество Bitmap и добавляем их на сцену, то память тратится всего на одну BitmapData? Потому что bd это массив байтов а bitmap это display object? Просто я порыскал на скорую руку по гуглу , вразумительного ответа не нашел быстро. Хочется именно понимать вкратце так ли это и почему это так.

caseyryan 28.11.2017 18:27

Цитата:

Сообщение от Wolsh (Сообщение 1203219)
Что, реально будет для каждой картинки пересчитывать матрицу? А что случилось, что у нее поменялось? Поворот, координаты в контейнере, масштабирование, размеры?

Поменялась матрица контейнера, ее параметры нужно задать и вложенным объектам, чтобы они в нужной позиции отрисовались. А просто задать парметры матрицы в as3 нельзя, матрица создастся новая. Так как страктов в ас3 тоже нет, все это барахло копится в памяти до момента срабатывания сборщика. И вот именно в этот момент происходит фриз.
Это из практики. Я тоже в свое время долго над этим голову ломал
Цитата:

Насчет идеи отрисовать всю ленту в одну битмапину — не забывайте, что для этого вам придется создать НОВУЮ битмапдату высотой в несколько тысяч пикселей, 5 таких штук, и занять ими память (напомню, что битмапы отдельных картинок показывают свои битмапдаты прямо с исходника).
Не обязательно. Достаточно на несколько картинок вперед и назад. Механизм получится немного сложнее, чем просто пролистывание, потому как придется определять что именно и когда надо отрисовать. Но он рабочий. Битмапка будет крутиться намного плавнее, чем контейнер с куче объектов. 100%.

in4core 28.11.2017 19:26

Костян, а замеры есть? А то пока просто говорим. Хочется реальный пример увидеть, прям очень красочный ))) Задача : имеем 50 картинок, хотите в битмапу, хотите как угодно - на каждом барабане, подается на вход позиция, например 20, это значит остановка на 20 картинке, 21,22 визуально, ну и сначала позиция тоже подается перед стартом.

caseyryan 28.11.2017 20:43

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

undefined 29.11.2017 12:11

Вложений: 1
Main.as:
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.text.*;
 
        /**
        * ...
        * @author
        */

        public class Main extends Sprite
        {
 
                public function Main()
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
                private var reels:Array;
                private var tf:TextField;
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        tf = new TextField();
                        tf.type = "input";
                        tf.width = 50;
                        tf.height = 30;
                        tf.background = true;
                        tf.border = true;
                        //tf.backgroundColor = 0xFF0000;
                        tf.x = tf.y = 20;
                        tf.text = "0.1";
                        var format:TextFormat = new TextFormat();
                        format.size = 25;
                        tf.setTextFormat(format);
                        addChild(tf);
                        tf.addEventListener(Event.CHANGE, function (e:Event):void{
                                var duration:Number = Number(tf.text);
                                if(!isNaN(duration)) {
                                        for (var i:uint = 0; i < reels.length; i++) {
                                                reels[i].animDuration = duration;
                                        }
                                }
                        });
                        reels = [];
                        for (var i:uint = 0; i < 5;i++) {
                                var reel:Reel = new Reel(150,150);
                                addChild(reel);
                                reels.push(reel);
                                reel.x = i * 155;
                                reel.y =-150;
                                reel.addItem(0, 0xFF0000);
                                reel.addItem(1, 0x00FF00);
                                reel.addItem(2, 0x000FF);
                                reel.addItem(3, 0xFF00FF);
                                reel.addItem(4, 0x00FFFF);
                                reel.spin();
                        }
                }
 
        }
 
}

Reel.as:
Код AS3:

package 
{
        import aze.motion.easing.Linear;
        import flash.display.Sprite;
        import flash.geom.Point;
        import flash.text.TextField;
        import flash.text.TextFormat;
        import aze.motion.eaze;
 
        /**
        * ...
        * @author
        */

        public class Reel extends Sprite
        {
                private var items:Array = [];
                private var cont:Sprite;
                private var curItem:int = 0;
                private var itemWidth:Number;
                private var itemHeight:Number;
                private var _animDuration:Number = 0.1;
                public function Reel(itemWidth:Number, itemHeight:Number)
                {
                        super();
                        this.itemWidth = itemWidth;
                        this.itemHeight = itemHeight;
                }
                public function addItem(n:uint, color:uint):void {
                        var item:Sprite = new Sprite();
                        item.graphics.beginFill(color, 1);
                        item.graphics.lineStyle(1, 0, 1);
                        item.graphics.drawRect(0, 0, itemWidth, itemHeight);
                        var tf:TextField = new TextField();
                        tf.text = String(n);
                        tf.textColor = 0;
                        tf.autoSize = "left";
                        var format:TextFormat = new TextFormat();
                        format.size = 80;
                        tf.setTextFormat(format);
                        tf.x = item.width * 0.5 - tf.width * 0.5;
                        tf.y = item.height * 0.5 - tf.height * 0.5;
                        item.addChild(tf);
                        items.push(item);
                }
                public function spin():void {
                        doSpinAnim();
                }
 
                private function doSpinAnim():void
                {
                        if (cont)
                                removeChild(cont);
                        cont = new Sprite();
                        var _y:Number = 0;
                        for (var i:int = -2; i <= 1; i++) {
                                var n:int = curItem + i;
                                if (n < 0) n+=items.length;
                                if (n > items.length - 1) n = 0;
                                //trace(n);
                                items[n].y = _y;
                                _y += items[n].height;
                                cont.addChild(items[n]);
                        }
                        addChild(cont);
                        var _mask:Sprite = new Sprite();
                        _mask.graphics.beginFill(0, 0.5);
                        _mask.graphics.drawRect(0, 0, itemWidth, itemHeight*2);
                        var p:Point = new Point();
                        p = items[curItem].localToGlobal(p);
                        _mask.x = p.x;
                        _mask.y =p.y-itemHeight/2;
                        //stage.addChild(_mask);
                        cont.mask = _mask;
                        eaze(cont).easing(Linear.easeNone).apply({y:0}).to(_animDuration, {y:itemHeight}).onComplete(function():void {
                                curItem--;
                                if (curItem < 0) curItem = items.length - 1;
                                doSpinAnim();
                        });
                }
 
                public function set animDuration(value:Number):void
                {
                        _animDuration = value;
                }
        }
 
}

В инпутфилде скорость анимации.
Красиво сам сделаешь
slottest.swf   (23.0 Кб)

in4core 29.11.2017 12:52

И в чем прикол данного дергунчика? Причем такие дичайшие операции? какие то циклы там.
Код AS3:

.tween(_clip, 0.2, { y:_clip.y + dy }).onComplete(.tween);


undefined 29.11.2017 14:14

что это?


Часовой пояс GMT +4, время: 05:42.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.