2012-11-14 75 views
2

我一直在寫一個chip8模擬器 - http://en.wikipedia.org/wiki/CHIP-8Chip8仿真器 - 用戶輸入

我已經測試了所有的操作碼以及圖形計算和我現在與用戶輸入掙扎。我有以下方法監視用戶輸入,並根據需要更改寄存器(當使用芯片8時,用戶輸入改變相應的存儲器寄存器--EG命中'0'將V0寄存器設置爲0.

我的問題是,我有下面的代碼獲取和計算while循環中包含的每個操作碼及其操作,並且在運行時,我的應用程序無法檢測到用戶輸入,所以ROMS啓動,並且保持鎖定在等待寄存器更改或用戶輸入的位置。我試圖實現一個全局的布爾運算,並且在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 
    } 

所以我現在已經嘗試了遊戲圈的想法,但我無法找到一種在C#中創建方法的方法,它將返回一個按鍵。也許我在這裏錯過了一些東西,但我似乎無法弄清楚!

我也嘗試了另一種方法,涉及在單獨的線程中運行CPU計算,這導致了輕微的延遲問題。

我真的很想看到一個C#中的方法的例子,它返回一個正在按下的鍵的值,我可以在While循環中調用!

回答

4

我建議你設置仿真器的循環,就像遊戲循環一樣。你有一個全局循環觸發你模擬器中每個模塊的更新。在循環中,您可以調用輸入(或通用「事件」)處理器,然後調用操作碼/硬件仿真,然後更新屏幕。

這是一些僞代碼。

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

我不知道該鍵輸入在C#中是如何工作的,如果它是一個異步事件觸發(即「的onkeydown」方法被調用你的循環之外),你可以設置「的onkeydown」,只是將密鑰事件發送給中間事件管理器,然後在「processInput()」中實際解析事件並使用它們更新仿真CPU上的寄存器等。

+0

謝謝!這看起來很有希望,我只需要弄清楚處理鍵盤事件的細節以及如何處理它。這看起來像一個非常好的計劃!稍後我會發布更新 – Bubo