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

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

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

Регистрация: Jul 2011
Сообщений: 249
Отправить сообщение для mihael_p с помощью Skype™
По умолчанию Объект и пушка.Пушка постоянно "смотрит" в сторону курсора независимо от объекта

Есть объект с пушкой, пушка должна поворачиваться за курсором, я добился того, что пушка реагирует на курсор - а дальше не могу, помогите пожалуйста. Вот код:
Код AS3:
package 
{
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;
	import flash.utils.Timer;
 
 
	public class Hero extends MovieClip 
	{
 
		//ОБЪЕКТ КОТОРЫЙ БУДЕТ ДВИГАТЬСЯ
		private var player:MovieClip;
		private var playerSpeed:Number = 8;
 
		// ФЛАГИ НАПРАВЛЕНИЯ ДВИЖЕНИЯ
		private var movingUp:Boolean = false;
		private var movingDown:Boolean = false;
		private var movingLeft:Boolean = false;
		private var movingRight:Boolean = false;
 
		private var rotateSpeedMax:Number = 20;
		private var dx:Number;
		private var dy:Number;
		private var pcos:Number;
		private var psin:Number;
		private var trueRotation:Number;
 
 
 
 
		public function Hero():void
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			player = new Player1();
			player.x = 100;
			player.y = 100;
			addChild(player);
			stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);			
			stage.addEventListener(Event.ENTER_FRAME, updateRotation);			
			stage.addEventListener(KeyboardEvent.KEY_DOWN, myOnPress);
			stage.addEventListener(KeyboardEvent.KEY_UP, myOnRelease);	
 
 
		}
		private function updateRotation(e:Event):void
		{
			// РАСЧЕТ ВРАЩЕНИЯ ПУШКИ
			dx = player.x - stage.mouseX;
			dy = player.y - stage.mouseY;
 
			// В КАКУЮ СТОРОНУ ПОВОРАЧИВАТЬ
			var rotateTo:Number = getDegrees(getRadians(dx, dy));	
 
			// ПОВОРАЧИВАТЬ ОТ 0 ДО 360 ГРАД
			if (rotateTo > player.gun.rotation + 180) rotateTo -= 360;
			if (rotateTo < player.gun.rotation - 180) rotateTo += 360;
 
			// ЛЕГКОСТЬ ВРАЩЕНИЯ
			trueRotation = (rotateTo - player.gun.rotation) /rotateSpeedMax;
 
 
			player.gun.rotation += trueRotation;			
		}	
		public function getRadians(delta_x:Number, delta_y:Number):Number
		{
			var r:Number = Math.atan2(delta_y, delta_x);
 
			if (delta_y < 0)
			{
				r += (2 * Math.PI);
			}
			return r;
		}
 
		public function getDegrees(radians:Number):Number
		{
			return Math.floor(radians/(Math.PI/180));
		}
 
		private function enterFrameHandler(event:Event):void
		{
			var i:int = 0;
 
			// ПЕРЕДВИЖЕНИЕ 
			if ( movingLeft && !movingRight )
			{
				player.x -= playerSpeed;
				player.rotation = 270;
			//	player.angle = 180;
 
			}
			if ( movingRight && !movingLeft )
			{
				player.x += playerSpeed;
				player.rotation = 90;
			//	player.angle = 0;
			}
			if ( movingUp && !movingDown )
			{
				player.y -= playerSpeed;
				player.rotation = 0;
			//	player.angle = -90;
			}
			if ( movingDown && !movingUp )
			{
				player.y += playerSpeed;
				player.rotation = 180;
			//	player.angle = 90;
			}
 
 
		}
 
 
		public function myOnPress(event:KeyboardEvent):void
		{
 
			switch( event.keyCode )
			{
				case Keyboard.UP:
					movingUp = true;
					movingDown = false;
					movingLeft = false;
					movingRight = false;
					break;
 
				case Keyboard.DOWN:
					movingUp = false;
					movingDown = true;
					movingLeft = false;
					movingRight = false;
					break;
 
				case Keyboard.LEFT:
					movingUp = false;
					movingDown = false;
					movingLeft = true;
					movingRight = false;
					break;
 
				case Keyboard.RIGHT:
					movingUp = false;
					movingDown = false;
					movingLeft = false;
					movingRight = true;
					break;
				case 87:
					movingUp = true;
					movingDown = false;
					movingLeft = false;
					movingRight = false;
					break;
 
				case 83:
					movingUp = false;
					movingDown = true;
					movingLeft = false;
					movingRight = false;
					break;
 
				case 65:
					movingUp = false;
					movingDown = false;
					movingLeft = true;
					movingRight = false;
					break;
 
				case 68:
					movingUp = false;
					movingDown = false;
					movingLeft = false;
					movingRight = true;
					break;
			}
		}
 
 
		public function myOnRelease(event:KeyboardEvent):void
		{
 
				switch( event.keyCode )
				{
					case Keyboard.UP:
						movingUp = false;
						break;
 
					case Keyboard.DOWN:
						movingDown = false;
						break;
 
					case Keyboard.LEFT:
						movingLeft = false;
						break;
 
					case Keyboard.RIGHT:
						movingRight = false;
						break;
					case 87:
						movingUp = false;
						break;
 
					case 83:
						movingDown = false;
						break;
 
					case 65:
						movingLeft = false;
						break;
 
					case 68:
						movingRight = false;
						break;
				}
 
 
		}
 
 
 
 
	}
 
}
Вложения
Тип файла: zip gun.zip (10.7 Кб, 26 просмотров)
__________________
Не стыдно спросить, стыдно не знать !

