我制作了一个chip8仿真器,但在绘制时检测到碰撞遇到了一些问题。 Chip8通过将各个像素XOR到屏幕上来绘制到屏幕上,并在像素关闭时设置标记。我的代码如下:
_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 :(得分:3)
我找到了这个网站:http://www.multigesture.net/articles/how-to-write-an-emulator-chip-8-interpreter,它详细解释了如何编写Chip-8解释器。从那以及CHIP-8上的维基百科论文,我认为你的例程应该如下:
_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,并仅在发生碰撞时设置它。