游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2887|回复: 7

如何建立ddraw 8位每像素surface

[复制链接]

31

主题

257

帖子

1752

积分

金牌会员

申城谍影

Rank: 6Rank: 6

积分
1752
QQ
发表于 2010-11-1 21:02:00 | 显示全部楼层 |阅读模式
各位,我最近在做一个2D的地图编辑器,有大量8位(256色)的位图要导入内存。

大致思路是:先create一个8位的surface,然后用lock的方法写入数据。

但是建立8位表面不成功。

谁能给个例子,或说一下该如何设置ddsd里面的参数,谢谢。

我写的代码在公司,没带回来,就不贴了。

[em6]

30

主题

89

帖子

91

积分

注册会员

Rank: 2

积分
91
发表于 2010-11-3 16:40:00 | 显示全部楼层

Re:如何建立ddraw 8位每像素surface

        ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
        //        must be system memory.
        ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
        ddsd.dwHeight = 100;
        ddsd.dwWidth = 100;       
       
        ddsd.ddpfPixelFormat.dwSize  = sizeof(DDPIXELFORMAT);
        ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_PALETTEINDEXED8;

        //创建8位的离屏表面.
       
        ddsd.ddpfPixelFormat.dwRGBBitCount = 8;
        if (FAILED(lpdd->CreateSurface(&ddsd, &lpoffscreen, NULL))) return;

31

主题

257

帖子

1752

积分

金牌会员

申城谍影

Rank: 6Rank: 6

积分
1752
QQ
 楼主| 发表于 2010-11-4 16:13:00 | 显示全部楼层

Re:如何建立ddraw 8位每像素surface

谢谢楼上,8位表面创建成功了,可是blt到屏幕不显示。

我贴一部分代码,帮我看一下。  :)

下面是建立调色板:

        RGBQUAD* pal = (RGBQUAD*)new BYTE[ 1024 ];
        if( ! pal)
                return false;
        f1.Seek(56, CFile::begin);
        f1.Read( (BYTE*)pal, 1024);

        PALETTEENTRY* pal2 = (PALETTEENTRY*)new BYTE[1024];
        if( ! pal2)
                return false;

        for( int j = 0; j < 256; j++)
        {
                pal2[j].peRed = pal[j].rgbRed;
                pal2[j].peGreen = pal[j].rgbGreen;
                pal2[j].peBlue = pal[j].rgbBlue;
                pal2[j].peFlags = PC_NOCOLLAPSE;
        }
        if( FAILED( pDDraw->CreatePalette( DDPCAPS_8BIT | DDPCAPS_INITIALIZE,
                                                        pal2, &pPal, NULL)))
        {
                return false;
        }

/////////////////////////////////////////////////////////////////////////////////////////////

下面是设定调色板:

                if( FAILED( tmpOP.bmp->SetPalette( pPal)))
                {
                        return false;
                }

////////////////////////////////////////////////////////////////////////////////////////////

下面是blt:

        g_pDDraw->pSurfFront->Blt( &dr, g_pDDraw->vTilePix[26].bmp, &sr,
                                                                 DDBLT_WAIT, &ddbf);

究竟问题出在哪?一点显示也没有。  :(

31

主题

257

帖子

1752

积分

金牌会员

申城谍影

Rank: 6Rank: 6

积分
1752
QQ
 楼主| 发表于 2010-11-4 16:24:00 | 显示全部楼层

Re:如何建立ddraw 8位每像素surface

补充一下,我的程序是运行在窗口模式下。

我建立32位表面,然后逐像素从8位转为32位,是能显示图片的。

就是慢,而且图片太多了,全部装入内存时最后会失败。

31

主题

257

帖子

1752

积分

金牌会员

申城谍影

Rank: 6Rank: 6

积分
1752
QQ
 楼主| 发表于 2010-11-4 17:00:00 | 显示全部楼层

Re:如何建立ddraw 8位每像素surface

检查了返回值,原来blt失败了,返回值是-2147467263,

查了一下,错误类型是:尚未实现。

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2010-11-4 17:03:00 | 显示全部楼层

Re:如何建立ddraw 8位每像素surface

xp之后就不能了

31

主题

257

帖子

1752

积分

金牌会员

申城谍影

Rank: 6Rank: 6

积分
1752
QQ
 楼主| 发表于 2010-11-4 18:20:00 | 显示全部楼层

Re:如何建立ddraw 8位每像素surface

楼上的意思是,无法实现不同色深间的blt?

30

主题

89

帖子

91

积分

注册会员

Rank: 2

积分
91
发表于 2010-11-6 16:01:00 | 显示全部楼层

Re:如何建立ddraw 8位每像素surface

用ACD see打开任意图片.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-18 08:25

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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