C# 运动中的平稳过渡?

C# 运动中的平稳过渡?,c#,sfml,C#,Sfml,我带着另一个问题回来了。我对SFML还是新手,所以这一次似乎有点难。我试过使用while循环之类的,但是没有用 我现在正在做的游戏是一辆汽车在X轴上来回移动,然后我猜它将能够拾取点和东西,或者只是避免物体向汽车靠近,直到它最终死亡 如何使运动更平滑?目前,汽车将首先移动8个单位,然后向所需方向移动8个单位,直到我松开按钮。当我用另一种方式做的时候也是一样的。我想它只是立即移动,并保持移动,当我按下任何一个键 static void OnKeyPressed(object sender,

我带着另一个问题回来了。我对SFML还是新手,所以这一次似乎有点难。我试过使用while循环之类的,但是没有用

我现在正在做的游戏是一辆汽车在X轴上来回移动,然后我猜它将能够拾取点和东西,或者只是避免物体向汽车靠近,直到它最终死亡

如何使运动更平滑?目前,汽车将首先移动8个单位,然后向所需方向移动8个单位,直到我松开按钮。当我用另一种方式做的时候也是一样的。我想它只是立即移动,并保持移动,当我按下任何一个键

    static void OnKeyPressed(object sender, EventArgs e)
    {
        Vector2f newPos = new Vector2f(0, car.Position.Y);
        KeyEventArgs ke = (KeyEventArgs)e;
        if (ke.Code.Equals(Keyboard.Key.A))
        {
            if (car.Position.X != 0)
            {
                newPos.X = car.Position.X - 8;
                car.Position = newPos;
            }
            else if (car.Position.X < 0)
            {
                newPos.X = 0;
                car.Position = newPos;
            }
            else if(car.Position.X == 0)
            {
                // Do nothing
            }
        }
        else if (ke.Code.Equals(Keyboard.Key.D))
        {
            if (car.Position.X != window.Size.X - 32)
            {
                newPos.X = car.Position.X + 8;
                car.Position = newPos;
            }
            else if (car.Position.X > window.Size.X)
            {
                newPos.X = window.Size.X;
                car.Position = newPos;
            }
            else if (car.Position.X == window.Size.X)
            {
                // Do nothing
            }
        }
    }
static void OnKeyPressed(对象发送方,事件参数e)
{
Vector2f newPos=新的Vector2f(0,car.Position.Y);
KeyEventArgs ke=(KeyEventArgs)e;
if(ke.Code.Equals(Keyboard.Key.A))
{
if(car.Position.X!=0)
{
newPos.X=car.Position.X-8;
car.Position=newPos;
}
否则如果(轿厢位置X<0)
{
新位置X=0;
car.Position=newPos;
}
else if(car.Position.X==0)
{
//无所事事
}
}
else if(ke.Code.Equals(Keyboard.Key.D))
{
if(car.Position.X!=window.Size.X-32)
{
新位置X=汽车位置X+8;
car.Position=newPos;
}
else if(car.Position.X>window.Size.X)
{
newPos.X=window.Size.X;
car.Position=newPos;
}
else if(car.Position.X==window.Size.X)
{
//无所事事
}
}
}
以及整个参考资料:

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using SFML.Audio;
using SFML.Graphics;
using SFML.Window;

namespace SFMLCarGame
{
    class Program
    {
        private static RenderWindow window;
        private static Sprite car;

        static void Main(string[] args)
        {
            window = new RenderWindow(new VideoMode(256,512), "Car Game");
            window.Closed += new EventHandler(OnClose);
            window.KeyPressed += new EventHandler<KeyEventArgs>(OnKeyPressed);

            Sprite bg = new Sprite(new Texture("road.png"));
            car = new Sprite(new Texture("car.png"));
            car.Position = new Vector2f(window.Size.X / 2, window.Size.Y - 96);
            while (window.IsOpen())
            {
                window.DispatchEvents();

                window.Clear();

                window.Draw(bg);
                window.Draw(car);

                window.Display();
            }
        }

        static void OnClose(object sender, EventArgs e)
        {
            RenderWindow window = (RenderWindow)sender;
            window.Close();
        }

