c# – 使用KeyDown事件平滑移动控件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用KeyDown事件平滑移动控件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2363字,纯文字阅读大概需要4分钟。
内容图文
![c# – 使用KeyDown事件平滑移动控件](/upload/InfoBanner/zyjiaocheng/811/b3004ac3dd72402298eff7485310a6d1.jpg)
我正在尝试使用Visual Studio Windows窗体应用程序在C#中创建一个简单的游戏.我想让用户能够使用相应的键自由地向上,向右,向下和向左移动蓝色框.
我正在使用一个Timer,它每0.1秒检测一次盒子的新位置,以及一个实际改变盒子位置的keydown事件.
按住键时,盒子需要保持相应方向的移动.
我的问题是,我当前的程序完成了这项工作,除了当用户第一次按下一个键时,该框移动一点并在它继续移动之前暂停一会儿.我想让这个盒子从第一次按键移动得更顺畅而不会像那样暂停.这可能很难通过单词解释,所以我添加了一个gif文件.
有没有办法来解决这个问题?这是我目前的代码.
private int posX, posY; //Both initialized in Form Load event
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Up)
posY -= 3;
else if (e.KeyCode == Keys.Right)
posX += 3;
else if (e.KeyCode == Keys.Down)
posY += 3;
else if (e.KeyCode == Keys.Left)
posX -= 3;
}
//Timer ticks every 0.1 second
private void Timer_Tick(object sender, EventArgs e)
{
Box.Location = new Point(posX, posY);
labelPosX.Text = posX.ToString(); //Testing purposes
labelPosY.Text = posY.ToString(); //Testing purposes
}
我很乐意使用KeyDown事件来实现这一目标,但如果在真实游戏世界中有更好或更常用的方法,我也很想知道它!
解决方法:
在Timer_Tick方法中使用Keyboard.IsKeyDown方法,不要监听keydown事件.
像这样:
double posX, posY;
private void Timer_Tick(object sender, EventArgs e)
{
double velocity = /*(speed: pixels per seconds)*/ 100 * /*(timer tick time in seconds)*/ 0.003;
if (Keyboard.IsKeyDown(Keys.Up))
{
posY -= velocity;
}
else if (Keyboard.IsKeyDown(Keys.Down))
{
posY += velocity;
}
//Also, don't put else here, so you can go diagonally.
if (Keyboard.IsKeyDown(Keys.Left))
{
posX -= velocity;
}
else if (Keyboard.IsKeyDown(Keys.Right))
{
posX += velocity;
}
Box.Location = new Point((int)posX, (int)posY);
labelPosX.Text = posX.ToString(); //Testing purposes
labelPosY.Text = posY.ToString(); //Testing purposes
}
public static class Keyboard
{
private static readonly HashSet<Keys> keys = new HashSet<Keys>();
public static void OnKeyDown(object sender, KeyEventArgs e)
{
if (keys.Contains(e.KeyCode) == false)
{
keys.Add(e.KeyCode);
}
}
public static void OnKeyUp(object sender, KeyEventArgs e)
{
if (keys.Contains(e.KeyCode))
{
keys.Remove(e.KeyCode);
}
}
public static bool IsKeyDown(Keys key)
{
return keys.Contains(key);
}
}
要使用Keyboard类,请在InitializeComponent方法中设置Form1的KeyDown和KeyUp事件.
KeyDown += Keyboard.OnKeyDown;
KeyUp += Keyboard.OnKeyUp;
您可以通过改变速度来控制它的速度.
内容总结
以上是互联网集市为您收集整理的c# – 使用KeyDown事件平滑移动控件全部内容,希望文章能够帮你解决c# – 使用KeyDown事件平滑移动控件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。