Показать сообщение отдельно
Старый 06.04.2010, 20:56
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 2  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
имо в этой ситуации по-любому надо хранить 3D координаты частиц, тогда все логично и просто,
поиграйся с таким раскладом
Код AS3:
package 
{
	import flash.display.*;
	import flash.events.*;
	import flash.ui.*;
 
	public class Main extends Sprite 
	{
		private var _stars:Array = [];
		private var _num:int = 200;
 
		public function Main():void 
		{
			for (var i:int = 0; i < _num; i++) 
			{
				var star:Star = new Star();
				_stars.push(star);
				addChild(star);
			}
			stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
		}
 
		private function onKeyDown(event:KeyboardEvent):void 
		{
			if (event.keyCode == Keyboard.LEFT) rotate( -0.01);
			if (event.keyCode == Keyboard.RIGHT) rotate( 0.01);
		}
 
		private function rotate(angle:Number):void
		{
			for (var i:int = 0; i < _num; i++) (_stars[i] as Star).rotate(angle);
 
		}
	}
}
Код AS3:
package  
{
	import flash.display.*;
	import flash.geom.*;
 
	public class Star extends Shape
	{
		public static const RADIUS:Number = 500;
		public static const CENTER:Point = new Point(250, 250);
		//3D координаты
		private var _pX:Number;
		private var _pY:Number;
		private var _pZ:Number;
 
 
		public function Star() 
		{
			graphics.lineStyle(4, 0xFFFFFF);
			graphics.lineTo(0.5, 0);
 
			_pX = 2 * RADIUS * (0.5 - Math.random());
			_pY = 2 * RADIUS * (0.5 - Math.random());
			_pZ = 2 * RADIUS * (0.5 - Math.random());
			rotate(0);
		}
 
		public function rotate(angle:Number):void
		{
			var sin:Number = Math.sin(angle);
			var cos:Number = Math.cos(angle);
			var ty:Number = _pX;
 
			_pX = _pX * cos + _pZ * sin;
			_pZ = _pZ * cos - ty * sin;
 
			x = CENTER.x + _pX;
			y = CENTER.y + _pY;
			scaleX = scaleY = RADIUS / (RADIUS - _pZ);
 
			var viewAngle:Number = Math.atan2(_pZ, _pX);
			visible = viewAngle < 0;
		}
	}
}