我有一个小问题,我无法解决。我目前正在学习将矢量数学和三角学应用于游戏,要了解我创造了一个游戏,其中玩家飞行的是各种各样的太空船但是我有问题。
我的动作似乎倒了?
他会正确地向上和向下飞行,但是左右运动是倒置的吗?
这是我的代码:
protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
Exit();
// TODO: Add your update logic here
angleDeg = (float)(angle * (360 / (Math.PI * 2)));
var angleRad = (float)MathHelper.ToRadians(angleDeg);
var delta = (float)gameTime.ElapsedGameTime.TotalSeconds;
xSpeed = (float)Math.Cos(angle) * speed;
ySpeed = (float)Math.Sin(angle) * speed;
position.Y += xSpeed * delta;
position.X += ySpeed * delta;
keyboardState = Keyboard.GetState();
if(angleDeg < -360 || angleDeg > 360)
{
angle = 0;
angleDeg = 0;
}
if(keyboardState.IsKeyDown(Keys.Left))
{
angle -= 1f * delta;
}
if (keyboardState.IsKeyDown(Keys.Right))
{
angle += 1 * delta;
}
if (keyboardState.IsKeyDown(Keys.Up))
{
speed -= 1f;
}
if (keyboardState.IsKeyDown(Keys.Down))
{
speed += 1f;
}
base.Update(gameTime);
}
/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Black);
// TODO: Add your drawing code here
spriteBatch.Begin();
spriteBatch.Draw(player, position, sourceRect, Color.White, angle, origin, 1.0f, SpriteEffects.None, 1);
spriteBatch.DrawString(font, "Rotation: " + angleDeg, new Vector2(10, 5), Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
任何人都有任何关于为什么会这样做的想法?
提前致谢。
答案 0 :(得分:0)
正如Andrew Russell this answer所说的那样:
如果你正在使用像sin或cos或atan2这样的数学函数,那么 绝对角度始终从X +轴开始为零弧度,并且 正旋转方向朝Y +方向旋转。
XNA SpriteBatch在Client Space中运行。哪里&#34; up&#34;是Y-,而不是Y + (如笛卡尔空间,投影空间,以及大多数人通常的情况 选择他们的世界空间)。这使旋转显示为 顺时针(不像笛卡尔空间那样逆时针)。该 旋转产生的实际坐标是相同的。
从这部分代码:
if(keyboardState.IsKeyDown(Keys.Left))
{
angle -= 1f * delta;
}
if (keyboardState.IsKeyDown(Keys.Right))
{
angle += 1 * delta;
}
左键将顺时针转动您的太空船(较低的角度值),右键将逆时针转动(较高的角度值)。
上次评论:
我的旋转很好,只是当我按下向上箭头时加速 然后转动,运动倒转
我会查看你代码的其他部分:
position.Y += xSpeed * delta;
position.X += ySpeed * delta;
使用 x 速度来更新位置似乎很奇怪。 Y 反之亦然,但也许您需要使用 - = 来更新位置。的ý强>
答案 1 :(得分:0)
数学家的约定和屏幕坐标有时不匹配。
试试这个:
xSpeed = (float)Math.Sin(angle) * speed;
ySpeed = -(float)Math.Cos(angle) * speed; // notice '-' !