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

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

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

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

Добрый вечер.

Цель: Сделать так, чтобы прицел двигался только внутри крыльев: когда противник находится внутри крыльев, то на него автоматически наводится прицел.

Положение:
Есть три объекта:
Летающий корабль.
Прицел.
Крылья прицела.

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

Нажмите на изображение для увеличения
Название: Прицел.JPG
Просмотров: 96
Размер:	13.0 Кб
ID:	29976

Проблема: Не могу понять, как можно сделать так, чтобы прицел "прыгал" в области ширины и высоты крыльев (то есть, между крыльев, как по высоте, так и по ширине.
Прицел.swf   (1.2 Кб)
Вложения
Тип файла: swf Прицел.swf (1.2 Кб, 107 просмотров)

Старый 07.09.2013, 04:21
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 2  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
а) сделать так, что крылья и прицел это одни СИМВОЛ ( клип, или кастомкласс - не важно ). Смысл в том, чтобы поворачивая крылья внутри оставлась та же система координат.
б) Если говорить о том, чтобы прицел распологался ТОЧНО внутри крыльев, взяв за основу то, что это не прямоугольник, а сложная фигура ( ЛЮБАЯ ) , то я бы отрисовал эту фигуру, как шейп или спрайт и проверял по положению курсора, типа while(x < tx && y < tx ) x += y+= 1
Это вариант на всикду - , а так надо думать
__________________
Марк Tween

Старый 07.09.2013, 14:30
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 3  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
я могу ошибаться, но мне кажется что тут всё гораздо проще, но с оговоркой - что это КАЖЕТСЯ.
Если прицел появляется в центре конструкции на рисунке, то мы создаём точку с координатами А(0,0).
Сам прицел мы представляем точкой В(x,y). И теперь у нас получается вектор ab(x,y). Теперь мы можем найти его угол и контролировать его. Но тут для меня не все так просто. Можно просто проверять катеты прямоугольного треугольника на максимальную ширину и высоту, но это грубо. А вот как выразить соотношение косинуса к синусу, чтобы ограничить угол, я пока не придумал. Сижу думаю.

Добавлено через 27 минут
Вот самый банальный пример, но я бы его не стал использовать и показываю для того, что может кто то покажет как только по углу и гипотенузе узнавать. я не могу придумать как соотношение записать.
И особо мне хочется подчеркнуть НЕ ДЛЯ ИНВАЛИДОВ КОТОРЫЕ ЛЮДЕЙ ОСКОРБЛЯЮТ А САМИ НЕ ЗНАЮТ ЧТО ТАКОЕ ТРЕУГОЛЬНИК, чтобы эти не инвалиды не комментировали мой код, который создан для наглядности!
Код AS3:
package geom 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Point;
 
	public class Target extends Sprite 
	{
 
		public function Target() 
		{
			var a:Sprite = new Sprite();
			a.graphics.beginFill(0xffffff);
			a.graphics.drawCircle(stage.stageWidth/2, stage.stageHeight/2, 150);
			a.graphics.endFill();
			addChild(a);
			var target:Sprite = new Sprite();
			target.graphics.beginFill(0xDF1322);
			target.graphics.drawCircle(stage.stageWidth/2, stage.stageHeight/2, 30);
			target.graphics.endFill();
			addChild(target);
			target.addEventListener(Event.ENTER_FRAME, target_enterFrameHandler);
 
		}
 
		private function target_enterFrameHandler(event:Event):void 
		{
 
			event.target.x = mouseX-stage.stageWidth/2;
			event.target.y = mouseY - stage.stageHeight / 2;
			var width:int = 150;
			var hieght:int = 50;
			var O:Point = new Point(0, 0);
			var A:Point = new Point(mouseX - stage.stageWidth / 2, mouseY - stage.stageHeight / 2);
			var target:Point = A.subtract(O);
			if (target.x > width - 30 || target.x < 30 - width)
			{
				trace('width');
			}
			if (target.y > hieght - 30 || target.y < 30 - hieght)
			{
				trace('hieght');
			}
 
		}
 
	}
 
}


Последний раз редактировалось Akopalipsis; 07.09.2013 в 14:41.
Старый 08.09.2013, 19:10
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 4  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Я бы сделал:
1.
Цитата:
Сообщение от in4core Посмотреть сообщение
а) сделать так, что крылья и прицел это одни СИМВОЛ ( клип, или кастомкласс - не важно ). Смысл в том, чтобы поворачивая крылья внутри оставлась та же система координат.
2. Если делать реализацию только под данный вид прицела, то явно видно внутренний круг который описывает крылья, соответственно
2.1. Точка регистрации "точки прицела" по центру
2.2. От центра всего клипа считать расстояние до новой точкой, минус радиус круглого прицела.
2.3. Верхние границы ограничивать по Y
__________________
return this...

