我製作了一個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的實施。
你遇到什麼問題? – HBP 2013-05-14 18:35:14
碰撞沒有奏效。我下載了一個breakout ROM,並且播放了它,並且沒有發生碰撞。其他一切都很好,但沒有發生碰撞。 – 2013-05-15 00:22:05