这节的内容比较简单,和之前两节的内容也很类似,我就长话短说了。
打开超级马里奥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感兴趣的人,也为了自己将来没事可以回过头来看看吧。
转载于:https://blog.51cto.com/darhx/1304059