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

Михаил Свинцов 08.03.2012 19:22

Анимация исчезновения
 
мне нужно чтоб текст (nam) исчезал через каждые 0,01 секунды я набросал вот такой код:
Код AS3:

package p {
        import flash.display.*;
        import flash.utils.*;
        import flash.net.*;
        import flash.events.*;
        import flash.text.*;
        import flash.display.Sprite;
        import flash.display.DisplayObjectContainer;
 
        public class DrawName extends MovieClip {
                private var nam;
                private var cont:Sprite = new Sprite();
                private var timer;
                public function DrawName() {
                }
 
                public function drawNam(){
                        trace('Класс, анимирующий название модуля');
                        this.nam = new CreateButton('Кожа', 30, 0xff0000, "Times New Roman", true, false, 90, 60,
                                                                          100, 100, TextFieldAutoSize.CENTER,
                                                                          TextFormatAlign.CENTER, false, null, false, null,
                                                                          false, null);
                        this.cont.addChild(nam);
                        this.cont.alpha = 1;
                        addChild(cont);
                        this.timer = new Timer(100, 0);
                        this.timer.addEventListener(TimerEvent.TIMER, timerListener);
                        this.timer.start();
                }
                private function timerListener(e:TimerEvent) {
                        trace(this.cont.alpha);
                        this.cont.alpha -= 0.01;
                        addChild(cont);
                }
        }
}

Добавлено через 49 секунд
я с таймером еще не встречался поэтому сразу извините если где-то что-то глупо

TanaTiX 08.03.2012 19:46

А что не работает? Или это урок? Если так, то слабенький вышел, но все равно похвально.
По сабжу. Во-первых 0,01 секунда - это 10 мс, а не 100, как у вас. Но выставлять такие маленькие таймеры, на сколько помню, даже адоб не рекомендует. Таймер вечен, а должен останавливаться.
Еще не понятно что такое CreateButton. Ну и название класса не совсем вяжется с его потенциальными возможностями.

MikroAcse 08.03.2012 20:09

Немного поправлю:
Код AS3:

package p {
        import flash.display.*;
        import flash.utils.*;
        import flash.net.*;
        import flash.events.*;
        import flash.text.*;
        import flash.display.Sprite;
        import flash.display.DisplayObjectContainer;
 
        public class DrawName extends MovieClip {
                private var nam;
                private var cont:Sprite = new Sprite();
                private var timer;
                public function DrawName() {
                }
 
                public function drawNam(){
                        this.nam = new CreateButton('Кожа', 30, 0xff0000, "Times New Roman", true, false, 90, 60,
                                                                          100, 100, TextFieldAutoSize.CENTER,
                                                                          TextFormatAlign.CENTER, false, null, false, null,
                                                                          false, null);
                        this.cont.addChild(nam);
                        this.cont.alpha = 1;
                        addChild(cont);
                        this.timer = new Timer(10, this.cont.alpha/0.01);
                        this.timer.addEventListener(TimerEvent.TIMER, timerListener);
                        this.timer.start();
                }
                private function timerListener(e:TimerEvent) {
                        this.cont.alpha -= 0.01;
                        addChild(cont);
                }
        }
}

Твин не должен быть вечен (в таких случаях).

Михаил Свинцов 08.03.2012 20:10

CraeateButton отвечает за создание кнопок(что чаще) и текста. И не надо ничего больше про это. Ограничение на таймер поставил ничего не появилось. И кстати пробовал и раз в секунду делать тож ничего. добавлял updateAfterEvent все равно ничего

Добавлено через 1 минуту
вот что сейчас у меня
Код AS3:

package p {
        import flash.display.*;
        import flash.utils.*;
        import flash.net.*;
        import flash.events.*;
        import flash.text.*;
        import flash.display.Sprite;
        import flash.display.DisplayObjectContainer;
 
        public class DrawName extends MovieClip {
                private var nam;
                private var cont:Sprite = new Sprite();
                private var timer;
                public function DrawName() {
                }
 
                public function drawNam(){
                        trace('Класс, анимирующий название модуля');
                        this.nam = new CreateButton('Кожа', 30, 0x000000, "Times New Roman", true, false, 90, 60,
                                                                          100, 100, TextFieldAutoSize.CENTER,
                                                                          TextFormatAlign.CENTER, false, null, false, null,
                                                                          false, null);
                        cont.addChild(nam);
                        cont.alpha = 1;
                        addChild(cont);
                        timer = new Timer(50, 0);
                        timer.addEventListener(TimerEvent.TIMER, timerListener);
                        timer.start();
                }
                public function timerListener(e:TimerEvent) {
                        if(cont.alpha > 0) {
                                cont.alpha -= 0.01;
                                e.updateAfterEvent();
                        } else {
                                timer.stop();
                        }
                }
        }
}


