游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2799|回复: 3

还是关于调色板的问题

[复制链接]

9

主题

174

帖子

175

积分

注册会员

Rank: 2

积分
175
发表于 2003-9-21 00:01:00 | 显示全部楼层 |阅读模式
请问为什么我给页面SetPalette以后,显示的bmp文件颜色不对?
后来我发现,去掉SetPalette以后,显示的是另外一种颜色,但仍然不是正常的颜色?

原因出在哪里呢? [em4]

9

主题

174

帖子

175

积分

注册会员

Rank: 2

积分
175
 楼主| 发表于 2003-9-21 13:29:00 | 显示全部楼层

Re:还是关于调色板的问题

和显示相关的有两个文件,一个是GmaeClasses.cpp,一个是Graphics.cpp

9

主题

174

帖子

175

积分

注册会员

Rank: 2

积分
175
 楼主| 发表于 2003-9-21 13:30:00 | 显示全部楼层

GameClasses.cpp

#include <ddraw.h>
#include "GameClasses.h"

//------------------CMainControl-------------------
bool CMainControl::Create(int StartX,int StartY,LPDIRECTDRAW7 pDD,char* FileName)
{
        x=StartX;
        y=StartY;

        LoadBMP(FileName,pDD);

        return true;
}

void CMainControl:estroy()
{
        surf->Release();
        surf=NULL;
}

void CMainControl::CreateSurface(LPDIRECTDRAW7 DD,long Height,long Width)
{
        DDSURFACEDESC2 sd;

        ZeroMemory(&sd,sizeof(sd));
        sd.dwSize=sizeof(sd);
        sd.dwFlags=DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;
        sd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
        sd.dwHeight=Height;
        sd.dwWidth=Width;
        DD->CreateSurface(&sd,&surf,NULL);

        DDCOLORKEY ColorKey;
        ColorKey.dwColorSpaceLowValue=0x00;
        ColorKey.dwColorSpaceHighValue=0x00;
        surf->SetColorKey(DDCKEY_SRCBLT,&ColorKey);
}

bool CMainControl:oadBMP(char* FileName,LPDIRECTDRAW7 DD)
{
        BYTE* BMP;
        DWORD BmpSize;
        DWORD FileLength;
        DWORD nBytesRead;
        BITMAPINFO* BmpInfo;
        BYTE*                Pixels;
        HDC hdc;

        HANDLE hfile=CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);

        FileLength=GetFileSize(hfile,NULL);
        BmpSize=FileLength-sizeof(BITMAPFILEHEADER);

        BMP=(BYTE*)malloc(BmpSize);
        SetFilePointer(hfile,sizeof(BITMAPFILEHEADER),NULL,FILE_BEGIN);

        ReadFile(hfile,(LPVOID)BMP,BmpSize,&nBytesRead,NULL);
        CloseHandle(hfile);

        BmpInfo=(BITMAPINFO*)BMP;
        Pixels=BMP+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;

        CreateSurface(DD,BmpInfo->bmiHeader.biHeight,BmpInfo->bmiHeader.biWidth);

        surf->GetDC(&hdc);
        StretchDIBits(hdc,0,0,BmpInfo->bmiHeader.biWidth,BmpInfo->bmiHeader.biHeight,0,0,BmpInfo->bmiHeader.biWidth,BmpInfo->bmiHeader.biHeight,Pixels,BmpInfo,0,SRCCOPY);
        surf->ReleaseDC(hdc);
       
        free(BMP);

        return true;
}

bool CMainControl:aint(LPDIRECTDRAWSURFACE7 PaintSurf)
{
        PaintSurf->BltFast(x,y,surf,NULL,DDBLTFAST_SRCCOLORKEY|DDBLTFAST_WAIT);

        return true;
}

9

主题

174

帖子

175

积分

注册会员

Rank: 2

积分
175
 楼主| 发表于 2003-9-21 13:30:00 | 显示全部楼层

