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

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

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

Регистрация: Aug 2012
Сообщений: 297
По умолчанию Преобразование глобальных координат в локальные

Здравствуйте.

Цель:

Определить какие противники находятся в области прицела. +
Поместить этих противников в специальный массив. +
Определить какой противник в специальном массиве самый слабый. +
Присвоить координаты самого слабого противника мушке. ?

Положение:

Прицел A.
Мушка B.
Противник C.

Мушка находится в том же контейнере, что и прицел. Противник снаружи.

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

Когда я определил самого слабого противника я перевёл его глобальные координаты в локальные и присвоил их мушке. Я получил в итоге: то движение мушки вокруг прицела, то противник стоит в одном месте, а мушка совсем в другом.

Код AS3:
package madness.operation
{
	import flash.events.Event;
	import flash.display.MovieClip;
	import flash.geom.Point;
	import flash.display.Sprite;
	import madness.*;
	import flash.display.Shape;
 
	import madness.background.Fields;
 
	public class Aiming
	{
		private var enemies:Array = [];
		private var range:Number = 40;
		private var limit:Number = 20;
 
		public function Aiming()
		{
			//Создаю прицел:
			var wings:MovieClip = new Wings();
			wings.name = 'sight';
			wings.y = -200;
			Settings.wings.addChild(wings);
			Fields.FIELDFORWINGS.addChild(Settings.wings);
			//Создаю прицел:
 
			//Создаю мушку:
			var foresight:MovieClip = new Foresight();
			foresight.name = 'foresight';
			wings.addChild(foresight);
			//Создаю мушку:
 
			Settings.stage.addEventListener(Event.ENTER_FRAME,work);
		}
		public function work(event:Event):void
		{
			wingsMove();
			drawLimitAiming();
			const LENGTHENEMIES:int = Settings.rangers.length;
			const WINGS:MovieClip = MovieClip(Settings.wings.getChildByName('sight'));
			var clickPoint:Point=new Point(0, 0);
			var wingsPoint:Point = WINGS.localToGlobal(clickPoint);
			const FORESIGHT:MovieClip = MovieClip(WINGS.getChildByName('foresight'));
 
			for(var e:int = 0; e < LENGTHENEMIES; e++)
			{
				const ENEMY:MovieClip = Settings.rangers[e];
				var onePoint:Point = new Point();
				var twoPoint:Point = new Point();
				var r:Number = Settings.wings.rotation*Math.PI/180;
 
				onePoint.x = ENEMY.x - wingsPoint.x;
				onePoint.y = ENEMY.y - wingsPoint.y;
 
				twoPoint.x = onePoint.x*Math.cos(r) - onePoint.y*Math.sin(r);
				twoPoint.y = onePoint.y*Math.sin(r) + onePoint.y*Math.cos(r);
 
				if(range >= getDistanceForesightAndTarget(twoPoint,new Point()) && limit > Math.abs(twoPoint.y))
				{
					enemies.push(ENEMY);
					ENEMY.alpha = .5;
				}
				else
				{
					ENEMY.alpha = 1;
				}
			}
			const L:int = enemies.length;
			if(L == 0)
			{
				FORESIGHT.x = 0;
				FORESIGHT.y = 0;
				return;
			}
			var id:int = int.MAX_VALUE;
			var l:int = int.MAX_VALUE;
			for(var feeble:int = 0; feeble < enemies.length; feeble++)
			{
				const life:int = enemies[feeble].life;
 
				if(l > life)
				{
					l = life;
					id = feeble;
				}
			}
			if(id != int.MAX_VALUE)
			{
				var enemy:MovieClip = enemies[id];
				enemies.splice(0,enemies.length);
				var cp:Point = new Point(0,0);
				var fPoint:Point = enemy.globalToLocal(cp);
				FORESIGHT.x = fPoint.x;
				FORESIGHT.y = fPoint.y;
			}
		}
		//Метод рисования границ прицеливания:
		private function drawLimitAiming():void
		{
			var sight:MovieClip = MovieClip(Settings.wings.getChildByName('sight'));
			sight.graphics.clear();
			sight.graphics.lineStyle(1,0x00FFFF);
			//Верхняя линия:
			sight.graphics.moveTo(-range, -limit);
			sight.graphics.lineTo(range, -limit);
			//Нижняя линия:
			sight.graphics.moveTo(-range, limit);
			sight.graphics.lineTo(range, limit);
		}
		//Метод определения дистанции между мишенью и мушкой:
		private function getDistanceForesightAndTarget(foresight:Point,target:Point):Number
		{
			return Math.sqrt(Math.pow(foresight.x-target.x,2)+Math.pow(foresight.y-target.y,2));
		}
		//Движение крыльев:
		private function wingsMove():void
		{
			var wings:MovieClip = Settings.wings;
			var mainPersona:MovieClip = Settings.mainPersona;
			wings.x = mainPersona.x;
			wings.y = mainPersona.y;
			wings.rotation = mainPersona.rotation;
		}
	}
}

Создать новую тему   Часовой пояс GMT +4, время: 12:41.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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