我的播放器运动出了什么问题?

时间:2015-05-30 12:38:21

标签: c# xna monogame

我有一个小问题,我无法解决。我目前正在学习将矢量数学和三角学应用于游戏,要了解我创造了一个游戏,其中玩家飞行的是各种各样的太空船但是我有问题。

我的动作似乎倒了?

他会正确地向上和向下飞行,但是左右运动是倒置的吗?

这是我的代码:

 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);
    }

任何人都有任何关于为什么会这样做的想法?

提前致谢。

2 个答案:

答案 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 '-' !

基于this answer.