首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Chip8模拟器-用户输入

Chip8模拟器-用户输入
EN

Stack Overflow用户
提问于 2012-11-14 14:18:52
回答 1查看 898关注 0票数 2

我一直在编写一个chip8仿真器-- http://en.wikipedia.org/wiki/CHIP-8

我已经测试了所有的操作码以及图形计算,现在我正在为用户输入而苦苦挣扎。我有以下方法监控用户输入并根据需要更改寄存器(当使用chip8时,用户输入更改相应的内存寄存器-例如,点击' 0‘将V0寄存器设置为0。

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

这就是计算和解析操作码的内容

代码语言:javascript
复制
 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);
    }

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

代码语言:javascript
复制
  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
    }

所以我现在已经尝试了游戏循环的想法,但我找不到一种方法来在C#中创建一个返回按键的方法。也许我在这里遗漏了什么,但我似乎找不到它!

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

我真的希望在C#中看到一个方法的例子,它返回一个我可以在While循环中调用的按键的值!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-14 14:35:02

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

下面是一些伪代码。

代码语言:javascript
复制
while (True):
    processInput()
    updateCPU()
    outputGraphics()

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13373949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档