我一直在寫一個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循環中調用!
謝謝!這看起來很有希望,我只需要弄清楚處理鍵盤事件的細節以及如何處理它。這看起來像一個非常好的計劃!稍後我會發布更新 – Bubo