在游戏中,有一种情况是斜向移动,就是同时按下两个方向,形成斜线操作,在Win32GDI开发中,可以通过在逻辑循环里加入键盘状态判断取得多个键进行操作,但是在Silverlight中键盘的事件是单个的,不能取得多个键盘的状态,园友提出一个问题,就是我的Flyer小游戏只能上下左右控制,而不能斜向行动,今天我们来解决这个问题,实现八个方向的正确行为动作。
针对这个解决方案初步的想法,对于键盘的输入来说,可以使用一个队列进行键盘状态保存,比如使用一个List保存Key的状态,然后在KeyUp的时候释放掉没有用的Key,判断一下按下的顺序就可能得到所有方向的状态,但是这有几个问题,在按下多键都会出重复键问题,而按下的顺序未必准确,那么出队列未必一定是准确的释放,比如我可以同时按下ABC,而释放顺序是BCA,得到的结果就不是一个准确的List,这种方法看起来可行,但是实际过程中却不一定是这样的情况,所以问题没有解决。
这个实现可能有很多解决方案,在这里我们用一个直观的解决方案来解决,使用状态表来完成,可以分析出来一个按键行为和行动方向行为的共性,他们是一个3x3的图像:
从上面的图形可以看出来,是一个3x3的二维数组,看看和什么很像呢——游戏手柄,我们可以用一个二维数组来保存所有的状态,将按下的数字组合查表得到对应的状态。
就如上图所示,我们可以使用一个状态来完成它,写成代码的就是这样:
public enum emUserDir
{
上, 下, 左, 右, 左上, 右上, 左下, 右下, 中
}
emUserDir[,] UserDir = new emUserDir[3, 3]
{
{emUserDir.左上,emUserDir.上,emUserDir.右上},
{emUserDir.左,emUserDir.中,emUserDir.右},
{emUserDir.左下,emUserDir.下,emUserDir.右下}
};
下面示例是在自建工程MainPage中的KeyDown事件:
void MainPage_KeyDown(object sender, KeyEventArgs e)
{
string temp = e.Key.ToString();
switch (e.Key)
{
case Key.Up:
if(vertical > 0)
vertical -= 1;
break;
case Key.Down:
if (vertical < 2)
vertical += 1;
break;
case Key.Left:
if (horizontal > 0)
horizontal -= 1;
break;
case Key.Right:
if (horizontal <2 )
horizontal += 1;
tbTextRightKey.Text = temp + "=按下";
break;
}
string Text = UserDir[vertical, horizontal].ToString();
}
可以在最后的Text得到准确的位置枚举信息,为了更直观,咱们做一个输出信息,具体Code就请下载源代码吧:)在这里下载
而最终的效果如下,各位下载代码直接运行看吧
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架