Старый 14.03.2012, 22:41
anmelegov вне форума Посмотреть профиль Отправить личное сообщение для anmelegov Найти все сообщения от anmelegov
  № 2  
Ответить с цитированием
anmelegov
[+4 07.04.12]
[+1 20.01.12]

Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
слишком много кода, не имеющего отношения к сути вопроса... что у вас не получается?
[IMG]http://dl.************/u/2448968/1.jpeg[/IMG]
вроде бы как-то так, но может я и ошибаюсь, проверять лень

Старый 14.03.2012, 22:48
mihael_p вне форума Посмотреть профиль Отправить личное сообщение для mihael_p Посетить домашнюю страницу mihael_p Найти все сообщения от mihael_p
  № 3  
Ответить с цитированием
mihael_p

Регистрация: Jul 2011
Сообщений: 249
Отправить сообщение для mihael_p с помощью Skype™
Представьте танк который двигается в 4 стороны, у него есть пушка которая должна поворачиваться в сторону курсора независимо от направления движения самого танка
__________________
Не стыдно спросить, стыдно не знать !

Старый 14.03.2012, 22:52
anmelegov вне форума Посмотреть профиль Отправить личное сообщение для anmelegov Найти все сообщения от anmelegov
  № 4  
Ответить с цитированием
anmelegov
[+4 07.04.12]
[+1 20.01.12]

Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
вам надо использовать функцию Math.atan2()

Добавлено через 1 минуту
только не забудьте радианы в градусы перевести

Добавлено через 6 минут
Math.atan2(dY, dX) /// вот так правильно

Старый 14.03.2012, 23:04
mihael_p вне форума Посмотреть профиль Отправить личное сообщение для mihael_p Посетить домашнюю страницу mihael_p Найти все сообщения от mihael_p
  № 5  
Ответить с цитированием
mihael_p

Регистрация: Jul 2011
Сообщений: 249
Отправить сообщение для mihael_p с помощью Skype™
Все это есть в функции getRadians я не могу понять в чем дело, пушка поворачивается но не правильно, подскажите что я делаю не так?
__________________
Не стыдно спросить, стыдно не знать !

