2015-10-07 4 views
2

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

player = {} 
player.x = 10 
player.y = 10 
player.velocity = 50 

Моей цели иметь игрок движение к позиции мышек на экране. В настоящее время я настроен для увеличения/уменьшения значения x и значения y для каждого обновления в зависимости от положения мыши. Мой код выглядит примерно так:

function update(delta_time) -- delta_time is time in milliseconds since last update 
    if mouse.x > screen.width and mouse.y < screen.height then 
    player.x = player.x + player.velocity * delta_time 
    player.y = player.y + player.velocity * delta_time 
end 

Это был только один пример направления, которое я бы определил. Моя проблема заключается в том, что я не хочу иметь гигантские блоки управления потоком, проверяющие, в каком квадранте находятся позиция x и y мыши, и соответственно корректируя положение игроков x и y. Я предпочел бы иметь текущее 360-градусное обнаружение, которое может переместить игрока к углу, который мышь позиционирует из центра.

Еще одна проблема, с которой я столкнулся, когда я перемещаю плеер справа от экрана, я просто увеличиваю значение x, но когда я перемещаю плеер на северо-восточную сторону экрана, я увеличиваю значение x AND y , Это означает, что игрок будет идти в 2 раза быстрее, в зависимости от того, насколько тонким является угол движения. Когда я делаю северо-восточный восток и северо-западный запад, игрок теперь идет на 3 раза быстрее, потому что я увеличиваю/уменьшаю y на 2 и x на 1. Я понятия не имею, как это исправить. Я действительно хорош с математикой и триггером, но я плохо отношусь к своей игре. Мне нужно, чтобы кто-то включил свет для меня, и я пойму. Спасибо за ваше время, если вы действительно все это прочитали.

+0

Как вы думаете, может быть, вы можете ссылаться на весь код, используя pastebin? – Coffee

+1

@Coffee Если утверждение, показанное мной в качестве примера, было недостаточно? Он просто проверяет квадрант, в котором находится мышь, и соответственно увеличивает/уменьшает значения x и y для каждого обновления. Если вам нужно, чтобы я подробно рассказывал об определенной части игры, я могу; дай мне знать. –

+0

Хорошо, nvm - Думаю, этого должно быть достаточно – Coffee

ответ

4

Вычислить вектор из позиции игрока в положение мыши. Нормализовать этот вектор (т. Е. Разделить его по его длине), затем умножить на player.velocity, а затем добавить его в player.x и player.y. Таким образом, скорость будет постоянной, и вы получите плавное движение во всех направлениях.

-- define the difference vector 
vec = {} 
vec.x = mouse.x - player.x 
vec.y = mouse.y - player.y 

-- compute its length, to normalize 
vec_len = math.pow(math.pow(vec.x, 2) + math.pow(vec.y, 2), 0.5) 

-- normalize 
vec.x = vec.x/vec_len 
vec.y = vec.y/vec_len 

-- move the player 
player.x = player.x + vec.x * player.velocity * delta_time 
player.y = player.y + vec.y * player.velocity * delta_time 
+0

Можете ли вы предоставить мне пример? Я в старшей школе, и я делаю эту игру для лагеря компьютерной науки. К сожалению, я ничего не узнал о векторной форме. Для примера вы можете использовать другой язык программирования, например C или Python. –

+0

добавлен код (не уверен в синтаксисе lua, но я надеюсь, что вы поняли идею) –

+0

Это сработало. Какова математика за кулисами на самом деле? –

Смежные вопросы