        static void OnKeyPressed(object sender, EventArgs e)
        {
            Vector2f newPos = new Vector2f(0, car.Position.Y);
            KeyEventArgs ke = (KeyEventArgs)e;
            if (ke.Code.Equals(Keyboard.Key.A))
            {
                if (car.Position.X != 0)
                {
                    newPos.X = car.Position.X - 8;
                    car.Position = newPos;
                }
                else if (car.Position.X < 0)
                {
                    newPos.X = 0;
                    car.Position = newPos;
                }
                else if(car.Position.X == 0)
                {
                    // Do nothing
                }
            }
            else if (ke.Code.Equals(Keyboard.Key.D))
            {
                if (car.Position.X != window.Size.X - 32)
                {
                    newPos.X = car.Position.X + 8;
                    car.Position = newPos;
                }
                else if (car.Position.X > window.Size.X)
                {
                    newPos.X = window.Size.X;
                    car.Position = newPos;
                }
                else if (car.Position.X == window.Size.X)
                {
                    // Do nothing
                }
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Threading.Tasks;
使用SFML.Audio;
使用SFML.Graphics;
使用SFML.Window;
名称空间SFMLCarGame
{
班级计划
{
私有静态渲染窗口;
私人静态雪碧车;
静态void Main(字符串[]参数)
{
窗口=新渲染窗口(新视频模式(256512),“汽车游戏”);
window.Closed+=新的EventHandler(OnClose);
window.KeyPressed+=新事件处理程序(OnKeyPressed);
雪碧bg=新雪碧(新纹理(“road.png”);
car=新精灵(新纹理(“car.png”);
car.Position=新矢量2f(window.Size.X/2,window.Size.Y-96);
while(window.IsOpen())
{
window.DispatchEvents();
window.Clear();
窗口绘制(bg);
窗。画(车);
window.Display();
}
}
静态void OnClose(对象发送方、事件参数)
{
RenderWindow=(RenderWindow)发送方;
window.Close();
}
静态void OnKeyPressed(对象发送方,事件参数e)
{
Vector2f newPos=新的Vector2f(0,car.Position.Y);
KeyEventArgs ke=(KeyEventArgs)e;
if(ke.Code.Equals(Keyboard.Key.A))
{
if(car.Position.X!=0)
{
newPos.X=car.Position.X-8;
car.Position=newPos;
}
否则如果(轿厢位置X<0)
{
新位置X=0;
car.Position=newPos;
}
else if(car.Position.X==0)
{
//无所事事
}
}
else if(ke.Code.Equals(Keyboard.Key.D))
{
if(car.Position.X!=window.Size.X-32)
{
新位置X=汽车位置X+8;
car.Position=newPos;
}
else if(car.Position.X>window.Size.X)
{
newPos.X=window.Size.X;
car.Position=newPos;
}
else if(car.Position.X==window.Size.X)
{
//无所事事
}
}
}
}
}
您可能希望从SFML的网站上阅读此内容

这些事件是由操作系统触发的,对于某些目的(退出事件、按键、单击鼠标左键)是有用的,但对于需要经常更新的内容则不是。假设您正在编写一些文本,并按住“A”键。你的文本会像
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa。比如说,你一秒钟就能收到6封信。事件也是如此。当游戏以60 fps的速度运行和显示时,很明显你的动作不会很流畅,也很难控制

希望SFML提供了一种检查键盘(以及鼠标和操纵杆)即时状态的方法。使用C#binding(我假设您使用的是2.0版本的绑定,如果您不使用,那么您应该使用),您只需检查
键盘。
在主循环中执行此操作将在每一帧检查按键是否按下,而不是等待速度慢得多的操作系统事件

请注意,如果您之前的问题回答正确,请通过接受答案来标记这些问题

编辑:我的计算机上没有安装.NET的SFML,但下面是它的外观

static void Main(string[] args)
    {
        window = new RenderWindow(new VideoMode(256,512), "Car Game");
        window.Closed += new EventHandler(OnClose);
        // Note this
        // window.KeyPressed += new EventHandler<KeyEventArgs>(OnKeyPressed);

        Sprite bg = new Sprite(new Texture("road.png"));
        car = new Sprite(new Texture("car.png"));
        car.Position = new Vector2f(window.Size.X / 2, window.Size.Y - 96);
        while (window.IsOpen())
        {
            window.DispatchEvents();
            CheckInputs(); // and this !

            window.Clear();

            window.Draw(bg);
            window.Draw(car);

            window.Display();
        }
    }

void CheckInputs()
{
    if(Keyboard.isKeyPressed(Keyboard.key.A))
    {
        if(car.Position.X < 0)
            car.Position.X = 0
        else if(car.Position.X > 0)
            car.Position.X -= 8; // shortcut for 'car.Position.X = car.Position.X - 8'
    }
    else if(Keyboard.isKeyPressed(Keyboard.key.D))
    {
        // etc
    }
}
static void Main(字符串[]args)
{
窗口=新渲染窗口(新视频模式(256512),“汽车游戏”);
window.Closed+=新的EventHandler(OnClose);
//注意这一点
//window.KeyPressed+=新事件处理程序(OnKeyPressed);
雪碧bg=新雪碧(新纹理(“road.png”);
car=新精灵(新纹理(“car.png”);
汽车位置=东北