Старый 14.03.2012, 23:14
anmelegov вне форума Посмотреть профиль Отправить личное сообщение для anmelegov Найти все сообщения от anmelegov
  № 6  
Ответить с цитированием
anmelegov
[+4 07.04.12]
[+1 20.01.12]

Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
dx = stage.mouseX - player.x;
dy = stage.mouseY - player.y;
вот так пробовали?.. вообще не понятно, вы считаете разницу между координатами танка в контейнере в котором он находится и экранными координатами курсора... или у вас танк ездеет в стейдже?

Добавлено через 5 минут
у вас объект player является чаилдом объекта hero... так и должно быть да?

Старый 14.03.2012, 23:38
mihael_p вне форума Посмотреть профиль Отправить личное сообщение для mihael_p Посетить домашнюю страницу mihael_p Найти все сообщения от mihael_p
  № 7  
Ответить с цитированием
mihael_p

Регистрация: Jul 2011
Сообщений: 249
Отправить сообщение для mihael_p с помощью Skype™
Код AS3:
private function updateRotation(e:Event):void
		{
			// РАСЧЕТ ВРАЩЕНИЯ ПУШКИ
			dx = player.x - stage.mouseX;
			dy = player.y - stage.mouseY;
 
			// В КАКУЮ СТОРОНУ ПОВОРАЧИВАТЬ
			var rotateTo:Number = getDegrees(getRadians(dx, dy));	
 
			// ПОВОРАЧИВАТЬ ОТ 0 ДО 360 ГРАД
			if (rotateTo > player.gun.rotation + 180) rotateTo -= 360;
			if (rotateTo < player.gun.rotation - 180) rotateTo += 360;
 
			// ЛЕГКОСТЬ ВРАЩЕНИЯ
			trueRotation = (rotateTo - player.gun.rotation) /rotateSpeedMax;
 
 
			player.gun.rotation += trueRotation;			
		}	
		public function getRadians(delta_x:Number, delta_y:Number):Number
		{
			var r:Number = Math.atan2(delta_y, delta_x);
 
			if (delta_y < 0)
			{
				r += (2 * Math.PI);
			}
			return r;
		}
 
		public function getDegrees(radians:Number):Number
		{
			return Math.floor(radians/(Math.PI/180));
		}
вот функции отвечающие за поворот пушки player.gun - сама пушка
__________________
Не стыдно спросить, стыдно не знать !

Старый 14.03.2012, 23:48
anmelegov вне форума Посмотреть профиль Отправить личное сообщение для anmelegov Найти все сообщения от anmelegov
  № 8  
Ответить с цитированием
anmelegov
[+4 07.04.12]
[+1 20.01.12]

Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
это то понятно... у вас объект Hero двигается относительно stage? ваша функция будет работать только когда офсет между Hero и stage равен нулю, т.к. координаты мыши считаются из левого верхнего угла сцены, а координаты player как hero.position + player.position... я почти уверен что проблема именно в этом

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

Регистрация: Feb 2011
Адрес: Украина Днепропетровск
Сообщений: 106
/**
* Получение угла между двумя точками
* @param a-первая точка типа маусХУ
* @param b-вторая точка координаты вашего героя
* @return
*/
public function anglePoisk (a:Point, b:Point, rodian:Boolean=true):Number {
if(!rodian) return Math.atan2(b.y - a.y, b.x - a.x);
return (180/Math.PI)*Math.atan2(b.y - a.y, b.x - a.x);
}
[/as3]

Старый 16.03.2012, 11:25
mihael_p вне форума Посмотреть профиль Отправить личное сообщение для mihael_p Посетить домашнюю страницу mihael_p Найти все сообщения от mihael_p
  № 10  
Ответить с цитированием
mihael_p

Регистрация: Jul 2011
Сообщений: 249
Отправить сообщение для mihael_p с помощью Skype™
Всем спасибо, решил.
__________________
Не стыдно спросить, стыдно не знать !

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

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

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


 


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


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