我的玩家移动有什么问题?

本文关键字:问题 什么 玩家 移动 我的 | 更新日期: 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