Форум 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;
		}
	}
}

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
var fPoint:Point = enemy.globalToLocal(cp);
То есть Вы перевели точку стейджа (0, 0) в локальные координаты рейнджера. Ну, а мушка то тут при чем? Вам то нужно было глобальные координаты рейнджера перевести в локальные прицела. Видимо (не силен в Вашей архитектуре)
Код AS3:
var fPoint:Point = WINGS.globalToLocal(new Point(enemy.x, enemy.y));
__________________
Reality.getBounds(this);

Старый 22.09.2013, 19:15
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 3  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
Цитата:
Сообщение от Wolsh Посмотреть сообщение
То есть Вы перевели точку стейджа (0, 0) в локальные координаты рейнджера. Ну, а мушка то тут при чем? Вам то нужно было глобальные координаты рейнджера перевести в локальные прицела. Видимо (не силен в Вашей архитектуре)
Код AS3:
var fPoint:Point = WINGS.globalToLocal(new Point(enemy.x, enemy.y));
Я понял. Я просто не задал какие координаты нужно переводить. Спасибо.

Мушка находится внутри прицела.. Когда я узнаю координаты слабого противника, я их присваиваю мушке автоматически. То есть получается, что мушка бегает внутри прицела (наводится на противников).

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

Регистрация: Feb 2012
Сообщений: 1,540
Слишком большие вложенности DO приводят к плохим последствиям.
Самой большой проблемой является поддержка этого всего.

Старый 22.09.2013, 19:51
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 5  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
Цитата:
Сообщение от MikroAcse Посмотреть сообщение
Слишком большие вложенности DO приводят к плохим последствиям.
Самой большой проблемой является поддержка этого всего.
Что такое "вложенность DO"?

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

Регистрация: Feb 2012
Сообщений: 1,540
Цитата:
Что такое "вложенность DO"?
Вложенные MovieClip/Sprite (DisplayObjectContainer = DOC)


Последний раз редактировалось MikroAcse; 23.09.2013 в 17:23.
Старый 22.09.2013, 20:57
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 7  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Dip52 Вы всегда создаете такое количество циклов, констант и временных переменных? Особенно циклов. В прошлый раз было три... Я считаю оптимальным подходом, при работе с группой объектов, получать ссылки на них единожды и делать все вычисления на ходу пока не закончатся все преобразования и исчисления. Вы постоянно создаете "временные" массивы куда складываете результаты одной составной итерации всего действия.

Добавлено через 15 минут
Код 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'));
 
			var weakTarget:MovieClip;
 
			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))
				{
					if (!weakTarget || weakTarget.life<ENEMY.life) {
						weakTarget = ENEMY;
					}
 
					ENEMY.alpha = .5;
				}
				else
				{
					ENEMY.alpha = 1;
				}
			}
 
			if (weakTarget) {
 
				//  странная пляска с бубном над globalToLocal
 
				var cp:Point = new Point(0,0);
				var fPoint:Point = weakTarget.globalToLocal(cp);
 
				FORESIGHT.x = fPoint.x;
				FORESIGHT.y = fPoint.y;
 
			) else {
 
				FORESIGHT.x = 
				FORESIGHT.y = 0;
			}
 
		}
		//Метод рисования границ прицеливания:
		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;
		}
	}
}
__________________
return this...


Последний раз редактировалось AlexCooper; 22.09.2013 в 21:46.
Старый 23.09.2013, 06:18
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 8  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
Цитата:
Сообщение от MikroAcse Посмотреть сообщение
Слишком большие вложенности DO приводят к плохим последствиям.
Самой большой проблемой является поддержка этого всего.
Не согласен.

Старый 23.09.2013, 13:10
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 9  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Я бы вообще отказался от реализации объектов ( целей ) унаследованных от MovieClip. Слишком много избыточных методов и свойств.
Это были б какие-то инстансы классов только с характеристиками объекта ( то-есть позиция, угол поворота, жизни, броня, статус, движение ) и свойство вьювер - соответсвено и есть мувиклип, а лучше спрайт. Который при рендере считывался б и обновлялся.
__________________
return this...

Старый 23.09.2013, 13:24
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 10  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от MikroAcse Посмотреть сообщение
Слишком большие вложенности DO приводят к плохим последствиям.
Самой большой проблемой является поддержка этого всего.
Только в случае если нужно координаты всего этого приводить к какой-то другой системе постоянно. А в целом особой проблемы не вижу.

п.с. Правильнее тогда DOC (DisplayObjectContainer). Bitmap тоже является DO, но в него нельзя ничего вложить.

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

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

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


 


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


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