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