Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.11.2011, 23:01
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 1  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
По умолчанию Как создать класс наподобие MovieClip

Здравствуйте!
Есть набор картинок. В процессе выполнения эти картинки подгружаются в приложение. Нужно создать класс, который обьединит, например, 10 разных картинок и, при надобности, можно было вызывать: stop(); play(); gotoAndStop(); gotoAndPlay(); currentFrame; и пр. Я не говорю уже о разных свойствах и методах присущих настоящему MovieClip. Мне хотя бы понять как кодом реализовать таймлайн и выполнить минимальные операции над ним.
Заранее благодарен.
__________________
Я мало чего умею, но зато хорошо умею учиться...

Старый 06.11.2011, 23:31
Ookami вне форума Посмотреть профиль Отправить личное сообщение для Ookami Найти все сообщения от Ookami
  № 2  
Ответить с цитированием
Ookami
 
Аватар для Ookami

Регистрация: Aug 2011
Адрес: 56° 51' с.ш. 53° 13' в.д.
Сообщений: 172
Записей в блоге: 1
Создайте класс на базе МС:
Код AS3:
package 
{
	import flash.display.MovieClip;
 
	public class myMC extends MovieClip 
	{
		public function myMC():void 
		{
			// Конструктор класса
		}
}
Добавлено через 1 минуту
В конструкторе класса объединяйте все что вам надо и распределяйте по фреймам. А в основном коде создавайте экземпляр класса и добавляйте его на сцену

Старый 06.11.2011, 23:35
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 3  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
http://flasher.ru/forum/showpost.php...83&postcount=8
__________________
Reality.getBounds(this);

Старый 06.11.2011, 23:50
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 4  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Спасибо за ответы.
Wolsh, я правильно понял: битмапдата, которая передается - это одна картинка с множеством других картинок?

Добавлено через 3 минуты
И возможно ли к экземпляру такого класса добавлять другие обьекты:
Код AS3:
var projector:FilmViewer = new FilmViewer(122, 122);
addChild(projector);
projector.addChild(someDisplObj);
__________________
Я мало чего умею, но зато хорошо умею учиться...

Старый 07.11.2011, 01:26
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 5  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Битмапдата – да, Film в буквальном смысле, раскадровка.
Нельзя, это же Битмап))
Я как бы посмотреть, как вариант направления мысли.. Я понимаю что это не 100% то, что нужно Вам.
Гдето на форуме были и варианты с отдельнолежащими кадрами, но тут есть неудобство - одну картинку как-то проще засунуть, чем сотню. А так способ неплохой, довольно гибкий, напихать сюда обычного мувиклип-функционала вобщем-то несложно. Да и, если есть такая необходимость, можно не наследовать от Битмапа, а сделать спрайт с композицией.
__________________
Reality.getBounds(this);

Старый 07.11.2011, 09:12
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 6  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Понял. Спасибо, особенно за "раскадровку". Действительно, если при загрузке сотни картинок произойдет хоть одно "непредвиденное обстоятельство" будут плохие последствия.
А вот Битмап не очень нравится. Надо похимичить над каким-нибудь DisplayObjectContainer.
__________________
Я мало чего умею, но зато хорошо умею учиться...

Старый 11.11.2011, 02:02
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 7  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Вот что получилось:
Код AS3:
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.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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