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

iillyyaa 03.09.2010 01:10

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

интереснее даже наверно иметь контейнер в котором нарисован к примеру желтый круг и 2 линии образуя крест (всего 3 элемента выходит)
вот хотелось бы у этого контейнера иметь второй кадр, в котором желтый круг заменить на оранжевый...

или как это лучше сделать ?

что бы при наведении мышки просто менять кадр и всё.

Код AS3:

private function smena2(e:MouseEvent){ e.target.gotoAndStop(2); }
private function smena1(e:MouseEvent){ e.target.gotoAndStop(1); }


Psycho Tiger 03.09.2010 01:13

Если компилируешь FlexSDK - то можно посмотреть в сторону FrameFactory.
В целом "лёгкими" путями - никак.

iillyyaa 03.09.2010 01:19

FlexSDK что есть я не знаю :)
я на as3 хочу написать..

тоесть, средствами as3 нету выбора после создания спрайта рисовать во втором фрейме к примеру ?

как нарисовать крестик в кружке не проблема, засунуть всё в контейнер... вот бы создать и запихнуть бы что то ещё во второй кадр... :)

Stargazer 03.09.2010 01:35

Цитата:

Сообщение от iillyyaa (Сообщение 933216)
вот бы создать и запихнуть бы что то ещё во второй кадр... :)

Не стоит этим утруждаться. Сделайте себе что-то вроде "состояний" для вашего элемента (программно) и при смене состояния, меняйте начинку кнопки.

Wolsh 03.09.2010 11:55

Во-первых, у Спрайта нет и не было кадров. Кадры есть только у МувиКлипов.
Во-вторых, в своем спрайте создаете необходимое количество других спрайтов, каждый из которых представляет "кадр" и вместо перехода по временной линейке gotoAndStop() используете addChild(), помещая свои кадры в список отображения. По-моему разницы никакой в объеме и заморочности работы, просто другое мышление - не лентой картинок со смещением по ней, а колодой изображений, из которой нужное выкладывается на стол.

iillyyaa 03.09.2010 14:13

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

значит создать програмно 2х кадровый мувиклип нельзя ?

Psycho Tiger 03.09.2010 15:20

Цитата:

FlexSDK что есть я не знаю
я на as3 хочу написать..
FlexSDK - это компилятор такой. Пишите на AS3, компилируете им и получаете новые кадры с помощью метатегов, но это не очень приятно =)
Wolsh прав. Если очень хочется - можно написать свой gotoAndStop. В интернете кстати видел (у etc в блоге (etcs.ru) помоему, не помню) пример создания "мувиклипа" с кадрами программно.

Добавлено через 6 минут
iillyyaa, от всей души сделал Вам пример:
Код AS3:

package 
{
        import flash.display.DisplayObject;
        import flash.display.Sprite;
 
 
    public class CustomMovieClip extends Sprite
    {
 
 
                private var _frames:Array;
                private var _totalframes:int;
                private var _currentframe:int;
 
        public function CustomMovieClip():void
        {
                        _totalframes = 0;
                        _currentframe = 0;
                }
 
                public function addFrame(frame:DisplayObject):void {
                        _frames.push(frame);
                        if (++_totalframes == 1) {
                                super.addChild(frame);
                        }
                }
 
                public function gotoAndStop(frame:int):void {
                        if (frame < 1 || frame > _totalframes) throw new ArgumentError("Invalid frame");
                        var i:int = _totalframes;
                        while (i--) {
                                var dp:DisplayObject = _frames[i] as DisplayObject;
                                if (frame != i && super.contains(dp)) super.removeChild(dp);
                        }
                        super.addChild(dp);
                        _currentframe = frame;
                }
 
                public function get totalframes():int { return _totalframes; }
 
                public function get currentframe():int { return _currentframe; }
 
    }
}

Но от природной лени даже не компилировал, оставив честь первой компиляции Вам.
Используя такой подход легко добавить методы removeFrame, gotoAndPlay (используя onEnterFrame), play, stop, addFrameScript и прочие, даже те, которых нету в классическом MovieClip.


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

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