這節的內容比較簡單,和之前兩節的內容也很類似,我就長話短說了。
打開超級馬裡奧1,選擇工具->查看器->色盤查看器
與色盤查看器相關的類是CPaletteView,所在文件:
Source Files/PaletteView.cpp Header Files/PaletteView.h
該類的對象m_PaletteView聲明在CMainFrame類中。
CPaletteView::Create()
BOOL CPaletteView::Create( HWND hWndParent ) { HWND hWnd = CreateWindowEx( WS_EX_TOOLWINDOW, VIRTUANES_WNDCLASS, "PaletteView", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWndParent, NULL, CApp::GetInstance(), (LPVOID)this ); if( !hWnd ) { DEBUGOUT( "CreateWindow faild.\n" ); return FALSE; } m_hWnd = hWnd; // ::ZeroMemory( &m_BitmapHdr, sizeof(m_BitmapHdr) ); m_BitmapHdr.bih.biSize = sizeof(BITMAPINFOHEADER); m_BitmapHdr.bih.biWidth = 256; m_BitmapHdr.bih.biHeight = -32; m_BitmapHdr.bih.biPlanes = 1; m_BitmapHdr.bih.biBitCount = 8; m_BitmapHdr.bih.biCompression = BI_RGB; m_BitmapHdr.bih.biClrUsed = 32; DirectDraw.GetPaletteData( m_Palette ); for( INT y = 0; y < 32; y++ ) { for( INT x = 0; x < 256; x++ ) { m_lpPattern[x+y*256] = (y>>4)*0x10+(x>>4); } } return TRUE; }
調色板上顯示了32種顏色,上16種顏色是背景調色板,下16種顏色是精靈調色板。1種顏色占16*16的小方塊,因此顯示出來的位圖大小為256*32。
第32-36行 這個雙重循環呢,是為了把16*16的小方塊,從左到右,從上到下,依次填充0,1,2,3...31號索引顏色。即把調色板的顏色按順序顯示出來。
CPaletteView::OnTimer()
WNDMSG CPaletteView::OnTimer( WNDMSGPARAM ) { if( !Emu.IsRunning() ) return TRUE; for( INT i = 0; i < 16; i++ ) { m_BitmapHdr.rgb[i] = m_Palette[BGPAL[i]]; m_BitmapHdr.rgb[i+16] = m_Palette[SPPAL[i]]; } RECT rc; ::GetClientRect( hWnd, &rc ); HDC hDC = ::GetDC( hWnd ); ::StretchDIBits( hDC, 0, 0, rc.right - rc.left, rc.bottom - rc.top, 0, 0, 256, 32, m_lpPattern, (BITMAPINFO*)&m_BitmapHdr, DIB_RGB_COLORS, SRCCOPY ); ::ReleaseDC( hWnd, hDC ); return TRUE; }
這部分實在沒有什麼好說的。
我來扯點無關緊要的話吧。第5-8行如果有人看不明白的話,建議上網搜索“位圖結構”,好好了解一下。
分割線------------------------------------------------------------
就這麼結束的話,這篇博文就太不充實了。
那就再唠會兒磕呗!
首先,祝各位國慶節快樂。
其次,我的上篇博文VirtuaNES.v0.97源碼探究<3> 卷軸查看器被編輯選為了推薦博文撒花)。感謝編輯!
當然我也知道,這一系列的博文不會有多少人感興趣。一來是因為博主我寫的不咋地慚愧)。二來呢,這NES游戲畢竟是上個世紀的東西了,現在有人在研究它,多半也是出於當年的感情。不過我還是希望我能堅持寫下去直到徹底弄明白其中的奧秘,為了跟我一樣對NES感興趣的人,也為了自己將來沒事可以回過頭來看看吧。
本文出自 “三人乘虎” 博客,請務必保留此出處http://darhx.blog.51cto.com/7920146/1304059