Показать сообщение отдельно
Старый 27.10.2010, 23:25
tsarapkabel вне форума Посмотреть профиль Отправить личное сообщение для tsarapkabel Найти все сообщения от tsarapkabel
  № 1  
Ответить с цитированием
tsarapkabel
 
Аватар для tsarapkabel

Регистрация: Nov 2009
Адрес: в златоглавой
Сообщений: 745
По умолчанию Аналоговые часы на as3 - вопрос по реализации!

Приветиус!

Сделал часы, но до конца недоработал, меня уже давно терзают сомнения по поводу правильности реализации!

Это одно из моих первых "произведений", поэтому выглядит довольно странно.

Контейнеры создаются для того, чтобы "сместить точку регистрации" для более правильного вращения.

Код AS3:
package {
	import flash.display.Sprite;
	import flash.events.Event;
	import mx.core.BitmapAsset;
 
 
 
	public class KanjiClock extends Sprite {
 
		[Embed(source = "kanji_clock.jpg")] //подключаем jpg
		var ClockDial:Class;
 
		private var secHand:Sprite;
		private var minHand:Sprite;
		private var hourHand:Sprite;
 
		private var secContainer:Sprite;
		private var minContainer:Sprite;
		private var hourContainer:Sprite;
 
 
		public function KanjiClock ():void {
 
			var dial:BitmapAsset = new ClockDial(); //объявляем переменную от Embed source
			stage.addChild (dial);	//добавляем циферблат (jpg) на сцену
 
			var centerCircle:Sprite = new Sprite(); //центральный кружок
			centerCircle.graphics.beginFill (0x000000);
			centerCircle.graphics.drawCircle (148, 148, 7);
			centerCircle.graphics.endFill();
 
			secContainer =  new Sprite(); //контейнер для секундной стрелки
			secContainer.x = 148;
			secContainer.y = 148;
			secContainer.rotation = 180;
 
			minContainer =  new Sprite(); //контейнер для минутной стрелки
			minContainer.x = 148;
			minContainer.y = 148;
			minContainer.rotation = 180;
 
			hourContainer =  new Sprite(); //контейнер для часовой стрелки
			hourContainer.x = 148;
			hourContainer.y = 148;
			hourContainer.rotation = 180;
 
			secHand = new Sprite(); //секундная стрелка
			secHand.graphics.lineStyle (.1, 0x000000);
			secHand.graphics.beginFill (0x0066CC);
			secHand.graphics.drawRect (0, 0, 4, 100);
			secHand.graphics.endFill();
			secHand.x = - 2;
			secHand.y = 0;
 
			minHand = new Sprite(); //минутная стрелка
			minHand.graphics.lineStyle (.1, 0x000000);
			minHand.graphics.beginFill (0x650099);
			minHand.graphics.drawRect (0, 0, 6, 80);
			minHand.graphics.endFill();
			minHand.x = - 3;
			minHand.y = 0;
 
			hourHand = new Sprite(); //часовая стрелка
			hourHand.graphics.lineStyle (.1, 0x000000);
			hourHand.graphics.beginFill (0x660000);
			hourHand.graphics.drawRect (0, 0, 8, 60);
			hourHand.graphics.endFill();
			hourHand.x = - 4;
			hourHand.y = 0;
 
			//добавляем стрелки в их контейнеры
			secContainer.addChild (secHand);
			minContainer.addChild (minHand);
			hourContainer.addChild (hourHand);
 
			//добавляем на stage контейнеры со стрелками и кружок в центр
			stage.addChild (hourContainer);
			stage.addChild (minContainer);
			stage.addChild (secContainer);
			stage.addChild (centerCircle);
 
			stage.addEventListener (Event.ENTER_FRAME, onEnterFrame, false, 0, true);
 
 
			function onEnterFrame (e:Event):void {
 
				var currentDate:Date = new Date();
				var sec:Number = currentDate.getUTCSeconds();
				var min:Number = currentDate.getUTCMinutes();
				var hour:Number = currentDate.getUTCHours();
 
				//добавляем вращение контейнерам
				secContainer.rotation = 180+6*sec;
				minContainer.rotation = 180+6*min + sec*0.1;
				hourContainer.rotation = 180+30*(hour+4) + min/2;
			}
 
		}
 
	}
 
}
Насколько это безграмотно?

Нужен ли здесь метатег Embed или можно было обойтись простым loader'ом?

Да и вообще буду рад любому мнению!
Вложения
Тип файла: swf KnjClk.swf (79.2 Кб, 121 просмотров)