MikroAcse 08.03.2012 20:13

Лучше делать как я сказал, так и затрат на if/else будет меньше.

Михаил Свинцов 08.03.2012 20:14

ок щас попробую

MikroAcse 08.03.2012 20:14

Ты имел ввиду, что у тебя не работает?
Должно работать.

Михаил Свинцов 08.03.2012 20:15

ничего...(((

Добавлено через 56 секунд
у меня ничего не появляется хотя надпись изначально созданная сначала должна появиться а потом плавно исчезнуть

MikroAcse 08.03.2012 20:19

Попробуй так:
Код AS3:

package p {
        import flash.display.*;
        import flash.utils.*;
        import flash.net.*;
        import flash.events.*;
        import flash.text.*;
        import flash.display.Sprite;
        import flash.display.DisplayObjectContainer;
 
        public class DrawName extends MovieClip {
                private var nam:CreateButton;
                private var cont:Sprite = new Sprite();
                private var timer:Timer;
                public function DrawName() {
                }
 
                public function drawNam(){
                        this.nam = new CreateButton('Кожа', 30, 0xff0000, "Times New Roman", true, false, 90, 60,
                                                                          100, 100, TextFieldAutoSize.CENTER,
                                                                          TextFormatAlign.CENTER, false, null, false, null,
                                                                          false, null);
                        this.cont.addChild(nam);
                        this.cont.alpha = 1;
                        addChild(cont);
                        this.timer = new Timer(100, this.cont.alpha/0.05);
                        this.timer.addEventListener(TimerEvent.TIMER, timerListener);
                        this.timer.start();
                }
                private function timerListener(e:TimerEvent) {
                        this.cont.alpha -= 0.05;
                        addChild(cont);
                }
        }
}

Если ничего, то попробуй вместо строчки:
Код AS3:

addChild(cont);

Написать:
Код AS3:

setChildIndex(cont, numChildren-1);


Михаил Свинцов 08.03.2012 20:19

а может через setInterval как нибудь попробовать

Добавлено через 2 минуты
после добавления сетчилдиндекс выскочила ошибка RangeError: Error #2006: The supplied index is out of bounds.

Добавлено через 5 минут
вот после всех изменений
Код AS3:

package p {
        import flash.display.*;
        import flash.utils.*;
        import flash.net.*;
        import flash.events.*;
        import flash.text.*;
        import flash.display.Sprite;
        import flash.display.DisplayObjectContainer;
 
        public class DrawName extends MovieClip {
                private var nam;
                private var cont:Sprite = new Sprite();
                private var timer;
                public function DrawName() {
                }
 
                public function drawNam(){
                        this.nam = new CreateButton('Кожа', 30, 0xff0000, "Times New Roman", true, false, 90, 60,
                                                                          100, 100, TextFieldAutoSize.CENTER,
                                                                          TextFormatAlign.CENTER, false, null, false, null,
                                                                          false, null);
                        this.cont.addChild(nam);
                        this.cont.alpha = 1;
                        addChild(cont);
                        this.timer = new Timer(100, this.cont.alpha/0.05);
                        this.timer.addEventListener(TimerEvent.TIMER, timerListener);
                        this.timer.start();
                }
                private function timerListener(e:TimerEvent) {
                        this.cont.alpha -= 0.05;
                        addChild(cont);
                }
        }
}


MikroAcse 08.03.2012 20:25

Цитата:

после добавления сетчилдиндекс выскочила ошибка RangeError: Error #2006: The supplied index is out of bounds.
У вас stage должен быть доступным.

Михаил Свинцов 08.03.2012 20:26

всмысле stage должен быть доступен, из-за чего он может быть недоступен

MikroAcse 08.03.2012 20:29

Ты вообще как drawNam вызываешь?

Михаил Свинцов 08.03.2012 20:31

Код AS3:

private var drawn = new DrawName();
        drawn.drawNam();

Добавлено через 1 минуту
что-то не так с вызовом?

Wolsh 08.03.2012 20:38

1) У альфы 256 делений (0-255). Изменение на 0.01 делает график неровным, и это заметно глазу. Сделайте константу 1/255.
2) 0.01 секунда это 100 изменений в секунду. Вы собираетесь установить ролику такой fps? Adobe рекомендует ставить таймер не менее 20 ms, то есть 50 fps, но и это обычно многовато и скорее всего приведет к дерганой анимации. updateAfterEvent() тоже не спасет, особенно если в это время будут происходить и другие перерисовки в окне плеера.
3) Рискую начать очередной холивар, но не пойму, при чем тут this? В классе нет ни одного геттера/сеттера и ни одного паблика. Обращение через экземпляр к приватным полям выглядит как-то нелепо и сбивает с толку. Приватные они и есть приватные, ни к каким чужим ("не this.") приватным полям Вам при всем желании не обратиться. Просто "бекоз ай кэн"? Лучше используйте this для обозначения, что обращаетесь к пабликам экземпляра. Приватные переменные удобно обозначать подчерком в начале, как рекомендует конвенция для storage variables геттеров и сеттеров.

