日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何写一个NES模拟器(三)——精灵的显示

發布時間:2023/12/20 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何写一个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模拟器(三)——精灵的显示的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。