我正在创建一个这样的游戏,其中有两个玩家,每个人控制他们各自独立的积木,上下移动,还有一个球在周围弹跳,目的是让球在玩家的单位后面并触摸墙壁(这是Wii Play上的游戏,如果这有帮助=D)
我面临的问题是我使用事件,比如Private Sub Form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
。很简单的东西。
以前,我只做过单人游戏,所以这不是什么大问题(但它阻止了我的对角移动等,因为两个独立的事件没有一起处理,它们是单独处理的)。那么问题是什么呢?那么两个玩家,同时按多个键,怎么处理呢?
TL;DR:有多个关键事件同时发生。我如何一次处理所有这些问题呢?
发布于 2012-12-29 20:29:12
有多种方法可以做到这一点。当同时按下多个键时,将多次引发Form.KeyDown
事件,每个键一次,因此您可以在引发KeyDown
和KeyUp
事件时跟踪每个键的当前状态。或者,您也可以通过使用Application.AddMessageFilter
方法将KeyMessageFilter
添加到应用程序的消息筛选器中来执行类似的操作。像这样跟踪每个键的状态可能是有意义的,如果你必须检查许多键并经常这样做,然而,更简单的方法,也可能是同样有效的方法,就是根据需要使用Joseph Lee推荐的Keyboard.IsKeyDown
方法(.NET Framework3.0及更高版本),或者使用user32.dll ( 3.0版之前的框架)中的Win32 API调用GetKeyState
来检查每个键的状态。
在下面的评论中回答你的问题,user32.dll是一个标准的windows库。它是统称为Win32应用程序接口的标准库列表中的一个。它和Windows一样存在了很长时间,甚至在95年之前。它是一个非托管库,简单地说,这意味着它不是用.NET编写的,也不使用.NET框架。它们本质上是您与Windows操作系统直接通信的方式。
.NET框架中提供的许多方法都只是对旧的Win32应用编程接口调用的包装。如果.NET框架中的托管类提供了相同的功能,您几乎总是希望使用它而不是Win32应用编程接口调用。托管库比Win32应用编程接口更受欢迎的原因有很多:
因此,如果您是在3.0版或更高版本的框架上开发应用程序,我建议您使用Keyboard
类,因为它是托管代码。除非其他选项对您不起作用,否则我只会使用Win32应用程序接口。
发布于 2012-12-29 20:21:20
假设您是通过Windows应用程序(而不是网站)执行此操作。
要同时处理多个按键,您不能通过Key事件执行此操作。相反,创建一个触发/执行函数的Timer对象(非常快)。在该函数中,使用System.Windows.Input命名空间中键盘类,特别是isKeyDown()方法。
If Keyboard.IsKeyDown(Key.Up) And Keyboard.IsKeyDown(Key.Right) Then
'Do something to move Up-right
End If
干杯。
发布于 2012-12-29 20:21:48
我听说人们在游戏中使用GetAsyncKeyState来处理按键。这是我给你的一个小例子:
Imports System.Runtime.InteropServices
Public Class Form1
<DllImport("user32.dll")> _
Public Shared Function GetAsyncKeyState(ByVal vKey As System.Windows.Forms.Keys) As Short
End Function
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Dim keyhandler As New Threading.Thread(AddressOf handlekeys)
keyhandler.Start()
End Sub
Sub handlekeys()
While True
If GetAsyncKeyState(Keys.Up) Then
'do something if up arrow key is being pressed
ElseIf GetAsyncKeyState(Keys.Down) Then
'do something if down arrow key is being pressed
End If
Threading.Thread.Sleep(1)
End While
End Sub
End Class
这允许您一次处理多个密钥。此外,您可以使用计时器而不是带睡眠的线程。
https://stackoverflow.com/questions/14085467
复制相似问题