MikroAcse 08.03.2012 20:39

Код AS3:

private var drawn = new DrawName();
addChild(drawn);
drawn.drawNam();

Казалось бы, такая сложная задача :)

Wolsh 08.03.2012 20:40

Обалдеть. Пока писал, появилось 13 сообщений.

Добавлено через 32 секунды
14....

Михаил Свинцов 08.03.2012 20:41

а я думал альфа от 0 до 1

MikroAcse 08.03.2012 20:43

Цитата:

а я думал альфа от 0 до 1
Так и есть. Ты просто его не понял.

КорДум 08.03.2012 20:45

Код AS3:

package {
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.TimerEvent;
        import flash.text.TextField;
        import flash.utils.Timer;
 
        /**
        * @author KorDum
        */

 
        public class Main extends Sprite {
                private const ALPHA_STEP:Number = 0.1;
 
                private var _timer:Timer;
                private var _textField:TextField;
 
                //---------------------------------------------------------------------------
                //
                // CONSTRUCTOR
                //
                //---------------------------------------------------------------------------
 
                public function Main():void {
                        addEventListener(Event.ADDED_TO_STAGE, initHandler);
                }
 
 
                //---------------------------------------------------------------------------
                //
                // PRIVATE HANDLERS
                //
                //---------------------------------------------------------------------------
 
                private function initHandler(event:Event = null):void {
                        removeEventListener(Event.ADDED_TO_STAGE, initHandler);
 
                        _textField = new TextField();
                        _textField.text = "text";
 
                        addChild(_textField);
 
                        _timer = new Timer(100, 10);
                        _timer.addEventListener(TimerEvent.TIMER, timer_timerHandler);
                        _timer.addEventListener(TimerEvent.TIMER_COMPLETE, timer_timerCompleteHandler);
                        _timer.start();
                }
 
 
                private function timer_timerCompleteHandler(event:TimerEvent):void {
                        _timer.removeEventListener(TimerEvent.TIMER, timer_timerHandler);
                        _timer.removeEventListener(TimerEvent.TIMER_COMPLETE, timer_timerCompleteHandler);
                        _timer = null;
 
                        removeChild(_textField);
                        _textField = null;
                }
 
 
                private function timer_timerHandler(event:TimerEvent):void {
                        _textField.alpha -= ALPHA_STEP;
                }
        }
}

Полностью рабочий пример.

Wolsh 08.03.2012 20:46

255 отрезков от 0 до 1. В чем противоречие?

MikroAcse 08.03.2012 20:47

КорДум, зачем так много строк кода?
Это совсем простая задача, и не надо делать ее такой сложной...
Только больше заморочек сами себе делаете.

КорДум 08.03.2012 20:50

Два хендлера и код iniHandler — много?, Остальное создалось автоматически из моих темплейтов.

