2013-05-13 40 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。