在我的键盘上,我有一些按键可以播放,暂停,播放下一个......来控制音乐。我想知道这是如何在引擎盖下完成的。在操作系统中是否有某种API将信息传递给音乐播放器?玩家是否正在阅读按键并对其作出反应?
是否有统一的方式来控制音乐播放器?
答案 0 :(得分:1)
我将尝试尽可能保持平台独立,但是,在某些时候我将不得不努力使用Windows。
首先,了解按键时发生的情况非常重要;来自Microsoft的此页面完全描述了我将在本节中总结的信息。当您按某个键时,键盘会生成一个扫描码,用于唯一标识您按下的键。但是,这些扫描码依赖于键盘,您将永远不会直接使用它们。操作系统Windows将扫描代码转换为虚拟密钥代码。虚拟密钥代码是特定于OS的代码,类似于它们各自的扫描代码;虚拟键代码是您通常在最低级别使用的代码。我还应该注意,一些虚拟键代码通常与程序员无关 - 例如用于操作系统命令的“ctrl”等键。
Windows的API也可以在上面的链接中找到,但据我所知,它适用于C ++;我不知道Ruby本身。
现在,关于你的第二个问题,玩家是否读取按键并对其作出反应。我将在软件设计中提出与键,按钮等一起使用的公共原理 - 媒体播放器的实际实现是一个不同的问题。用户输入完全需要用户交互,通常采用面向对象设计中的Oberserver-Oberservable模式实现;以下link解释了ruby的这种模式。
在我们的例子中,我们将使用一个充当Oberservable的KeyboardListener;它将从操作系统“请求”按下按键时通知它。同样,让我们拥有一个能够使音乐成为播放器,暂停等音乐的音乐管理器 - 它可以充当过度服务器。按下某个键时,KeyboardListener将实例化一个对象,该对象包含有关按下了哪种键的信息并将其传递给MusicManager。根据这个实现,这将是幕后发生的事情:
按暂停按钮
操作系统通知KeyboardListener已按下暂停按钮
KeyboardListener创建一个事件,其中包含按下的按钮并将其传递给MusicManager
MusicManager确定行动原因
那么为什么我们不跳过第2步直接进入3?这样做有几个原因,但我只提供一个 - 它允许软件以独立于平台,可维护的方式设计。必须采用的唯一代码是KeyboardListeners;它只需要改变其代码“请求”操作系统的通知。因此,我们将拥有一个WindowsKeyboardListener,LinuxKeyboardListener等。实际使用哪个特定的Listener取决于运行时环境。