Михаил Свинцов 08.03.2012 20:50

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

package p {
        import flash.display.*;
        import flash.utils.*;
        import flash.net.*;
        import flash.events.*;
        import flash.text.*;
        import flash.display.Sprite;
        import flash.display.DisplayObjectContainer;
 
        public class DrawName extends MovieClip {
                private var nam;
                private var cont:Sprite = new Sprite();
                private var timer;
                public function DrawName() {
                }
 
                public function drawNam(){
                        nam = new CreateButton('Кожа', 30, 0x000000, "Times New Roman", true, false, 90, 60,
                                                                          100, 100, TextFieldAutoSize.CENTER,
                                                                          TextFormatAlign.CENTER, false, null, false, null,
                                                                          false, null);
                        cont.addChild(nam);
                        cont.alpha = 1;
                        addChild(cont);
                        timer = new Timer(100, 256);
                        timer.addEventListener(TimerEvent.TIMER, timerListener);
                        timer.start();
                }
                private function timerListener(e:TimerEvent) {
                        cont.alpha -= 1/255;
                        addChild(cont);
                        e.updateAfterEvent();
                }
        }
}

Добавлено через 2 минуты
Wolsh да сглупил мельком прочитал не вдумался щас понял о чем ты

MikroAcse 08.03.2012 20:56

Сделал один простенький пример:
Код AS3:

                        var spr:Sprite=new Sprite();
                        addChild(spr);
                        spr.graphics.beginFill(0xFF0000);
                        spr.graphics.drawCircle(0,0,50);
                        spr.x=spr.y=100;
                        spr.alpha=1;
 
                        var timer:Timer=new Timer(50);
                        timer.start();
                        timer.addEventListener(TimerEvent.TIMER, timerHandler);
 
                        function timerHandler(e:TimerEvent):void {
                                if(spr.alpha==0){
                                        timer.stop();
                                } else {
                                        addChild(spr);
                                        spr.alpha-= 1/timer.delay;
                                }
                        }

Может, поможет...

Добавлено через 1 минуту
Цитата:

255 отрезков от 0 до 1. В чем противоречие?
Не согласен.
Альфа вообще не округляется.

Михаил Свинцов 08.03.2012 21:03

вот код опять неполучается
Код AS3:

package p{
        import flash.display.*;
        import flash.utils.*;
        import flash.net.*;
        import flash.events.*;
        import flash.text.*;
        import flash.display.Sprite;
        import flash.display.DisplayObjectContainer;
 
        public class DrawName extends MovieClip {
                private var nam;
                private var cont:Sprite=new Sprite  ;
                private var timer;
 
                public function DrawName() {
                }
                public function drawNam() {
 
                        nam = new CreateButton('Кожа',30,0x000000,"Times New Roman",true,false,
                                                                90,60,100,100,TextFieldAutoSize.CENTER,TextFormatAlign.CENTER,
                                                                false,null,false,null,false,null);
                        cont.addChild(nam);
                        cont.alpha = 1;
                        addChild(cont);
                        timer = new Timer(51);
                        timer.start();
                        timer.addEventListener(TimerEvent.TIMER,timerListener);
                }
                private function timerListener(e:TimerEvent) {
                        if (cont.alpha == 0) {
                                timer.stop();
                        } else {
                                addChild(cont);
                                cont.alpha -= 1 / timer.delay;
                        }
                }
        }
}


FriOne 08.03.2012 21:04

Михаил, текст не исчезает плавно или вообще не меняет прозрачность?

MikroAcse 08.03.2012 21:05

А ты вообще что-то видишь на сцене?

Михаил Свинцов 08.03.2012 21:06

да я вижу все(в т.ч. и надпись nam), но эта надпись ни плавно ни мгновенно не меняет плавность

FriOne 08.03.2012 21:07

Шрифт внедрить похоже просто надо.

Михаил Свинцов 08.03.2012 21:07

я кстати там вродь намудрил с корректированием альфы и delay таймера, потому что всяко перепробовал и ничего не получалось

Добавлено через 1 минуту
да видно у меня надпись шрифта Times New Roman размером 30 пикселей черного цвета полужирный и находится он в точке 90, 60

Добавлено через 3 минуты
я уже писал но может никто не заметил, а если сделать через setInterval функция древняя еще с ас1 но в нем она всегда помогала

