芯片8模拟器上的碰撞检测
Collision detection on chip8 emulator
我制作了一个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
是一个一维int数组,每个int对应屏幕上的一个像素。如果一个像素在数组中对应的整数是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();
}
完整的代码可以在这里找到:https://github.com/ichub/Chip8查看chip8cpu.js中的实现
我找到了这个网站: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,并仅在发生碰撞时设置它。
相关文章:
- 逐像素碰撞检测弹球
- 砖块和球之间的碰撞检测(使用数字数组)
- 为什么我应该使用带有碰撞检测的四叉树
- 具有多个块的html5画布碰撞检测
- D3js地图标记碰撞检测
- javascript中两个正方形之间的碰撞检测
- 使用canvas+javascript进行2D碰撞检测
- 为什么我的碰撞检测在 Phaser 中不起作用
- 方向碰撞检测
- 圆圈碰撞检测 HTML5 画布
- FPS 游戏中的碰撞检测使用三个.js
- Javascript - 如何设置碰撞检测系统
- 三.js使用光线投射优化碰撞检测
- 对 2 个对象进行碰撞检测
- 如何将碰撞检测添加到我的 JavaScript 游戏中
- 使用边界球体进行碰撞检测
- 碰撞检测问题;对某些条件的奇怪反应
- JavaScript:碰撞检测不起作用
- 我如何添加碰撞检测我的d3js粒子模拟器
- 芯片8模拟器上的碰撞检测