Graphics.cpp

#include <windows.h>
#include <stdio.h>

#include <ddraw.h>
#include "Graphics.h"
#include "GameClasses.h"
#include "Music.h"

LPDIRECTDRAW7 iddraw;
LPDIRECTDRAWSURFACE7 PrimSurf;
LPDIRECTDRAWSURFACE7 BackSurf;
LPDIRECTDRAWPALETTE Pal;

CMainControl test;
CField Field;

void InitMainSurfaces(void);
void InitGameSurfaces(LPDIRECTDRAW7 pDD);
void CreatePal();

bool InitGraphics(HWND wnd)
{
        DirectDrawCreateEx(NULL,(void**)&iddraw,IID_IDirectDraw7,NULL);
        iddraw->SetCooperativeLevel(wnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);
        iddraw->SetDisplayMode(SCREEN_WIDTH,SCREEN_HEIGHT,COLOR_DEPTH,NULL,NULL);

        InitMainSurfaces();
        InitGameSurfaces(iddraw);

    CreatePal();

        BackSurf->SetPalette(Pal);
    PrimSurf->SetPalette(Pal);

        return true;
}

void InitMainSurfaces(void)               
{
        DDSURFACEDESC2 sd;                       
        DDSCAPS2 caps;

        ZeroMemory(&sd,sizeof(sd));
        sd.dwSize=sizeof(sd);
        sd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
        sd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX;
        sd.dwBackBufferCount=1;

        iddraw->CreateSurface(&sd,&amprimSurf,NULL);

        ZeroMemory(&caps,sizeof(caps));
        caps.dwCaps=DDSCAPS_BACKBUFFER;
        PrimSurf->GetAttachedSurface(&caps,&BackSurf);
}

void InitGameSurfaces(LPDIRECTDRAW7 pDD)
{
        test.Create(0,0,pDD,"ttt.bmp");
        Field.LoadLevel(1);
}

void ClearBackBuffer()
{
        DDSURFACEDESC2 sd;

        ZeroMemory(&sd,sizeof(sd));
        sd.dwSize=sizeof(sd);

        BackSurf->Lock(NULL,&sd,DDLOCK_SURFACEMEMORYPTR|DDLOCK_WAIT,NULL);

        UINT sWidth=sd.lPitch;
        UINT sHeight=sd.dwHeight;

        char* buf=(char*)sd.lpSurface;
        ZeroMemory(buf,sWidth*sHeight);
        BackSurf->Unlock(NULL);
}

void DestroyGraphics(void)
{
        test.Destroy();

        BackSurf->Release();
        BackSurf=NULL;
        PrimSurf->Release();
        PrimSurf=NULL;
        iddraw->Release();
        iddraw=NULL;
}

bool DrawFrame()
{
        ClearBackBuffer();

        test.Paint(BackSurf);

        PrimSurf->Flip( 0,DDFLIP_WAIT);
       
        return true;
}

//---------------------------------------------

void CreatePal()
{
        PALETTEENTRY entries[256];
    LPRGBQUAD ColorTable;
        UINT MemNeed=sizeof(RGBQUAD)*256;
        DWORD nbytes;

    memset( entries,0,256*sizeof(PALETTEENTRY));

        HANDLE hfile=CreateFile("ttt.bmp",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);

        ColorTable=(LPRGBQUAD)malloc(MemNeed);
        SetFilePointer(hfile,sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER),NULL,FILE_BEGIN);
        ReadFile(hfile,(LPVOID)ColorTable,MemNeed,&nbytes,NULL);
        CloseHandle(hfile);

        for (int x=0; x<256; ++x)
        {
                entries[x].peRed   = ColorTable[x].rgbRed;
                entries[x].peBlue  = ColorTable[x].rgbBlue;
                entries[x].peGreen = ColorTable[x].rgbGreen;
        }

        iddraw->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256, entries, &Pal, NULL);

        free(ColorTable);
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-11-25 16:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表