2

私は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#のメソッドの例を実際に見たいと思います。

4

1 に答える 1

4

ゲームループのようにエミュレータのループを設定することをお勧めします。エミュレーターの各モジュールへの更新をトリガーする1つのグローバルループがあります。ループでは、入力(または一般的な「イベント」)プロセッサを呼び出し、次にオペコード/ハードウェアエミュレーションを呼び出し、次に画面の更新を呼び出します。

これがいくつかの擬似コードです。

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

キー入力がC#でどのように機能するかわかりません。非同期イベントトリガーの場合(つまり、「OnKeyDown」メソッドがループの外部で呼び出される場合)、「OnKeyDown」を設定してキーイベントを中間に送信するだけです。イベントマネージャ、次に「processInput()」で実際にイベントを解決し、それらを使用してエミュレートされたCPUなどのレジスタを更新します。

于 2012-11-14T06:35:01.660 に答える