gpt4 book ai didi

c# - Chip8 仿真器 - 用户输入

转载 作者:行者123 更新时间:2023-11-30 21:02:36 27 4
gpt4 key购买 nike

我一直在写一个 chip8 模拟器 -- http://en.wikipedia.org/wiki/CHIP-8

我已经测试了所有的操作码和图形计算,现在我正在努力处理用户输入。我有以下方法监视用户输入并根据需要更改寄存器(使用 chip8 时,用户输入会更改相应的内存寄存器 - 例如,点击“0”会将 V0 寄存器设置为 0。

我的问题是我有以下代码获取和计算每个操作码及其包含在 while 循环中的操作。并且在运行时我的应用程序无法检测到用户输入。因此,ROMS 启动并保持锁定状态,等待寄存器更改或用户输入。一直卡在死循环中,我尝试实现一个全局的 bool RUN,启动while循环后检测不到。我假设它超出了循环的范围,但从我读到的内容来看,键盘事件触发了一个中断,该中断应该从几乎任何地方都可以看到,有什么想法吗?

这是计算和解析操作码的部分

 private void button1_Click(object sender, EventArgs e)
{
// This will become the run function
do{
for (int i = 0; i < 2; i++)
{
opc[i] = mem[mc]; // fetching the instruction from the memory array
mc++;
}
cibox.Clear(); // Just clearing Debugging text boxes in the UI
pcbox.Clear();
pc++;
pcbox.Text += pc;
cibox.Text += opc[0].ToString("X2") + "-" + opc[1].ToString("X2");
calculations(opc); // Parses the Opcode and does the corresponding operation
}while(run);
}

这个方法是控制用户输入...

  protected override void OnKeyDown(KeyEventArgs keyEvent) // Listens for Keyboard events! Read More: http://www.geekpedia.com/tutorial53_Getting-input-from-keyboard.html
{
keyPress = true;
//Gets the key code found at keyEvent...
MessageBox.Show("KeyCode: " + keyEvent.KeyCode.ToString());
String register = keyEvent.KeyCode.ToString();
if (register == "Escape")
{

Application.Exit();
run = false;
}
try
{
registerVal = int.Parse(register, System.Globalization.NumberStyles.HexNumber); // Second Nibble! --> Int Format
}
catch (System.ArgumentNullException e)
{
return;
}
catch (System.ArgumentException)
{
return;
}
catch (System.FormatException)
{
return;
}
catch (System.OverflowException)
{
return;
}
if (registerVal >= 208)
{
registerVal = registerVal - 208;
}
if (registerVal <= 15)
{
mem[registerVal] = (byte)registerVal;
}
display(); // Alters UI to display state of registers, etc
}

所以我现在已经尝试了 Game Loop Idea,但是我找不到在 C# 中创建一个方法来返回按键操作的方法。也许我在这里遗漏了什么,但我似乎无法弄清楚!

我还尝试了另一种方法,涉及在单独的线程中运行 CPU 计算,这会导致轻微的延迟问题。

我真的很想看一个 C# 中的方法示例,它返回按下的键的值,我可以在 While 循环中调用它!

最佳答案

我建议您将模拟器的循环设置为游戏循环。您有一个全局循环,它会触发模拟器中每个模块的更新。在循环中,您调用输入(或通用“事件”)处理器,然后是操作码/硬件仿真,然后是屏幕更新。

这是一些伪代码。

while (True):
processInput()
updateCPU()
outputGraphics()

我不知道键输入在 C# 中是如何工作的,如果它是一个异步事件触发器(即“OnKeyDown”方法在循环之外被调用),您可以设置“OnKeyDown”以仅发送键事件到中间事件管理器,然后在“processInput()”中,您实际解析事件并使用它们更新模拟 CPU 等上的寄存器。

关于c# - Chip8 仿真器 - 用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13373949/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com