Форум 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=208677)

Gamurari 14.08.2014 03:03

Отображение анимации
 
Возникла проблема с добавлением созданой с помощью Timer анимации на сцену.
Анимация самая простая - shape облочко движется по оси x.
Ошибок не выдаёт, но облочко на сцене не вырисовывается
P.S.: я небось жёстко на*****кодила и всё же буду благодарна, если объясните почему именно не отображается анимация, спасибо за ранее.
Код:
Код AS3:

package {
    import flash.display.DisplayObject;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.Event;
 
    import outside.Clouds;
 
      //Основной класс
 
        public class Main extends Sprite
        {       
 
                public function Main()
                {
                        var _cloud:Clouds = new Clouds(0, 10);
                        this.addChild(_cloud.shape);
                }

Код AS3:

package outside
{
        import flash.display.Shape;
        import flash.events.TimerEvent;
        import flash.utils.Timer;
        //Класс с анимацией. наверное. если это вообще является подобием анимации.
 
        public class Clouds extends Shape
        {
                public var shape:Shape = new Shape;
                public var _alpha:Number;
                public var _cloudX:Number;
                public var _cloudY:Number;
                public var _delay:Number;
                public var _repeatCount:int;
 
                public function Clouds(cloudX:Number = 0, cloudY:Number = 0, alpha:Number = 0.6, delay:Number = 50, repeatCount:int = 0)
                {
                    //отрисовывается что то типо облочка
 
                    function drawCloud():void
                        {
                                _alpha = alpha;
                                _cloudX = cloudX;
                                _cloudY        = cloudY;
                                shape.graphics.lineStyle(2, 0xA0EBFD, _alpha);
                                shape.graphics.beginFill(0xA0EBFD);
                                shape.graphics.drawCircle(100,100,20);
                                shape.graphics.drawCircle(160,100,20);
                                shape.graphics.endFill();
                                shape.graphics.beginFill(0xA0EBFD);
                                shape.graphics.drawCircle(130, 100, 32);
                                shape.graphics.endFill();
                                shape.x = _cloudX;
                                shape.y = _cloudY;
                        }
                        function cloud():void
                        {
                                var timer:Timer = new Timer(_delay, _repeatCount);
                                _delay = delay;
                                _repeatCount = repeatCount;
                                timer.addEventListener(TimerEvent.TIMER, onTimer);
                                timer.start();
                        }
                        function onTimer(event:TimerEvent):void
                        {
                                shape.x++
                        }
                }
        }
}

Сомневаться в том, что я вообще написала что то адекватное смею, т.к это первый код, который написала на as3, да и вообще на яп. sorry:o

Zebestov 14.08.2014 04:05

У тебя сейчас выходит, что drawCloud, cloud и onTimer вложены в конструктор (не являются методами класса) и к тому же они нигде не вызываются.

Логично было бы методы drawCloud и cloud аннулировать вовсе и выполнить все эти действия непосредственно к конструкторе — так мы избежим лишней перепосылки входящих параметров вроде cloudX, alpha, delay и т.д.; а обработчик onTimer по-хорошему вынести бы "за скобку" конструктора и сделать полноценным методом класса.

Код AS3:

package outside
{
        import flash.display.Shape;
        import flash.events.TimerEvent;
        import flash.utils.Timer;
        //Класс с анимацией. наверное. если это вообще является подобием анимации.
 
        public class Clouds extends Shape
        {
                public var shape:Shape = new Shape;
                public var _alpha:Number;
                public var _cloudX:Number;
                public var _cloudY:Number;
                public var _delay:Number;
                public var _repeatCount:int;
 
                public function Clouds(cloudX:Number = 0, cloudY:Number = 0, alpha:Number = 0.6, delay:Number = 50, repeatCount:int = 0)
                {
                        //отрисовывается что-то типо облачка
 
                        /* Это уже не нужно.
                          _alpha = alpha;
                          _cloudX = cloudX;
                          _cloudY = cloudY;  */

                        shape.graphics.lineStyle(2, 0xA0EBFD, alpha); // сработает, но лучше придумать другое имя для параметра
                        shape.graphics.beginFill(0xA0EBFD);
                        shape.graphics.drawCircle(100,100,20);
                        shape.graphics.drawCircle(160,100,20);
                        shape.graphics.endFill();
                        shape.graphics.beginFill(0xA0EBFD);
                        shape.graphics.drawCircle(130, 100, 32);
                        shape.graphics.endFill();
                        shape.x = cloudX;
                        shape.y = cloudY;
 
                        var timer:Timer = new Timer(delay, repeatCount);
 
                        /* Во-первых, почему сначала используем (таймер в оригинале строкой выше),
                          а лишь затем присваиваем значения Оо задом-наперед получается.
                          Во-вторых, уже не нужно.
                          _delay = delay;
                          _repeatCount = repeatCount;  */

                        timer.addEventListener(TimerEvent.TIMER, onTimer);
                        timer.start();
                }
 
                /* Вот теперь это метод класса, а не какая-то функция в теле конструктора. */
                private function onTimer(event:TimerEvent):void
                {
                        shape.x++
                }
        }
}


Gamurari 14.08.2014 13:12

Цитата:

Сообщение от Zebestov (Сообщение 1170563)
У тебя сейчас выходит, что drawCloud, cloud и onTimer вложены в конструктор (не являются методами класса) и к тому же они нигде не вызываются.

Логично было бы методы drawCloud и cloud аннулировать вовсе и выполнить все эти действия непосредственно к конструкторе — так мы избежим лишней перепосылки входящих параметров вроде cloudX, alpha, delay и т.д.; а обработчик onTimer по-хорошему вынести бы "за скобку" конструктора и сделать полноценным методом класса.

Ох, точно, ужас, как же я не логично сделала...
Стоило подправить пару строк и уже совсем по другому выглядит. Да, всё таки в этом деле взгляд опытного человека необходим как воздух...

Всё подправила, как Вы указали, но анимация всё равно не появляется((

Zebestov 14.08.2014 13:36

Хм. Только что скопипастил твой Main и свой Clouds — плывет, родимое!
Может быть дело в том, что в твоем коде класса Main, который приведен здесь на форуме, не хватает двух закрывающих фигурных скобок — они в оригинале есть? Должно было бы насыпать ошибок типа
Код:

…\Main.as, Line 20        1084: Syntax error: expecting rightbrace before end of program.

Gamurari 14.08.2014 14:08

Да нет, никаких ошибок вроде, но вот придупреждений много..
Вообще, то класс main я сократила, там ещё фон есть, может быть он перекрывает облочко?
Код AS3:

package {
    import flash.display.DisplayObject;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.Event;
 
    import outside.Clouds;
 
 
        public class Main extends Sprite
        {       
                var _backgraundColor:uint = 0xE4FFFF;               
                var bgShape:Sprite;
 
                public function Main()
                {
                        backgraundColor();
                        var _cloud:Clouds = new Clouds(0, 10);
                        this.addChild(_cloud.shape);
                }       
 
                private function backgraundColor():void
                {                               
                        bgShape = new Sprite;
                        bgShape.graphics.beginFill(_backgraundColor);
                        bgShape.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
                        addChildAt(bgShape, 0);
                        stage.addEventListener(Event.RESIZE, resizeBgWithStage);                       
                }
                function resizeBgWithStage(e:Event):void
                {
                        try {
                                bgShape.width = stage.stageWidth;
                                bgShape.height = stage.stageHeight;
                        } catch(e){}
                }
        }
}


Zebestov 14.08.2014 14:11

Судя по коду, не перекрывает.

Gamurari 14.08.2014 14:16

Цитата:

Сообщение от Zebestov (Сообщение 1170577)
Судя по коду, не перекрывает.

А что ж такое то ((
мой компьютер решил, что мне не стоит изучить программирование?

Добавлено через 19 минут
Задвигалооооось
Моя невнимательность - я забыла изменить
Код AS3:

var timer:Timer = new Timer(_delay, _repeatCount);
// на
 var timer:Timer = new Timer(delay, repeatCount);

а переменные то удалила...
Спасибо за помощь ^^


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

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