Custom MovieClip
Alpha 1.02
package com.in4core.display { import flash.display.DisplayObject; import flash.display.Sprite; import flash.errors.IllegalOperationError; import flash.events.Event; import flash.events.TimerEvent; import flash.utils.Timer; /** * ... * @author in4core * Custom programmatic MovieClip class. * Licensed under the MIT License * * v.1.02 ChangeLog : * * 1. User frameRate for every MRIP * 2. More Overriden * 3. sets or get frameRate runTime * 4. gotoAndPlay method now accept label or frameNum * 5. Added new method *addAnimatedSequence(sequence:Array of DO)* * 6. Added new method *searchChildInFrames(d:DisplayObject):DisplayObject* * 7. getFrameByNumber moved to private * 8. Added new methods *clearFrame(frame:*) , clearAllFrames()* * 9. 7 moved in getFrameFrom(frame:*):Sprite * 10. Added new method setFrameAlpha/getFrameAlpha * */ public class AdvancedMovieClip extends Sprite implements IAdvancedMovieClip { private var _vFrames:Vector.<Frame> = new Vector.<Frame>(); private var _curFrame:uint = 0; private var _isplayFirst:Boolean = true; private var _timer:Timer = new Timer(0); ///////////////////////////////////////////////////////////////////// //!4 //! 4 CONSTRUCTOR //! 4 ///////////////////////////////////////////////////////////////////// public function AdvancedMovieClip(frames:uint = 5 , frameRate:int = 30) { super(); _timer.delay = 1000 / frameRate; _timer.addEventListener(TimerEvent.TIMER , onFrame); if (!frames) throw new IllegalOperationError(' even sprite has 1 frame '); for (var i:uint = 0; i < frames; i++) this._vFrames.push ( new Frame('' , i) ); _fillContainer(); } ///////////////////////////////////////////////////////////////////// //!4 //! 4 PUBLIC ( IAdvancedMovieClip ) //! 4 ///////////////////////////////////////////////////////////////////// public function addFrames(amount:uint):uint { for (var i:int = 0; i < amount; i++) { const frame:Frame = new Frame('' , _vFrames.length - 1); this._vFrames.push ( frame ); super.addChild ( frame ); } return this.framesCount; } public function get framesCount():uint { return this._vFrames.length; } public function setFrameLabel(label:String , frame:uint):void { if (frame > this._vFrames.length - 1 ) return; this._vFrames[frame].label = label; } public function addChildInFrame(frameNum:uint , child:DisplayObject):DisplayObject { return this._vFrames[frameNum].addChild(child); } public function addAnimatedSequence(sequence:Array/*of DO*/):uint { if (sequence.length > _vFrames.length) addFrames( sequence.length - _vFrames.length); for (var i:int = 0; i < framesCount; i++) { if (! (sequence[i] is DisplayObject) ) throw new IllegalOperationError('sequence can accept only DO array'); _vFrames[i].addChild(sequence[i]); } return framesCount; } public function searchChildInFrames(d:DisplayObject):DisplayObject { for (var i:int = 0; i < framesCount; i++) { var frame:Frame = _vFrames[i] as Frame; for (var j:int = 0; j < frame.numChildren; j++) { if ( frame.getChildAt(j) == d ) return frame.getChildAt(j); } } return null; } public function clearFrame(frame:*/*uint or string if label*/):void { var $frame:Frame; if (frame is Number) { $frame = getFrameByNumber(frame); if ($frame) while ($frame.numChildren) $frame.removeChildAt(0); } else if (frame is String) { $frame = getFrameByLabel(frame); if ($frame) while ($frame.numChildren) $frame.removeChildAt(0); } } public function clearAllFrames():void { for (var i:int = 0; i < framesCount; i++) { var frame:Frame = _vFrames[i] as Frame; while (frame.numChildren) frame.removeChildAt(0); } } public function getFrameFrom(frame:*/*uint or string if label*/):Sprite { var $frame:Frame; if (frame is Number) { $frame = getFrameByNumber(frame); if ($frame) return $frame as Sprite; } else if (frame is String) { $frame = getFrameByLabel(frame); if ($frame) return $frame as Sprite; } return null; } public function setFrameAlpha(n:Number , frame:uint):void { var $frame:Frame = getFrameByNumber(frame); if ($frame) $frame.alpha = n; } public function getFrameAlpha(frame:uint):Number { var $frame:Frame = getFrameByNumber(frame); if ($frame) return $frame.alpha; return -1; } public function set frameRate(rate:int):void { _timer.stop(); _timer.delay = 1000 / rate; _timer.start(); } public function get frameRate():int { return _timer.delay; } ///////////////////////////////////////////////////////////////////// //!4 //! 4 OVERRIDEN //! 4 ///////////////////////////////////////////////////////////////////// override public function addChild(child:DisplayObject):DisplayObject { return this._vFrames[_curFrame].addChild(child); } override public function addChildAt(child:DisplayObject, index:int):DisplayObject { return this._vFrames[_curFrame].addChildAt(child, index); } override public function removeChild(child:DisplayObject):DisplayObject { return this._vFrames[_curFrame].removeChild(child); } override public function removeChildAt(index:int):DisplayObject { return this._vFrames[_curFrame].removeChildAt(index); } override public function getChildByName(name:String):DisplayObject { return this._vFrames[_curFrame].getChildByName(name); } override public function getChildIndex(child:DisplayObject):int { return this._vFrames[_curFrame].getChildIndex(child); } ///////////////////////////////////////////////////////////////////// //!4 //! 4 PUBLIC PLAYER //! 4 ///////////////////////////////////////////////////////////////////// public function get isPlaying():Boolean { return _timer.running; } public function gotoAndStop(frame:*/*uint or string if label*/):void { stop(); if(frame is Number) { if (frame >= _vFrames.length) return; this._vFrames[_curFrame].visible = false; this._vFrames[frame].visible = true; this._curFrame = frame; } else if (frame is String) { var $frame:Frame = getFrameByLabel(frame); if ($frame) { this._vFrames[_curFrame].visible = false; this._curFrame = $frame.number; this._vFrames[_curFrame].visible = true; } } } public function gotoAndPlay(frame:*/*uint or string if label*/):void { stop(); if(frame is Number) { this._vFrames[_curFrame].visible = false; this._vFrames[frame].visible = true; if (frame >= _vFrames.length) this._curFrame = 0; else this._curFrame = frame; } else if (frame is String) { gotoAndStop(frame); } play(); } public function nextFrame():void { this._curFrame++; try { this._vFrames[_curFrame].visible = true; this._vFrames[_curFrame - 1].visible = false; } catch (e:Error) { this._curFrame--; } } public function prevFrame():void { this._curFrame--; try { this._vFrames[_curFrame].visible = true; this._vFrames[_curFrame + 1].visible = false; } catch (e:Error) { this._curFrame++; } } public function play():void { if (this._vFrames.length > 1) this._timer.start(); } public function stop():void { this._timer.reset(); } ///////////////////////////////////////////////////////////////////// //!4 //! 4 PRIVATE //! 4 ///////////////////////////////////////////////////////////////////// private function _resortFrames():void { for (var i:uint = 0; i < _vFrames.length; i++) _vFrames[i].number = i; } private function _clearContainer():void { while (super.numChildren) super.removeChildAt(0); } private function _fillContainer():void { for (var i:uint = 0; i < this._vFrames.length; i++) { super.addChild (_vFrames[i]); this._vFrames[i].visible = false; this._vFrames[_curFrame].visible = true; } } private function getFrameByLabel(label:String):Frame { for (var i:int = 0; i < this._vFrames.length; i++) { if (this._vFrames[i].label == label) return this._vFrames[i]; } return null; } private function onFrame(e:TimerEvent):void { if (this._curFrame < this._vFrames.length - 1) nextFrame(); else { this._vFrames[_curFrame].visible = false; this._vFrames[0].visible = true; this._curFrame = 0; } } private function getFrameByNumber(num:uint):Frame { for (var i:int = 0; i < this.framesCount; i++) { if (this._vFrames[i].number == num) return this._vFrames[i]; } return null; } } } ///////////////////////////////////////////////////////////////////// //!4 //! 4 FRAME DEFINITION //! 4 ///////////////////////////////////////////////////////////////////// import flash.display.Sprite; internal class Frame extends Sprite { private var _label:String = ''; private var _number:uint = 0; public function Frame(l:String = '' , n:uint = 0) { super(); this.label = l; this.number = n; this.visible = false; } public function get label():String { return _label; } public function set label(value:String):void { _label = value; } public function get number():uint { return _number; } public function set number(value:uint):void { _number = value; } }
package com.in4core.display { import flash.display.DisplayObject; import flash.display.Sprite; /** * ... * @author in4core */ public interface IAdvancedMovieClip { function addFrames(amount:uint):uint; function setFrameLabel(label:String , frame:uint):void; function addChildInFrame(frameNum:uint , child:DisplayObject):DisplayObject; function addAnimatedSequence(sequence:Array/*of DO*/):uint; function searchChildInFrames(d:DisplayObject):DisplayObject; function clearFrame(frame:*/*uint or string if label*/):void; function clearAllFrames():void; function getFrameFrom(frame:*/*uint or string if label*/):Sprite; function setFrameAlpha(n:Number , frame:uint):void function getFrameAlpha(frame:uint):Number; function set frameRate(rate:int):void; function get frameRate():int; function get framesCount():uint; function get isPlaying():Boolean; function addChild(child:DisplayObject):DisplayObject; function addChildAt(child:DisplayObject, index:int):DisplayObject; function removeChild(child:DisplayObject):DisplayObject; function removeChildAt(index:int):DisplayObject; function getChildByName(name:String):DisplayObject; function getChildIndex(child:DisplayObject):int; function gotoAndStop(frame:*/*uint or string if label*/):void; function gotoAndPlay(frame:*/*uint or string if label*/):void; function nextFrame():void; function prevFrame():void; function play():void; function stop():void; } }
Всего комментариев 50
Комментарии
![]() ![]() |
|
Практическое применение? Или просто разработка для себя? Зачем? Разве что из интереса.
|
![]() ![]() |
|
Цитата:
Зачем?
Очень интересно будет посмотреть аналогичное для Sprite |
![]() ![]() |
|
Еще интересно, зачем тут интерфейс? Я бы расширил обычный flash.display.MovieClip и заоверрайдил все нужные методы. Дабы была полная взаимозаменяемость
|
![]() ![]() |
|
Да про интерфейс тоже хотел узнать. Было бы неплохо сделать мувик фреймрейтонезависимым от основной сцены.
|
![]() ![]() |
|
Psycho Tiger, если предположить, что использование лицензионного IDE слишком накладно, а работать с мувиками как-то надо... Но это все конечно за уши притянуто.
|
![]() ![]() |
|
..... графомания какая-то...
|
![]() ![]() |
|
Цитата:
Psycho Tiger: Покажите мне хоть одного вменяемого флешера, у которого нету Flash IDE?
|
![]() ![]() |
|
Сочувствую.
Купите, наконец. |
![]() ![]() |
|
Называй классы понятно - MovieRIP - это вообще беспредел какой-то
Обзови просто ProgrammingMovieClip или CustomMovieClip, наконец. |
![]() ![]() |
|
Почемуж беспредел? ) хоязин барин)) Ну вообще конечно можно и получше назвать.. подумаю
|
![]() ![]() |
|
Как вы яхту назовете...
|
![]() ![]() |
|
Так скажем это выражение применимо не совсем везде. ))
|
![]() ![]() |
|
Обновлено до версии 1.02 лог изменений в хидере
|
![]() ![]() |
|
Ну и coeff = 20/30 = 0.6666;
movieCurrentFrame = Math.floor(stageCurrentFrame * coeff); |
![]() ![]() |
|
getFrameByNumber фееричненький метод.
|
![]() ![]() |
|
smithy - у меня CustomMC ане просто mc - чайлды тока в кадрах, тоесть в отдельных спрайтах, и чтобы до них долезть надо серчить в каждом из них.
|
![]() ![]() |
|
Господа, ничего не понимаю (летчик.jpg).
Раз уж автор не соизволил, то кто мне вкратце объяснит, что это за RIP? |
![]() ![]() |
|
Rest In Peace?
![]() |
![]() ![]() |
|
@ dimarik, а что же Вас беспокоит в данной фразе ?)
|
![]() ![]() |
|
RIP: вымысел или реальность? MovieRIP: НЛО существует!
Что, черт возьми, делает этот RIP и на кой он нужен? |
![]() ![]() |
|
getFrameAlpha? Очень интересно. Альфа. У кадра. Да. Альфа. У кадра.
А! Flash IDE никак не отпускает. Понятно. |
![]() ![]() |
|
@in4core, ну да, согласен про RTE, иногда так хочется чтобы эти дурацкие RTE не вылазили, особенно после релиза. Но что поделаешь
![]() |
![]() ![]() |
|
Фреймво... что?
|
![]() ![]() |
|
![]() ![]() |
|
Цитата:
Ну, вы блин даёте! ©
@in4core, вот еще хотел спросить про класс Frame: во-первых, зачем у кадра поле _number? Кадры лежат в массиве, и вполне логично что номер кадра = индекс в массиве + 1. Во-вторых - зачем в internal классе геттеры и сеттеры на поля, которые все равно никто кроме MovieRIP не увидит? Там можно смело было бы обойтись public var. |
|
Обновил(-а) smithy 13.12.2011 в 11:54
|
![]() ![]() |
|
@fish_r, smithy просто забыл bb-коды [sarcasm]...[/sarcasm]
|
![]() ![]() |
|
Тест. [irony]фреймворк[/irony]
|
![]() ![]() |
|
MovieTRIP
|
![]() ![]() |
|
спасибо)
|
Последние записи от in4core
- Система диалогов, создаем подобие old School типа Fallout. (07.05.2014)
- MVC в игорной индустрии (27.11.2012)
- Якорь мне .... ))) Или History API (06.11.2012)
- FSD - учим php/sql (28.06.2012)
- I4Logger - простой и компактный логгер (06.05.2012)