Показать сообщение отдельно
Старый 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.