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

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

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

Регистрация: Apr 2013
Сообщений: 82
По умолчанию Движение по диагонали

Добрый вечер! У меня есть код движение некого объекта, которым можна управлять с помощью клавиатуры:
Код AS3:
function dvig(e:KeyboardEvent):void
{
	if (e.keyCode == Keyboard.LEFT)
	{
		er.x -=  1;
	}
	if (e.keyCode == Keyboard.RIGHT)
	{
		er.x +=  1;
	}
	if (e.keyCode == Keyboard.DOWN)
	{
		er.y +=  1;
	}
	if (e.keyCode == Keyboard.UP)
	{
		er.y -=  1;
	}
}
Но у этого кода есть один недостаток: он позволяет двигать объект только в одну сторону. А мне надо по диагонали. Подскажите, как реализовать?

Старый 11.12.2013, 01:03
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 2  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
У этого кода нет недостатков, он работает так, как и должен работать.

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

Регистрация: Mar 2006
Адрес: Odessa
Сообщений: 157
Попробуйте запоминать нажатые клавиши, а по энтерфрейму проверять их и двигать объект.
Т.е. код движения будет приблизительно таким:

Код AS3:
function updateMove() : void
{
	if (keyboardManager.keyIsDown(Keyboard.RIGHT)) er.x++;
	if (keyboardManager.keyIsDown(Keyboard.LEFT)) er.x--;
	if (keyboardManager.keyIsDown(Keyboard.DOWN)) er.y++;
	if (keyboardManager.keyIsDown(Keyboard.UP)) er.y--;
}
__________________
Не всех война убила - многих покалечила

Старый 11.12.2013, 01:24
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 4  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
Код AS3:
package massacre
{
	import flash.display.MovieClip;
	import flash.events.KeyboardEvent;
	import flash.events.Event;
	import flash.ui.Keyboard;
 
	public class Move extends MovieClip
	{
		private var up:Boolean = false;
		private var down:Boolean = false;
		private var left:Boolean = false;
		private var right:Boolean = false;
 
		private const SPEED:Number = 1; 
		private var persona:MovieClip;
		private var s:*;
 
		public function Move(setPersona:MovieClip,setStage:*)
		{
			init(setPersona,setStage);
		}
		private function init(setPersona:MovieClip,setStage:*):void
		{
			s = setStage;
			persona = setPersona;
			s.addEventListener(KeyboardEvent.KEY_DOWN,downKey);
			s.addEventListener(KeyboardEvent.KEY_UP,upKey);
			addEventListener(Event.ENTER_FRAME,move);
		}
		private function upKey(event:KeyboardEvent):void
		{
			const KEYCODE:* = event.keyCode;
			switch(KEYCODE)
			{
				case Keyboard.LEFT:
				left = false;
				break;
				case Keyboard.RIGHT:
				right = false;
				break;
				case Keyboard.UP:
				up = false;
				break;
				case Keyboard.DOWN:
				down = false;
				break;
			}
		}
		private function downKey(event:KeyboardEvent):void
		{
			const KEYCODE:uint = event.keyCode;
			switch(KEYCODE)
			{
				case Keyboard.LEFT:
				left = true;
				break;
				case Keyboard.RIGHT:
				right = true;
				break;
				case Keyboard.UP:
				up = true;
				break;
				case Keyboard.DOWN:
				down = true;
				break;
			}
		}
		private function move(event:Event):void
		{
			if(left)
			{
				persona.x -= SPEED;
			}
			if(right)
			{
				persona.x += SPEED;
			}
			if(down)
			{
				persona.y += SPEED;
			}
			if(up)
			{
				persona.y -= SPEED;
			}
		}
	}
}

Старый 11.12.2013, 11:53
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 5  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Кстати во всех подобных реализациях движения по диагонали не учитывается общий модуль скорости. Если при такой реализации двигаться по диагонали, то движение по модулю будет быстрее, чем движение (по модулю) по каждой из осей в отдельности. По отдельным осям скорость будет SPEED, а по диагонали будет корень из двух на SPEED
Поэтому нужно заиметь константу SPEED_MAGNITUDE, и по ней вычислять ONE_AXIS_SPEED_MAGNITUDE, которая будет равна SPEED_MAGNITUDE * корень из двух делить на два. Если движемся по диагонали, двигаем обе координаты со скоростью ONE_AXIS_SPEED_MAGNITUDE, а если горизонтально или вертикально, то со скоростью SPEED_MAGNITUDE

Потом проверять, нажаты ли обе кнопки, и проверять простым перебором (да, это долго) все варианты нажатий. И еще можно проверять через atan2 куда двигать.

У меня где-то был готовый код, скину если найду

===UPDATE===
Нашел код, только он немного не на AS3, но рабочий
Оказывается устанавливается скорость по горизонтали, а диагональная вычисляется по формуле
Код AS3:
speedDiag = Math.sqrt(SPEED * SPEED / 2);
Но это не критично
Код AS3:
if (FlxG.keyboard.pressed("DOWN", "S"))
		{
			if (FlxG.keyboard.pressed("LEFT", "A"))
			{
				newLocX = x - speedDiag;
				newLocY = y + speedDiag;
				angle = 135;
			}
			else 
			{
				if (FlxG.keyboard.pressed("RIGHT", "D"))
				{
					newLocX = x + speedDiag;
					newLocY = y + speedDiag;
					angle = 45;
				}
				else
				{
					newLocY = y + SPEED;
					angle = 90;
				}
			}
		}
		else
		{
			if (FlxG.keyboard.pressed("UP", "W"))
			{
				if (FlxG.keyboard.pressed("LEFT", "A"))
				{
					newLocX = x - speedDiag;
					newLocY = y - speedDiag;
					angle = -135;
				}
				else
				{
					if (FlxG.keyboard.pressed("RIGHT", "D"))
					{
						newLocX = x + speedDiag;
						newLocY = y - speedDiag;
						angle = -45;
					}
					else
					{
						newLocY = y - SPEED;
						angle = -90;
					}
				}
			}
			else
			{
				if (FlxG.keyboard.pressed("LEFT", "A"))
				{
					newLocX = x - SPEED;
					angle = -180;
				}
				else if (FlxG.keyboard.pressed("RIGHT", "D"))
				{
					newLocX = x + SPEED;
					angle = 0;
				}
			}
		}
Еще можно делать простые условия а-ля какая кнопка нажата и вычислять atan2 по значениям нажатых кнопок (допустим, если нажата кнопка ВЛЕВО и ВВЕРХ, то x и y будут равны -1 1 соответственно) Но я почему-то отказался потом от этого метода (не помню почему, но видимо была причина)


Последний раз редактировалось KumoKairo; 11.12.2013 в 17:31.
Старый 11.12.2013, 17:51
vizgl вне форума Посмотреть профиль Отправить личное сообщение для vizgl Найти все сообщения от vizgl
  № 6  
Ответить с цитированием
vizgl
 
Аватар для vizgl

Регистрация: Jun 2012
Сообщений: 70
Вот недавно было тут http://flashgameblogs.ru/blog/developing/1379.html
и тут http://flashgameblogs.ru/blog/developing/1380.html
__________________
Блог: http://devizgl.blogspot.com/

Старый 11.12.2013, 18:22
Anabel вне форума Посмотреть профиль Отправить личное сообщение для Anabel Найти все сообщения от Anabel
  № 7  
Ответить с цитированием
Anabel

Регистрация: Apr 2013
Сообщений: 82
Спасибо огромное всем, кто откликнулся!

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

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

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


 


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


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