C# MonoGame - 玩家向后移动

Posted

技术标签:

【中文标题】C# MonoGame - 玩家向后移动【英文标题】:C# MonoGame - backwards player movement 【发布时间】:2021-12-30 16:21:56 【问题描述】:

我正在做一个学校项目,我正在制作一个 astroids 克隆。 我一直在研究玩家移动并实现了以下代码。

我在尝试向后移动玩家精灵时遇到了一些奇怪的行为,我很难理解其背后的数学原理。

我已经在下面评论了问题所在

位置=速度+位置;

        if (Keyboard.GetState().IsKeyDown(Keys.Left)) rotation -= 0.1f;
        if (Keyboard.GetState().IsKeyDown(Keys.Right)) rotation += 0.1f;

        if (Keyboard.GetState().IsKeyDown(Keys.Up))
        
            velocity.X = (float)Math.Cos(rotation) * tangentialVelocity;
            velocity.Y = (float)Math.Sin(rotation) * tangentialVelocity;

        

        //this is where I need help

        if (Keyboard.GetState().IsKeyDown(Keys.Down))
        
            velocity.X = (float)Math.Cos(rotation) - tangentialVelocity;
            velocity.Y = (float)Math.Sin(rotation) - tangentialVelocity;

        
        else if (velocity != Vector2.Zero)
        
            float i = velocity.X;
            float j = velocity.Y;

            velocity.X = i -= friction * i;
            velocity.Y = j -= friction * j;

        

【问题讨论】:

请每一步只调用一次Keyboard.GetState() @Strom 如果你有时间,你能详细说明我在哪里多次调用它,以及为什么我不应该 【参考方案1】:

在我看来,向前/向后推力的逻辑应该如下:

给定一些变量,例如int thrustPower = 1.0f;

if (Keyboard.GetState().IsKeyDown(Keys.Up))

    velocity.X += (float)Math.Cos(rotation) * thrustPower;
    velocity.Y += (float)Math.Sin(rotation) * thrustPower;


if (Keyboard.GetState().IsKeyDown(Keys.Down))

    velocity.X -= (float)Math.Cos(rotation) * thrustPower;
    velocity.Y -= (float)Math.Sin(rotation) * thrustPower;

因此,如果按下Keys.UpKeys.Down,每个轴上的速度将按投影到该轴上的ThrustPower 的正常量进行缩放。

这也解决了必须处理您所谓的tangentialVelocity 的问题,但我认为实际上应该是radialVelocity 或只是speed

【讨论】:

以上是关于C# MonoGame - 玩家向后移动的主要内容,如果未能解决你的问题,请参考以下文章

让玩家根据摄像机角度向前、向右、向左和向后移动

如何在monogame中缩小和增长一个矩形?

每次在libgdx中单击按钮时如何向前和向后移动Sprite?

Monogame,为啥即使有功能,块也不会移动?

弹丸不移动,也不从玩家开始(Unity 2D / C#)

在 Monogame 中按下键时,我需要帮助上下移动精灵