2016-02-24 3 views
0

Я новичок в OpenGL и C++, и я пытаюсь разработать небольшую игру. Идея, которую я пытаюсь реализовать, - это 2D-шутер, в котором игрок сталкивается с направлением, которое указывает ваша мышь. Я искал в Интернете какую-то помощь и примеры, но не могу найти много. С чего начать, и кто-нибудь получил хороший псевдо-код, чтобы сделать эту работу? Спасибо!OpenGL - поворот позиции игрока в сторону указателя мыши

+0

Это 2D-шутер или 3D? – aslg

+0

Извините, я должен был упомянуть об этом. Это 2D –

+0

И что блокирует вас от этого? – Guiroux

ответ

2

Независимо от того, какой API вы используете для создания контекста window/GL, вы сможете обрабатывать события, а именно события движения мыши, чтобы вы могли отслеживать положение мыши на координатах экрана. Тогда вы, вероятно, будете использовать орфографическую проекцию, и, возможно, ваша камера не статична и движется вместе с игроком.

Учитывать эти переменные здесь, это список того, что вам нужно.

  1. Для начала вам нужно получить координаты экрана мыши.

  2. Преобразуйте их в мировые координаты.

  3. Рассчитать векторный плеер с этого момента.


1 - Для первой точки, ради примера, я буду использовать SDL, так это то, что я обычно хожу с в своих собственных проектах. В противном случае я попытаюсь сохранить код как можно более общий.

... 
while (SDL_PollEvent(&event)) { 
    if (event.type == SDL_MOUSEMOTION) { 
     mouseScreen.x = event.motion.x; 
     mouseScreen.y = event.motion.y; 
    } 
} 
... 

2 - для второй точки давайте некоторый контекст и предположения. Обычно настройки вашей камеры будет выглядеть так,

viewport(0, screenWidth, 0, screenHeight); 
... 
ortho(projection, cameraLeft, cameraRight, cameraBottom, cameraTop) 
translate(view, -cameraPosition) 

//cameraWidth = cameraRight - cameraLeft; 

В большинстве 2D игр ваши размеры экрана будет таким же, как размеры камеры. Если вы измените размеры камеры, будет выглядеть так, как если бы камера увеличивала/уменьшала изображение, поэтому мы учтем это.

Теперь предположим, что начало координат камеры находится в центре экрана. В этом случае ваша орто-функция будет выглядеть так:

// halfCamWidth = cameraWidth/2; 
// halfCamHeight = cameraHeight/2; 
ortho(projection, -halfCamWidth, halfCamWidth, -halfCamHeight, halfCamHeight); 

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

cameraPosition.x = x - cameraWidth/2; 
cameraPosition.y = y - cameraHeight/2; 

Принимая во внимание, если вы используете центр в качестве происхождения вы могли бы сделать

cameraPosition.x = x; 
cameraPosition.y = y; 

Что делает наш расчеты немного проще. Поэтому, если вы используете другую ссылку, я оставлю это до вас.

Обратно к конверсии, Теперь мы можем преобразовать из координат экрана в координаты мира в два этапа. Сначала нам нужно установить положение мыши в проекции камеры.(Остерегайтесь целочисленных операций, как вы, возможно, придется отливать размеры, чтобы плавать)

mouseWorld.x = cameraLeft + (mouseScreen.x/screenWidth) * cameraWidth; 
mouseWorld.y = cameraBottom + (mouseScreen.y/screenHeight) * cameraHeight; 

Эта формула получает нам соответствующие значения х в [-halfCameraWidth, halfCameraWidth] и у в [-halfCameraHeight, halfCameraHeight], в основном в пределах функции его Орто в. Возможно, если обработка событий может обнаружить положение мыши за пределами окна, вы получите значения за пределами этого интервала, но это не проблема для этой формулы.

Во-вторых, мы теперь должны поставить эту точку вокруг центра камеры,

mouseWorld.x = mouseWorld.x + cameraPosition.x; 
mouseWorld.y = mouseWorld.y + cameraPosition.y; 

И теперь мы имеем мировую позицию.

3 - Наконец, третий пункт, мы вычисляем вектор от игрока к этой точке.

Vector2 playerToMouseDirection = (mouseWorld - player.position); 
playerToMouseDirection.normalize(); 

И все.

Если ваш игрок мгновенно вращается, все готово. Если вы хотите, чтобы ваш игрок вращался медленнее, вам нужно будет найти способ линейной интерполяции векторов (или углов). Удачи.

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

  • Нет связанных вопросов^_^