FriOne 08.03.2012 21:11

Если шрифт не внедрен, текст отображается, но альфа не меняется, вроде так.

MikroAcse 08.03.2012 21:11

Пару советов.
1)Не надо ставить везде звездочки, потому что это нагружает флешку:
Код AS3:

import flash.display.*;
import flash.utils.*;
import flash.net.*;
import flash.events.*;
import flash.text.*;

Импортируй только то, что пригодится.

2) После названий функций пиши void, если они ничего не возвращают:
Код AS3:

public function DrawName():void {
public function drawNam():void {
private function timerListener(e:TimerEvent):void {

3) Всегда пиши класс объекта:
Код AS3:

private var nam:CreateButton;
private var cont:Sprite=new Sprite();
private var timer:Timer;

4) Давай объектам понятное название.
5) Сначала добавь один объекта, и только потом добавляй другой объект в него:
Код AS3:

addChild(cont);
cont.addChild(nam);
cont.alpha = 1;

Еще вспомню, скажу :)

Михаил Свинцов 08.03.2012 21:11

как может быть не внедрен системный шрифт??

Добавлено через 1 минуту
я знаю что со стилем у меня проблемы, я перешел с ас1 а там типы не писались, и насчет пункта 5 разве есть разница??

Добавлено через 2 минуты
и названия для меня понятные

КорДум 08.03.2012 21:14

Цитата:

Не надо ставить везде звездочки, потому что это нагружает флешку:
Неправда. Это сокращает запись и только. Засоряет список автокомплита еще.
Цитата:

Импортируй только то, что пригодится.
Ненужные импорты отсекутся компилятором.

Михаил Свинцов 08.03.2012 21:16

давайте к теме вернемся

MikroAcse 08.03.2012 21:18

Переписал функцию в свой класс, и все нормально работает:
Код AS3:

package {
 
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.text.TextField;
        import flash.utils.Timer;
        import flash.events.TimerEvent;
        import flash.events.Event;
 
 
        public class Main extends MovieClip {
 
                public var txt:TextField;
                public var container:Sprite;
                public var timer:Timer;
                /*
                * MAIN CLASS
                */

                public function Main() {
                        if(stage)
                                init(null);
                        else
                                addEventListener(Event.ADDED_TO_STAGE, this.init);
                }
                /*
                * INIT
                */

                public function init(e:Event):void {
                        drawNam();
                }
                public function drawNam() {
                        container=new Sprite();
                        txt=new TextField();
 
                        txt.text='Hi! I am Mike!';
                        txt.textColor=0xFF0000;
 
                        addChild(container);
                        container.addChild(txt);
                        container.alpha = 1;
 
                        timer = new Timer(51);
                        timer.start();
                        timer.addEventListener(TimerEvent.TIMER,timerListener);
                }
                private function timerListener(e:TimerEvent) {
                        if (container.alpha == 0) {
                                timer.stop();
                        } else {
                                addChild(container);
                                container.alpha -= 1 / timer.delay;
                        }
                }
        }
}

Добавлено через 1 минуту
Цитата:

Неправда. Это сокращает запись и только. Засоряет список автокомплита еще.
Цитата:

Ненужные импорты отсекутся компилятором.
Спасибо за поправку. А то я всегда задавал себе вопрос:
Цитата:

Правильно я думаю или нет?

dimarik 08.03.2012 21:21

Цитата:

Цитата:

после добавления сетчилдиндекс выскочила ошибка RangeError: Error #2006: The supplied index is out of bounds.
У вас stage должен быть доступным.
Эта ошибка индекса дитя в контейнере. При чем тут stage?!

Цитата:

Пару советов.
1)Не надо ставить везде звездочки, потому что это нагружает флешку:
Мозг тимлидера это напрягает, а не "флешку".

— Когда Вы говорите, Иван Васильевич, впечатление такое, что Вы бредите.

Wolsh 08.03.2012 21:21

Ради эксперимента. Поставь
Код AS3:

cont.filters = [new DropShadowFilter()];

и посмотри, меняется ли прозрачность.

dimarik 08.03.2012 21:25

Михаил Свинцов, в десятке можно обойтись без ембединга


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

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