2015-02-22 2 views
0

Я попытался найти это, но все результаты были действительно близки к тому, что мне нужно, но не совсем то же самое. Поэтому я должен спросить, как мне поворачивать 2D-объект с помощью нашей клавиатуры в качестве входных данных? Более конкретно, если я нажал &, удерживая клавишу со стрелкой влево, 2D-объект будет вращаться влево (против часовой стрелки) и наоборот. Следует также упомянуть, что 2D-объект неподвижен.Как повернуть 2D-объект?

position = new Vector2(box.X, 475);// 475 is the gameWindow height 
//box.X is for when I have to move the object along the X-axis. 

Это позиция моего текущего 2D-объекта, который сидит вдоль дна. Я думаю, это почти точно так же, как один из тех мраморных шутеровских вещей (Marble buster, Sparkle unleashed и т. Д.).

ответ

2

Вам понадобится переменная, в которой вы будете хранить текущую релаксацию, и одну функцию, в которой вы определяете, какую клавишу нажать. Внутри вашего класса объектов положите Rotation = 0.0f;, что будет использоваться для этого.

Затем внутри вашего метода обновления вам это нужно:

KeyboardState keyBoardState = Keyboard.GetState(); 
if (keyBoardState.IsKeyDown(Keys.Left)){Rotation -= 0.1f;} 
if (keyBoardState.IsKeyDown(Keys.Right)){Rotation += 0.1f;} 

А потом в методе Draw:

spriteBatch.Begin(); 
spriteBatch.Draw(Texture, Position, null, Color.White, Rotation, ObjectCenter, 1.0f, SpriteEffects.None, 0); 
spriteBatch.End(); 

Вам также потребуется переменная ObjectCenter, это Vector2 объект и над этой точкой объекта будет вращаться , для этого проверьте этот ответ: Rotating a sprite around its center

EDIT: GameTime У XNA есть две функции обновления. Рисование и обновление. Не смешивайте эти две функции. Используйте рисование только для рисования на экране и обновления для столкновения, перемещения объекта, объекта обновления. Система пытается выполнить это 60 раз в секунду, и если из-за слишком большого количества вычислений или более медленного компьютера он может опуститься ниже этого значения. (Кстати: XNA есть IsRunningSlowly флаг, который устанавливается истина в данном случае)

Так что, если вы хотите, чтобы убедиться, что объект будет двигаться на 5 пикселей каждую миллисекунду нужно умножить свою ценность как то:

time = gameTime.ElapsedGameTime.TotalMilliseconds; 
player.position.x += 5 * time; 

Итак, если вы хотите повернуть объект на 0,1 радия в секунду:

time = gameTime.ElapsedGameTime.TotalSeconds; 
player.rotate += 0.1 * time; 
+0

Большое вам спасибо! Он отлично работал. Если я могу спросить, есть ли способ сделать это, используя gameTime или deltaTime? – Leon

+0

@Leon Я добавил еще несколько данных, пожалуйста, проверьте, полезно ли вам. –

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