2013-05-13 79 views
0

我製作了一個chip8仿真器,但在繪圖時遇到了檢測碰撞時的一些問題。 Chip8通過將各個像素異或到屏幕上來繪製屏幕,​​並在像素關閉時設置標誌。我的代碼如下:chip8仿真器上的碰撞檢測

_DXYN: function(X, Y, N) { 
    console.log("_DXYN"); 

    for (var i = 0; i < N; i++) { 
     for (var j = 0; j < 8; j++) { 
      var bitBefore = graphics[(i + cpu.registers.V[Y]) * 64 + j + cpu.registers.V[X]]; 
      var bitAfter = bitBefore^cpu.getBits(memory[cpu.registers.I + i])[j]; 
      graphics[(i + cpu.registers.V[Y]) * 64 + j + cpu.registers.V[X]] = bitAfter; 

      if ((bitBefore != bitAfter) && bitBefore == 1) 
       cpu.registers.V[0xF] = 0x1; 
      else 
       cpu.registers.V[0xF] = 0x0; 
     } 
    } 
} 

graphics是整數的一維陣列,每個對應於屏幕上的一個像素。如果數組中對應的整數爲1,則該像素開啓,關閉該像素爲0. cpu對象包含所有的方法,包括這一個,以及寄存器。 X是包含要繪製的精靈的x座標的寄存器的操作碼參數,Y是具有y座標的寄存器的操作碼參數。 I寄存器是內存中要讀取的位置。該cpu.getBits功能如下:

getBits: function(opcode) { 
    var bits = []; 
    for (var i = 0; i < 8; i++) { 
     bits.push((opcode >> i) & 1) 
    } 
    return bits.reverse(); 
} 

的完整代碼可以在GitHub在這裏找到:https://github.com/ichub/Chip8 查找範圍chip8cpu.js的實施。

+0

你遇到什麼問題? – HBP 2013-05-14 18:35:14

+0

碰撞沒有奏效。我下載了一個breakout ROM,並且播放了它,並且沒有發生碰撞。其他一切都很好,但沒有發生碰撞。 – 2013-05-15 00:22:05

回答

3

我發現這個網站:http://www.multigesture.net/articles/how-to-write-an-emulator-chip-8-interpreter它詳細解釋瞭如何編寫一個Chip-8解釋器。從CHIP-8和維基百科aticle我認爲你的日常應該是以下幾點:

_DXYN: function(X, Y, N) { 
    console.log("_DXYN"); 

    cpu.registers.V[0xF] = 0x0; 
    for (var i = 0; i < N; i++) { // rows of the sprite 
     for (var j = 0; j < 8; j++) { 
      var bitBefore = graphics[(i + cpu.registers.V[Y]) * 64 + j + 
          cpu.registers.V[X]]; 
      var bitAfter = bitBefore^cpu.getBits(memory[cpu.registers.I + i])[j]; 
      graphics[(i + cpu.registers.V[Y]) * 64 + j + cpu.registers.V[X]] = bitAfter; 

      if ((bitBefore != bitAfter) && bitBefore == 1) 
       cpu.registers.V[0xF] = 0x1; 
     } 
    } 
} 

在你的日常你是VF在每個像素,如果沒有碰撞因此其價值完全取決於被清除最後像素繪製。在開始繪製之前,您應該清除VF,並且只有在發生碰撞時才設置VF。