Старый 08.09.2013, 19:36
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 5  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
AlexCooper Вы очень значит хорошо разбираетесь в геометрии!
я пока не могу такое сделать, но сделал тоже самое, что и описали Вы, но я пока не знаю как вписать в это уравнение поворот самих крыльев. Может покажите?

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

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Управление:
A / D - поворот корабля
Space - запустить / остановить движение объектов

aim.swf   (7.4 Кб)


Код AS3:
package  {
 
	import flash.display.Sprite;
	import com.greensock.TweenLite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;
 
 
	public class Ship extends Sprite {
 
		public var target:Vector.<Sprite> = new Vector.<Sprite>;
		private var range:Number;
		private var limit:Number;
 
		public function Ship() {
 
			range = 200; // maximum range length
			limit = 100; // up / down range
 
			drawUpDownLimit();
 
			stage ? init() : addEventListener(Event.ADDED_TO_STAGE, init);
 
		}
 
		private function init(event:Event=null):void {
 
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			addEventListener(Event.ENTER_FRAME, autoaim );
		}
 
		private function autoaim(event:Event):void {
 
			graphics.clear();
 
			drawUpDownLimit();
 
			graphics.lineStyle(2,0xFF0000);
 
			var pn:Point ;
			var ps:Point = new Point(); 
 
			var a:Number =  - rotation * Math.PI / 180;
 
			for each(var _target:Sprite in target) {
 
				graphics.moveTo(0,0);
 
				pn = new Point();
 
				pn.x = _target.x-x;
				pn.y = _target.y-y;
 
				ps.x = pn.x*Math.cos(a) - pn.y*Math.sin(a); 
				ps.y = pn.x*Math.sin(a) + pn.y*Math.cos(a);
 
				graphics.lineTo( ps.x, ps.y );
 
				if (range >= dist(  ps, new Point() ) && limit > Math.abs(ps.y)	) {
 
					aim.x = ps.x;
					aim.y = ps.y;
 
				} else aim.x = aim.y = 0;
			}
		}
 
		private function drawUpDownLimit():void {
 
			graphics.lineStyle(1,0x00FFFF);
 
			graphics.moveTo(-range, -limit);
			graphics.lineTo(range, -limit);
 
			graphics.moveTo(-range, limit);
			graphics.lineTo(range, limit);
		}
 
		private function dist(p0:Point,p1:Point):Number {
			return Math.sqrt( Math.pow( p1.x - p0.x , 2 ) + Math.pow( p1.y - p0.y , 2 ) );
		}
 
	}
 
}
Я так понимаю это нужно было?
Вложения
Тип файла: rar aim.rar (893.1 Кб, 11 просмотров)
Тип файла: swf aim.swf (7.4 Кб, 71 просмотров)
__________________
return this...


Последний раз редактировалось AlexCooper; 08.09.2013 в 21:41.
Старый 08.09.2013, 21:43
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 7  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Здорово! И так просто.

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

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Цитата:
Сообщение от Akopalipsis Посмотреть сообщение
Здорово! И так просто.
Надеюсь это то что хотел ТС
__________________
return this...

Старый 08.09.2013, 21:56
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 9  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
я сижу смотрю и понимаю, что нужно в свободное время, хоть немного смотреть видео о создании игр.
Потому что, сколько я не думал о том как сделать это, мне не раз не пришло в голову проверять дистанцию с обьектом))) я даже о нем и не думал.

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

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Цитата:
Сообщение от Akopalipsis Посмотреть сообщение
я сижу смотрю и понимаю, что нужно в свободное время, хоть немного смотреть видео о создании игр.
Потому что, сколько я не думал о том как сделать это, мне не раз не пришло в голову проверять дистанцию с обьектом))) я даже о нем и не думал.
Надо исходить из того что будет проще просчитывать машине, в этом и заключается наиболее оптимальное решение ( и скорей всего правильное ). В данном случае дистанция между двумя точками может описать зону прицеливания по кругу, а верхние границы просто по Y. Соответственно остается только все свести в одну систему координат + превращения ( определения вектора между точками и его поворот ).
__________________
return this...


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

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

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


 


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


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