C# 记录/检索频率不规则的输入事件

C# 记录/检索频率不规则的输入事件,c#,C#,作为一个玩具,我正在使用iTunesSDK和XNA制作我自己的准吉他英雄游戏。实际的库并不重要,所以我没有标记它们。这个问题是关于数据结构的 基本上,我想开始播放一首歌曲,并允许用户根据歌曲弹奏吉他,在内存中录制红色/黄色/绿色/蓝色/橙色按键以及strum,以便稍后播放 我尝试过几种不同的技术,最精确的是一个按位int[]数组,其中每个元素表示一个10毫秒的时隙(每个int的每个位表示一个物理键),作为从歌曲开始的偏移量。然而,这似乎效率低下,因为我不得不将按键放入这些10毫秒的插槽中,更不用

作为一个玩具,我正在使用iTunesSDK和XNA制作我自己的准吉他英雄游戏。实际的库并不重要,所以我没有标记它们。这个问题是关于数据结构的

基本上,我想开始播放一首歌曲,并允许用户根据歌曲弹奏吉他,在内存中录制红色/黄色/绿色/蓝色/橙色按键以及strum,以便稍后播放

我尝试过几种不同的技术,最精确的是一个按位
int[]
数组,其中每个元素表示一个10毫秒的时隙(每个int的每个位表示一个物理键),作为从歌曲开始的偏移量。然而,这似乎效率低下,因为我不得不将按键放入这些10毫秒的插槽中,更不用说一首几分钟的歌曲的巨大数组了

有什么更好的实施方法的建议吗?我的目标是将此数据结构序列化到磁盘,以便稍后检索。该项目的总体目标是使用这些数据以某种方式将LED控制在歌曲FWIW中


谢谢

我将以日志格式存储加键和减键事件,并以适当的精度使用时间戳(相对于文件的开头)。您可以将列表与自定义类一起用于存储事件类型(哪个键、向上键或向下键)和时间戳的详细信息。

您可能需要有音乐/数学知识的人来帮助?10毫秒对于两个音符之间的间隔来说似乎太短了,但我不是专家。:)你击中了头上的钉子,好吧,10毫秒太短了,但是任何更小的都会产生一个不切实际的巨大阵列!如果10毫秒太短了,你不应该尝试更大的数值,比如50毫秒,而不是更小的数值吗?我的错,我误解了你的评论。是的,Xms>50ms>10ms是理想的,但是我觉得我的设计在概念上是有缺陷的,所以使用这种方法的“pidegon holing”时间片感觉是错误的。谢谢,Mark。我试过这个方法,它和其他方法一样有效。我面临的挑战是,如何在重新播放歌曲时检索播放的键。在播放过程中,如何确保每个重放的关键点都在其准确的记录时间播放?我试图避免经常检查当前播放歌曲的播放时间。您认为Guitar Hero程序员是如何实现这一点的?如果不了解您的应用程序是如何实现的,我很难准确地说出来,但我假设您的应用程序使用异步调用,并且是基于事件的。您可以使用一个类来解析文件并读取下一行。它检查在下一次按键之前必须经过多长时间,并在该时间安排一个事件。处理事件时,还需要安排下一个事件。我不知道GH程序员是如何做到这一点的——虽然不是很好,因为GH3中至少有一个bug,即使你在正确的时间敲出了音符,音乐也不会播放。“它检查下一次按键前必须经过多长时间,并在那个时间安排一个活动。”这离我试图实现的目标越来越近了。假设函数调用几乎是瞬时的,我如何安排一个事件在某个时间触发,或者异步调用后的X毫秒,我想你想储存按键的原因是为了你能a)在屏幕上显示正确的图形,b)检查播放器是否在正确的时间按下按钮。在这两种情况下都比较简单。对于a)您可以使用绘制事件并读取从现在起到+1秒后的所有事件。对于b)您需要检查到最近事件的距离。这两种情况都不需要您自己生成事件。所以这可能比我最初建议的要简单。哇,评论比答案要“胖”得多,哈哈。可能会考虑修改答案?)