Показать сообщение отдельно
Старый 22.12.2011, 19:12
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 15  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Knob.as
Код AS3:
package  
{
	import flash.display.GradientType;
	import flash.display.Graphics;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.filters.BevelFilter;
	import flash.filters.DropShadowFilter;
	import flash.geom.Matrix;
	import flash.geom.Point;
 
	public class Knob extends Sprite 
	{
		private const RAD:Number = Math.PI / 180;
		private var _knob:Sprite;
		private var _knobAngleLast:Number = 0;
		private var _handAngleStart:Number;
 
		public function Knob() 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			//// Шкала 25 рисок
			var scal:Shape = new Shape();
			var sg:Graphics = scal.graphics;
			sg.lineStyle(2, 0x666666);
			for (var s:uint = 0; s < 250; s += 10)
			{
				var angle:Number = (150 + s) * RAD
				var sp:Point = Point.polar(60, angle);
				var sp2:Point = Point.polar(s % 20 ? 65 : 70, angle);
				sg.moveTo(sp.x, sp.y);
				sg.lineTo(sp2.x, sp2.y);
			}	
			addChild(scal);
			//// Ручка
			_knob = new Sprite();
			addChild(_knob);
			var g:Graphics = _knob.graphics;
			g.beginFill(0x000000);
			for (var i:uint = 0; i < 360; i += 30)
			{
				var p:Point = Point.polar(45, i * RAD);
				g.drawCircle(p.x, p.y, 10);
			}
			g.beginFill(0x000000);
			g.drawCircle(0, 0, 50);
			var matrix:Matrix = new Matrix();
			matrix.createGradientBox(94, 94, 0, -47, -47);
			g.beginGradientFill(GradientType.RADIAL, [0x000000, 0x101010], [1, 1], [210, 255], matrix);
			g.drawCircle(0, 0, 48);
			//// Риска на ручке, под 150 град для простоты расчета ограничения вращения
			var p1:Point = Point.polar(20, 150 * RAD);
			var p2:Point = Point.polar(45, 150 * RAD);
			g.endFill();
			g.lineStyle(3, 0x333333);
			g.moveTo(p1.x, p1.y)
			g.lineTo(p2.x, p2.y);
			_knob.filters = [ new BevelFilter(25, 60, 0xFFFFFF, 0.5, 0x000000, 0.5, 25, 25, 0.5, 3), new DropShadowFilter(10, 60, 0x000000, 0.5, 12, 12, 1, 3) ];
			_knob.addEventListener(MouseEvent.MOUSE_DOWN, handlerDown);
		}
 
		private function handlerDown(event:MouseEvent):void 
		{
			_knobAngleLast = _knob.rotation;
			_handAngleStart = Math.atan2(mouseY, mouseX) / RAD;
			stage.addEventListener(MouseEvent.MOUSE_MOVE, handlerMove);
			stage.addEventListener(MouseEvent.MOUSE_UP, handlerUp);
		}
 
		private function handlerUp(event:MouseEvent):void 
		{
			stage.removeEventListener(MouseEvent.MOUSE_MOVE, handlerMove);
			stage.removeEventListener(MouseEvent.MOUSE_UP, handlerUp);
		}
 
		private function handlerMove(event:MouseEvent):void 
		{
			var handAngle:Number = Math.atan2(mouseY, mouseX) / RAD;
			var delta:Number = _handAngleStart - handAngle;
			_handAngleStart = handAngle;
			_knob.rotation -= delta;
			if (_knob.rotation < 0 && _knob.rotation > -(360 - 240) )
			{
				_knob.rotation = _knobAngleLast;
			}
			else
			{
				_knobAngleLast = _knob.rotation;
			}
		}
	}
}
Main.as
Код AS3:
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
 
	public class Main extends Sprite 
	{
 
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			this.graphics.beginFill(0x444444);
			this.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
			var knob:Knob = new Knob();
			addChild(knob);
			knob.x = knob.y = 200;
		}
	}
}
__________________
Reality.getBounds(this);