Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Tween нормально срабатывает раз через раз (http://www.flasher.ru/forum/showthread.php?t=208646)

djken 10.08.2014 00:01

Tween нормально срабатывает раз через раз
 
Вложений: 1
Всем привет. Почти дописал прогу. Отдал заказчику на тестирование, и тот говорит, что панели которые выезжают-заезжают по нажатию очень часто останавливаются на половине пути. Анимация у меня завязана на Tween'ах. Странно, но на машине, на которой пишу приложение, таких проблем не возникало. Решил попробовать протестировать приложение на нетбуке и убедился, выезжающая панель зависает иногда. В приложении у меня всего 3 панели и один раз было что они все одновременно замерли. В чем проблема не могу понять. В поисковиках ничего подобного не нарыл. Кто чего может подсказать?

Вот часть кода с главной выезжающей панелью mainMenu (вертикальное меню с левой стороны экрана). Подгружаю XML файл, в котором прописаны названия кнопок главного меню и всякая остальная дрябедень. Отображаю главное меню. По нажатию по кнопке tab меню выезжает-заезжает - метод showHide. Но почему иногда бывает не доезжает до нужной позиции???

Код AS3:

package  {
 
        import flash.display.Sprite;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.net.URLLoader;
        import flash.net.URLRequest;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import fl.transitions.Tween;
        import fl.transitions.easing.Regular;
        import fl.transitions.TweenEvent;
        import flash.events.TimerEvent;
        import flash.utils.Timer;
 
        public class Main extends Sprite {
 
                private var fileLoader:URLLoader;
                private var fileRequest:URLRequest;
                private var fileXml:XML;
                private var init:MainSlide;
                private var mainMenu:MainMenu;
                private var gamePanel:GamePanel;
                private var roundPanel:RoundPanel;
                private var helpPanel:HelpPanel;
                private var currGame;
                private var currQuestion;
 
                public function Main() {
                        stage.align = StageAlign.TOP_LEFT;
                        stage.scaleMode = StageScaleMode.NO_SCALE;
 
                        fileLoader = new URLLoader();
                        fileRequest = new URLRequest("file.xml");
                        fileLoader.addEventListener(Event.COMPLETE, fileLoadComplete);
                        fileLoader.load(fileRequest);
                }
 
                private function fileLoadComplete(e:Event):void {
                        fileXml = new XML(e.target.data);
                        init = new MainSlide();
                        init.bg._w = init.bg.width;
                        init.bg._h = init.bg.height;
                        init.logo._w = init.logo.width;
                        init.logo._h = init.logo.height;
                        addChild(init);
                        bgResize();
                        logoResize();
                        mainMenu = new MainMenu();
                        mainMenu.autoHide = true;
                        init.addChild(mainMenu);
 
                        var btnGame:Object = {};
                        for (var i=0; i<fileXml.children().length(); i++){
                                btnGame[i] = new ButtonGame(i+1);
                                btnGame[i].scaleX = btnGame[i].scaleY = 0.8;
                                btnGame[i].x = 10;
                                btnGame[i].y = i * (btnGame[i].height + 5) + 10;
                                btnGame[i].name = i;
                                mainMenu.mc.addChild(btnGame[i]);
                                btnGame[i].addEventListener(MouseEvent.CLICK, mainMenu.showHide);
                                btnGame[i].addEventListener(MouseEvent.CLICK, newGamePanel);
                        }
 
                        mainMenuResize();
                        stage.addEventListener(Event.RESIZE, stageResize);
                }
 
                private function mainMenuResize():void {
                        mainMenu.newHeight = stage.stageHeight;
                }
 
                private function bgResize():void {
                        var koef1 = init.bg._w / init.bg._h;
                        var koef2 = stage.stageWidth / stage.stageHeight;
                        if (koef2 <= koef1){
                                init.bg.scaleX = init.bg.scaleY = stage.stageHeight / init.bg._h;
                        } else {
                                init.bg.scaleX = init.bg.scaleY = stage.stageWidth / init.bg._w;
                        }
                        init.bg.x = stage.stageWidth / 2 - init.bg.width / 2;
                        init.bg.y = stage.stageHeight / 2 - init.bg.height / 2;
                }
 
                private function logoResize():void {
                        init.logo.scaleX = init.logo.scaleY = stage.stageHeight * 0.7 / init.logo._h;
                        init.logo.x = stage.stageWidth / 2 - init.logo.width / 2;
                        init.logo.y = stage.stageHeight / 2 - init.logo.height / 2;
                }
 
                private function stageResize(e:Event):void {
                        bgResize();
                        logoResize();
                        mainMenuResize();
                }
 
        }
 
}

Код AS3:

package  {
 
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.events.Event;
        import fl.transitions.Tween;
        import fl.transitions.easing.Regular;
 
        public class MainMenu extends Sprite {
 
                private var isOpen:Boolean;
 
                public function MainMenu() {
                        autoHide = true;
 
                        tab.addEventListener(MouseEvent.CLICK, showHide);
                        tab.addEventListener(MouseEvent.ROLL_OVER, tabRollOver);
                        tab.addEventListener(MouseEvent.ROLL_OUT, tabRollOut);
                        tab.buttonMode = true;
                }
 
                public function set autoHide(b:Boolean):void {
                        if (b){
                                x = -90;
                                isOpen = false;
                                tab.arrow.scaleX = 1;
                        } else {
                                x = 0;
                                isOpen = true;
                                tab.arrow.scaleX = -1;
                        }
                }
 
                public function set newHeight(h:int):void {
                        bg.height = h;
                        tab.y = h / 2 - tab.height / 2;
                }
 
                public function showHide(e:MouseEvent):void {
                        var _slideTo;
                        if (isOpen == false){
                                _slideTo = 0;
                                isOpen = true;
                                tab.arrow.scaleX = -1;
                                stage.addEventListener(Event.ENTER_FRAME, moveButtons);
                        } else {
                                _slideTo = -90;
                                isOpen = false;
                                tab.arrow.scaleX = 1;
                                stage.removeEventListener(Event.ENTER_FRAME, moveButtons);
                        }
                        new Tween(this, "x", Regular.easeOut, x, _slideTo, 0.5, true);
                }
 
                private function moveButtons(e:Event):void {
                        if (mc.height > stage.stageHeight){
                                var _perc = Math.round(stage.mouseY * 100 / stage.stageHeight);
                                mc.y -= Math.round((mc.y - ((mc.height - stage.stageHeight + 10) * _perc / -100))/4);
                        }
                }
 
                private function tabRollOver(e:MouseEvent):void {
                        new Tween(e.target, "alpha", Regular.easeOut, e.target.alpha, 0.6, 0.2, true);
                }
 
                private function tabRollOut(e:MouseEvent):void {
                        new Tween(e.target, "alpha", Regular.easeOut, e.target.alpha, 0.5, 0.2, true);
                }
        }
 
}


КорДум 10.08.2014 01:29

Твины съедает GC, сохраняйте ссылки на них. Или воспользуйтесь сторонними твинерами (к слову, получите больший прирост в скорости).

djken 10.08.2014 18:20

Почитал об этом GC подробнее, поразбирался. Получается, что даже сохранить ссылку в методе - этого будет мало. Нужно объявлять переменную на уровне класса, чтобы мусорщик не чистил... во как.
Либо думаю попробовать caurina.transitions.Tweener

В общем, спасибо большое! Теперь понял в каком направлении рыть )

illuzor 10.08.2014 18:33

djken, лучше твинер от greensock. Он активно поддерживает.
А caurina не обновляется уже больше пяти лет.

djken 10.08.2014 19:21

illuzor, ок, спасибо

КорДум 10.08.2014 19:23

Гринсок надо покупать, если проект продается. Поэтому лучше EazeTween.

caseyryan 11.08.2014 07:40

Цитата:

А caurina не обновляется уже больше пяти лет.
Да какая разница. Если нужны только твины, то caurina самое-то. Ничего нового там уже не придумаешь, все нужные твины есть. В гринсоковские либы понатолкали кучу всего, лично мне даже одной десятой их этого не нужно


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

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