VirtuaNES.v0.97源碼探究<4> 色盤查看器

這節的內容比較簡單,和之前兩節的內容也很類似,我就長話短說了。


打開超級馬里奧1,選擇工具->查看器->色盤查看器

224132897.png


與色盤查看器相關的類是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感興趣的人,也爲了自己將來沒事可以回過頭來看看吧。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章