【问题标题】:Collision detection on chip8 emulator芯片8模拟器上的碰撞检测
【发布时间】:2013-05-13 22:15:43
【问题描述】:

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

【问题讨论】:

  • 你遇到了什么问题?
  • 碰撞不起作用。我下载了一个breakout rom,并播放了它,但对碰撞没有反应。其他一切都很好,但没有任何碰撞。

标签: javascript bit-manipulation emulation chip-8


【解决方案1】:

我找到了这个网站: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,只有在发生碰撞时才设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    相关资源
    最近更新 更多