如何写一个NES模拟器(三)——精灵的显示
?
上次寫到顯示命名表,接下來可以顯示精靈了。
給初學者補充一下,在windows屏幕顯示圖像的流程是這樣的,分配一段內存稱為顯存,把所有像素都寫入(通過draw_window_point函數)進去,然后再通過CreateDIBSection創建位圖,再用Bitblt函數繪制到前臺。
?
閑話少敘,進入正題。NES中精靈由專門的精靈內存(256字節)存放,在硬件中,一般映射在CPU的某個部分,便于快速傳送。我們分配一個內存空間給它,SpriteRam[256]。
單個精靈是有4個字節來描述,所有NES共有64個精靈。
精靈的4字節描述如下
| 字節位描述 | 位bit7-bit0 | 描述 |
| 0 | y | 精靈左上角的Y 坐標-1 |
| 1 | index | Tile 索引號 |
| 2 | vhp000c | v=垂直翻轉(1=翻轉) |
| h=水平翻轉(1=翻轉) | ||
| p=背景優先權(0=前臺1=后臺) | ||
| c=顏色的高2 位 | ||
| 3 | x | 精靈左上角的X 坐標 |
精靈有2中,一種是8x8的,另一種是8x16的。使用哪一種由0x2000寄存器的bit5,確定。
那么繪制的偽代碼如下
For(I = 63;I >=0;i++){
?????? If(要顯示8*8精靈 )
DrawTile8x8(spr.x, spr.y, spr.attr&3, flip); //flip表示翻轉,根據屬性vh確定,attr&3表示顏色的高2位
?????? Else
DrawTile8x16(spr.x, spr.y, spr.attr&3, flip);
}
?
精靈8x8的繪制可以直接調用DrawTile,而8x16的繪制比較復雜。8x16的精靈塊的索引(index)表示第一個塊的索引,第二塊的索引則是index + 1,且index在圖案表0中索引,index+1在圖案表1中索引。繪制代碼見demo程序。
?????? 而精靈的顯示測試程序比較麻煩,由于精靈有專門的內存空間,而大多數模擬器都無法查看到精靈空間,這時我們需要把CPU模擬放進來了。
總結
以上是生活随笔為你收集整理的如何写一个NES模拟器(三)——精灵的显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有哪些免费、好用的多人协同办公软件推荐?
- 下一篇: 利用pyecharts绘制分级地图的案例