我做了一个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 中查找实现。