我的玩家移动有什么问题?
本文关键字:问题 什么 玩家 移动 我的 | 更新日期: 2023-09-27 17:51:15
我有一个小问题,我不能解决。我目前正在学习将矢量数学和三角学应用于游戏,为了学习,我创造了一款玩家飞行的各种宇宙飞船的游戏,但我有一个问题。
我的动作好像倒过来了?
他会正确地向上和向下飞行,但是左右运动是倒置的?
下面是我的代码: 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);
}
有人知道为什么会发生这种情况吗?
数学家的约定和屏幕坐标有时不匹配。
试试这个:
xSpeed = (float)Math.Sin(angle) * speed;
ySpeed = -(float)Math.Cos(angle) * speed; // notice '-' !
正如Andrew Russell在回答中所说:
如果你正在使用数学函数,如sin或cos或atan2,那么绝对角度总是从X+轴开始为零弧度,而正旋转方向向Y+方向旋转。
XNA SpriteBatch在客户端空间工作。其中"up"是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;
使用xSpeed来更新位置似乎很奇怪。Y,反之亦然,但也可能需要使用-=来更新位置Y