私はchip8エミュレーターを書いています-http ://en.wikipedia.org/wiki/CHIP-8
私はすべてのオペコードとグラフィック計算をテストしましたが、現在ユーザー入力に苦労しています。ユーザー入力を監視し、必要に応じてレジスタを変更する次の方法があります(chip8を使用する場合、ユーザー入力は対応するメモリレジスタを変更します。たとえば、「0」を押すと、V0レジスタが0に設定されます。
私の問題は、次のコードが各オペコードをフェッチして計算し、その操作がwhileループに含まれていることです。そして、これが実行されている間、私のアプリケーションはユーザー入力を検出できません。そのため、ROMが起動し、レジスタの変更またはユーザー入力を待つだけでロックされたままになります。無限ループに陥り続け、グローバルブール値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
}
だから私は今ゲームループのアイデアを試しましたが、キーを押すことを返すメソッドをC#で作成する方法を見つけることができません。ここで何かが足りないかもしれませんが、理解できないようです。
また、CPU計算を別のスレッドで実行する別の方法を試しましたが、これによりわずかな遅延の問題が発生しています。
Whileループ内で呼び出すことができる、押されているキーの値を返すC#のメソッドの例を実際に見たいと思います。