|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Как создать класс наподобие MovieClip
Здравствуйте!
Есть набор картинок. В процессе выполнения эти картинки подгружаются в приложение. Нужно создать класс, который обьединит, например, 10 разных картинок и, при надобности, можно было вызывать: stop(); play(); gotoAndStop(); gotoAndPlay(); currentFrame; и пр. Я не говорю уже о разных свойствах и методах присущих настоящему MovieClip. Мне хотя бы понять как кодом реализовать таймлайн и выполнить минимальные операции над ним. Заранее благодарен.
__________________
Я мало чего умею, но зато хорошо умею учиться... |
|
|||||
Создайте класс на базе МС:
package { import flash.display.MovieClip; public class myMC extends MovieClip { public function myMC():void { // Конструктор класса } } В конструкторе класса объединяйте все что вам надо и распределяйте по фреймам. А в основном коде создавайте экземпляр класса и добавляйте его на сцену |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
__________________
Reality.getBounds(this); |
|
|||||
Спасибо за ответы.
Wolsh, я правильно понял: битмапдата, которая передается - это одна картинка с множеством других картинок? Добавлено через 3 минуты И возможно ли к экземпляру такого класса добавлять другие обьекты:
__________________
Я мало чего умею, но зато хорошо умею учиться... |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Битмапдата – да, Film в буквальном смысле, раскадровка.
Нельзя, это же Битмап)) Я как бы посмотреть, как вариант направления мысли.. Я понимаю что это не 100% то, что нужно Вам. Гдето на форуме были и варианты с отдельнолежащими кадрами, но тут есть неудобство - одну картинку как-то проще засунуть, чем сотню. А так способ неплохой, довольно гибкий, напихать сюда обычного мувиклип-функционала вобщем-то несложно. Да и, если есть такая необходимость, можно не наследовать от Битмапа, а сделать спрайт с композицией.
__________________
Reality.getBounds(this); |
|
|||||
Понял. Спасибо, особенно за "раскадровку". Действительно, если при загрузке сотни картинок произойдет хоть одно "непредвиденное обстоятельство" будут плохие последствия.
А вот Битмап не очень нравится. Надо похимичить над каким-нибудь DisplayObjectContainer.
__________________
Я мало чего умею, но зато хорошо умею учиться... |
|
|||||
Вот что получилось:
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.events.Event; import flash.events.TimerEvent; import flash.geom.Point; import flash.geom.Rectangle; import flash.utils.Timer; /** * Создает анимацию из раскадрированного изображения * @author HardCoder */ public class Movie extends Sprite { private var _frameRate:uint; private var _source:Bitmap; private var _bitmap:Bitmap; private var _bitmapData:BitmapData; private var _playhead:Rectangle; private var _timer:Timer; private var _totalFrames:uint; private var _counter:uint = 0; private var _loopCycle:uint; private var _loop:uint; private var _numCols:uint; private var _isPlaying:Boolean = false; private var _regPoint:Point; /** * Конструктор * @param source - изображение для раскадровки * @param playhead - прямоугольник представляющий один кадр * @param fps - скорость воспроизведения (кадр/сек) * @param regPoint - точка регистрации (по умолчанию x = 0, y = 0) * @param totalFrames - Количество кадров. Необходимо указывать если не все изображение заполнено кадрами */ public function Movie(source:Bitmap, playhead:Rectangle, fps:uint = 24, regPoint:Point = null, totalFrames:uint = 0){ _source = source; _playhead = playhead; _playhead.x = _playhead.y = 0; _frameRate = fps; regPoint ? _regPoint = regPoint : _regPoint = new Point(); _numCols = Math.round(_source.width / _playhead.width); totalFrames != 0 ? _totalFrames = totalFrames : _totalFrames = Math.round(_source.height / _playhead.height) * _numCols; _bitmapData = new BitmapData(_playhead.width, _playhead.height); _bitmap = new Bitmap(_bitmapData); _bitmap.x = _regPoint.x * -1; _bitmap.y = _regPoint.y * -1; _bitmap.bitmapData.copyPixels(_source.bitmapData, _playhead, new Point()); this.addChild(_bitmap); _timer = new Timer(Math.round(1000 / _frameRate)); this.addEventListener(Event.REMOVED_FROM_STAGE, destroy); } //Общедоступные методы ================================================= /** * Воспроизводит анимацию * @param loop - количество воспроизведений (0 - бесконечно) */ public function play(loop:uint = 0):void { stop(); _loop = loop; _isPlaying = true; _timer.delay = Math.round(1000 / _frameRate); _timer.addEventListener(TimerEvent.TIMER, reproduction); _timer.start(); reproduction(); } /** * Останавливает анимацию */ public function stop():void { if (_isPlaying){ _isPlaying = false; _loop = 0; _loopCycle = 0; _timer.stop(); _timer.removeEventListener(TimerEvent.TIMER, reproduction); } } /** * Воспроизводит анимацию с определенного кадра * @param frame - кадр, с которого нужно воспроизвести анимацию * @param loop - количество воспроизведений (0 - бесконечно) */ public function gotoAndPlay(frame:uint, loop:uint = 0):void { if (frame >= 1 && frame <= _totalFrames){ _counter = frame - 1; play(loop); } else { trace("Предупреждение Movie::gotoAndPlay(frame:uint, loop:uint = 0):\n Номер кадра '" + frame + "' выходит за пределы допустимых значений"); } } /** * Переход на определенный кадр и остановка анимации * @param frame - кадр, на который необходимо перейти */ public function gotoAndStop(frame:uint):void { if (frame >= 1 && frame <= _totalFrames){ stop(); _counter = frame - 1; reproduction(); } else { trace("Предупреждение Movie::gotoAndStop(frame:uint):\n Номер кадра '" + frame + "' выходит за пределы допустимых значений"); } } /** * Переходит к следующему кадру и останавливается */ public function nextFrame():void { if (_counter < _totalFrames + 1){ reproduction(); stop(); } else { trace("Предупреждение Movie::nextFrame():\n Невозможно перейти к следующему кадру"); } } /** * Переходит к предыдущему кадру и останавливается */ public function prevFrame():void { if (_counter > 1){ _counter -= 2; reproduction(); stop(); } else { trace("Предупреждение Movie::prevFrame():\n Невозможно перейти к предыдущему кадру"); } } //Общедоступные свойства =============================================== /** * Количество кадров (только для чтения) */ public function get totalFrames():uint { return _totalFrames; } /** * Текущий кадр (только для чтения) */ public function get currentFrame():uint { return Math.round(_playhead.y / _playhead.height) * _numCols + Math.round(_playhead.x / _playhead.width) + 1; } /** * Скорость воспроизведения (кадр/сек) */ public function get frameRate():uint { return _frameRate; } /** * Скорость воспроизведения (кадр/сек) */ public function set frameRate(fps:uint):void { _frameRate = fps; _timer.delay = Math.round(1000 / _frameRate); } /** * Точка регистрации (только для чтения) */ public function get regPoint():Point { return _regPoint; } /** * Состояние воспроизведения (проигрывается/не проигрывается) (только для чтения) */ public function get isPlaying():Boolean { return _isPlaying; } //====================================================================== private function reproduction(e:TimerEvent = null):void { _playhead.x = (_counter % _numCols) * _playhead.width; _playhead.y = (Math.ceil((_counter + 1) / _numCols) - 1) * _playhead.height; _bitmap.bitmapData.copyPixels(_source.bitmapData, _playhead, new Point()); if (_counter == _totalFrames - 1){ _loopCycle++; if (_loopCycle == _loop){ stop(); return; } _counter = 0; return; } _counter++; } private function destroy(e:Event):void { this.removeEventListener(Event.REMOVED_FROM_STAGE, destroy); stop(); } } }
__________________
Я мало чего умею, но зато хорошо умею учиться... Последний раз редактировалось HardCoder; 11.11.2011 в 14:01. |
Часовой пояс GMT +4, время: 17:52. |
|
« Предыдущая тема | Следующая тема » |
|
|