2013-11-17 6 views
1

Я немного новичок в XNA, но знаю достаточно, чтобы начать делать 3D-игру. Я делал все в порядке, но потом, когда я попытался добавить вращения игрока, возникла проблема. Поскольку поворот основан на создании таймера в игре (gameTime.ElapsedGameTime.TotalSeconds), он всегда идет. Если я остановлюсь, а затем начните снова, он прыгнет в новую точку. То, что я хочу сделать, - это поворот, который остановился там, где он остановился. Любое решение оценивается. Код вращения приведен ниже. Дополнительный код доступен по запросу.Временное вращение glitchy movement

//Update view matrix 
    view = Matrix.CreateLookAt(new Vector3(X - 10, Y - 10, Z - 10), new Vector3(lookAt.X, lookAt.Y, lookAt.Z), Vector3.UnitZ); 
    //Update rotation variable 
    rotation += (float)(gameTime.ElapsedGameTime.TotalSeconds); 
    //Get input to determine whether or not to rotate 
    if (key.IsKeyDown(Keys.Left)) lookAt.X = (float)(Math.Cos(rotation)); 
    if (key.IsKeyDown(Keys.Right)) lookAt.X = (float)(Math.Cos(-rotation)); 
    if (key.IsKeyDown(Keys.Left)) lookAt.Y = (float)(Math.Sin(rotation)); 
    if (key.IsKeyDown(Keys.Right)) lookAt.Y = (float)(Math.Sin(-rotation)); 

ответ

2

Ваш код эффективно создает постоянно вращающийся объект, который занимает 6,28 секунды, чтобы выполнить полный оборот, затем устанавливает вращение камеры в соответствии с ней, если левая кнопка нажата или обратными, что вращение если правая клавиша нажата. Когда ни одна клавиша не нажата, угол игрока не изменяется, но вращение обновляется независимо.

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

// Update rotation 
if (key.IsKeyDown(Keys.Left)) 
    rotation += (float)gameTime.ElapsedGameTime.TotalSeconds; 
if (key.IsKeyDown(Keys.Right)) 
    rotation -= (float)gameTime.ElapsedGameTime.TotalSeconds; 

// Calculate lookAt from rotation 
lookAt.X = (float)Math.Cos(rotation); 
lookAt.Y = (float)Math.Sin(rotation); 

// Update view matrix 
view = Matrix.CreateLookAt(new Vector3(X - 10, Y - 10, Z - 10), new Vector3(lookAt.X, lookAt.Y, lookAt.Z), Vector3.UnitZ); 

ElapsedGameTime по-прежнему важна, поскольку она определяет, как далеко вы должны вращаться в зависимости от того, как долго с момента последнего обновления.

Кроме того, порядок, в котором вы делаете вещи, важен здесь. Если вы обновите матрицу view перед вычислением новых значений rotation и lookAt, ваше представление будет отставать от состояния игры одним обновлением. Обновите матрицу view после выполнения кода обработки.

+0

Большое спасибо. Я иногда делаю что-то вроде этого, когда думаю, что есть только некоторый расширенный ответ, поэтому я делаю все эти проводные вещи, пока есть простой, просто сидящий там. Я попробовал, и он отлично работает! Еще раз спасибо! – SupremeSteak1