经典的侧面滚动器如何实现定时事件和动画触发器?

jma*_*erx 6 graphics assembly

我一直对Snes的超级马里奥系列感到惊讶.我认为它主要是在Z80组装中制作的.但由于没有实时时钟,他们究竟如何管理所有那些定时的动画事件,而且没有实时时钟?

谢谢

Mik*_*ron 5

要记住的一个重要概念是VSync速率.这是电视中的电子枪(或现代电视中的等效物)完成绘制屏幕的频率,然后慢慢地移动到屏幕顶部.

因为这是以恒定速率发生的(NTSC为60次/秒,PAL为50次),大多数游戏都使用它作为计时器,代码大致相当于:

void main() {
    while(true) {
        updateGame();
        updateSprites();
        waitForVSync();
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,这是非常简化的,但这就是正在发生的事情.有些游戏太复杂了,花了太长时间而错过了VSync时期.在这种情况下,他们会等待第二个VSync,因此以30(/ 25)FPS运行.

有时,你会注意到NES游戏的速度减慢(例如).这是当工作负载太重而在一个动作帧中缺少几个VSync周期的时候.

但是,这就是时间如何适用于旧游戏机的要点(实际上,即使是许多较新的游戏机和PC游戏也使用相同的系统,而不仅仅是旧游戏机!)