2009-12-30 2 views
0

Как игрушка, я использую ITunes SDK и XNA, чтобы создать свою собственную игру quasi-GuitarHero. Фактические библиотеки не важны, поэтому я не пометил их. Этот вопрос касается структуры данных.Запись/получение входных событий с нерегулярной частотой

В принципе, я хочу начать играть песню и позволить пользователю играть на гитаре с песней, записывая в память красные/желтые/зеленые/синие/оранжевые клавиши, а также полосу для воспроизведения позже ,

Я пробовал несколько различных методов, наиболее точным из которых является побитовый массив int[], где каждый элемент представляет временной интервал 10 мс (и каждый бит каждого int представляет физический ключ) один раз в качестве смещения от начала композиции. Однако это кажется неэффективным, поскольку я должен использовать клавиши в этих слотах 10 мс, не говоря уже о большом размере массива для нескольких минутной песни.

Любые предложения по лучшему способу реализации этого? Моя цель - затем сериализовать эту структуру данных на диск для последующего поиска. Общая цель этого проекта состоит в том, чтобы использовать эти данные для управления светодиодами каким-то образом для песни, FWIW.

Спасибо!

+1

Вам может понадобиться человек с музыкой/математическими знаниями, чтобы помочь? 10 мс кажется слишком коротким для промежутка между двумя нотами, но я не эксперт. :) –

+0

Вы попали в гвоздь на голове o.k.w., 10ms слишком короткий, но что-то меньшее в этом даст непрактично ginormous массив! – bufferz

+0

Если 10 мс слишком короткий, разве вы не должны пытаться увеличить значение, например, 50 мс вместо чего-то меньшего? –

ответ

1

Я бы сохранил ключевые и ключевые события в формате журнала с меткой времени (относительно начала файла) с соответствующей точностью. Вы можете использовать List вместе с пользовательским классом для хранения сведений о типе события (какой ключ, а также вверх или вниз) и метку времени.

+0

Спасибо, Марк. Я пробовал этот метод, он работал так же хорошо, как и любой другой. Задача, с которой я сталкиваюсь, заключается в том, как восстановить воспроизводимые клавиши при повторном воспроизведении песни. Как я могу обеспечить, чтобы каждый воспроизведенный ключ воспроизводился в свое точное время во время воспроизведения? Я стараюсь постоянно постоянно проверять время воспроизведения текущей песни. Как вы думаете, что программисты Guitar Hero реализовали это? – bufferz

+0

Не зная немного больше о том, как ваше приложение реализовано, мне сложно точно сказать, но я предполагаю, что ваше приложение использует асинхронные вызовы и основано на событиях. У вас может быть класс, который анализирует файл и читает следующую строку. Он проверяет, сколько времени должно пройти до следующего нажатия клавиши и планировать событие в это время. Когда вы обрабатываете событие, вам также нужно будет запланировать следующее событие. Я не знаю, как это сделали программисты GH - не очень хорошо, потому что в GH3 есть хотя бы одна ошибка, когда музыка не играет, даже если вы нажмете заметку в нужное время. –

+0

«Он проверяет, как долго должен проходить до следующего нажатия клавиши и назначает событие в это время». Это все ближе и ближе к тому, чего я пытаюсь достичь. Как я могу запланировать событие для запуска в определенное время или через X миллисекунды после асинхронного вызова, предполагая, что вызовы функций будут близки мгновенно. – bufferz

Смежные вопросы