游戏开发论坛

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

初学DX没几天...有问题,请大家帮忙。

[复制链接]

13

主题

25

帖子

27

积分

注册会员

Rank: 2

积分
27
发表于 2004-10-19 22:14:00 | 显示全部楼层 |阅读模式
谢谢热心人了
int Game_Init(void *parms = NULL, int num_parms = 0)
{
        //创建IDirectDraw接口
        if(FAILED(DirectDrawCreateEx(NULL,(void **) &lpdd,IID_IDirectDraw7,NULL)))
        {
                return(0);
        }

        //创建与WINDOWS协作层
        if(FAILED(lpdd->SetCooperativeLevel(main_window_handle,DDSCL_FULLSCREEN|DDSCL_ALLOWMODEX|DDSCL_EXCLUSIVE|DDSCL_ALLOWREBOOT)))
        {
                return(0);
        }

        //设置显示模式
        if(FAILED(lpdd->SetDisplayMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,0,0)))
        {
                return(0);
        }

        //填充ddsd结构体以创建主表面
        ddsd.dwSize=sizeof(ddsd);
        ddsd.dwFlags=DDSD_CAPS;
        ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE;
       
        //创建主表面
        if(FAILED(lpdd->CreateSurface(&ddsd,&lpddsprimary,NULL)))
        {
                return(0);
        }
       
        //填充调色板结构数组
        for(int color=1;color<255;color++)
        {
                palette[color].peRed=rand()%256;
                palette[color].peGreen=rand()%256;
                palette[color].peBlue=rand()%256;
                palette[color].peFlags=PC_NOCOLLAPSE;
        }
        palette[0].peRed=0;
        palette[0].peGreen=0;
        palette[0].peBlue=0;
        palette[0].peFlags = PC_NOCOLLAPSE;

        palette[255].peRed=255;
        palette[255].peGreen=255;
        palette[255].peBlue=255;
        palette[255].peFlags = PC_NOCOLLAPSE;

        //设置主表面
        if(FAILED(lpdd->CreatePalette(DDPCAPS_8BIT|DDPCAPS_ALLOW256|DDPCAPS_INITIALIZE,palette,&lpddpal,NULL)))
        {
                return(0);
        }

        //设置调色板依附于主表面
        if(FAILED(lpddsprimary->SetPalette(lpddpal)))
        {
                return(0);
        }
        return(1);
}
int Game_Main(void *parms = NULL, int num_parms = 0)
{
        //按ESC退出程序
        if(KEYDOWN(VK_ESCAPE))
                SendMessage(main_window_handle,WM_CLOSE,0,0);
        //清空ddsd结构体的内存区域
        memset(&ddsd,0,sizeof(ddsd));
       
        //填充ddsd结构???????????????????????????????????????????????????请问这句话去掉或者移到锁定表面语句的后面为什么不行?
        ddsd.dwSize=sizeof(ddsd);

        //锁定表面
        if(FAILED(lpddsprimary->Lock(NULL,&ddsd,DDLOCK_SURFACEMEMORYPTR|DDLOCK_WAIT,NULL)))
        {
                return(0);
        }
        //??????????????????????????????????????????????????????????????下面这两条语句移到锁定表面语句的前面为什么不行?
        int mempitch=(int)ddsd.lPitch;                                                // 记录程序所在显示模式的内存间距
        UCHAR *video_buffer=(UCHAR *)ddsd.lpSurface;                // 记录显示表面所驻留的实际内存的指针

        //为主显示表面的像素着色
        for(int index=0;index<1000;index++)
        {
                UCHAR color=rand()%256;
                int x=rand()%640;
                int y=rand()%480;

                //绘制像素
                video_buffer[x+y*mempitch]=color;
        }

        //解锁表面
        if(FAILED(lpddsprimary->Unlock(NULL)))
        {
                return(0);
        }
        //延时
        Sleep(30);
        return(1);
}

int Game_Shutdown(void *parms = NULL, int num_parms = 0)
{
        if(lpddpal)
        {
                lpddpal->Release();
                lpddpal=NULL;
        }
        if(lpddsprimary)
        {
                lpddsprimary->Release();
                lpddsprimary=NULL;
        }
        if(lpdd)
        {
                lpdd->Release();
                lpdd=NULL;
        }
        return(1);
}

13

主题

978

帖子

978

积分

高级会员

Rank: 4

积分
978
发表于 2004-10-19 22:19:00 | 显示全部楼层

Re:初学DX没几天...有问题,请大家帮忙。

因为锁定之前ddsd没有数据,所以不能前移。lock需要ddsd中的size所以不能后移

13

主题

978

帖子

978

积分

高级会员

Rank: 4

积分
978
发表于 2004-10-19 22:21:00 | 显示全部楼层

Re:初学DX没几天...有问题,请大家帮忙。

还有,下次吧关键代码贴出来就行了,我差点没找到问题在哪里!

13

主题

25

帖子

27

积分

注册会员

Rank: 2

积分
27
 楼主| 发表于 2004-10-20 21:40:00 | 显示全部楼层

Re:初学DX没几天...有问题,请大家帮忙。

这个就是答案吗?无语了,代码贴多了下次改,不过我的问题真的和问英文的“a“为什么翻译为"一个"是一个类型的吗?

-_____-!

13

主题

978

帖子

978

积分

高级会员

Rank: 4

积分
978
发表于 2004-10-20 23:33:00 | 显示全部楼层

Re:初学DX没几天...有问题,请大家帮忙。

~~~~>_<~~~~~
这个解释应该就是了……我又没写过dx的源程序……

13

主题

25

帖子

27

积分

注册会员

Rank: 2

积分
27
 楼主| 发表于 2004-10-20 23:53:00 | 显示全部楼层

Re:初学DX没几天...有问题,请大家帮忙。

我想知道为什么啊!~~大虾回答我啊,一个帖子发了3次言,这么下去有灌水嫌疑了我!

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2004-10-21 07:34:00 | 显示全部楼层

Re:初学DX没几天...有问题,请大家帮忙。

锁定表面主要目的就是填充那个ddsd,但它要求调用之前先把ddsd.dwSize填好,不光是在directx里,好多Windows的Api都有这个要求。
先用memset把这个结构体清空,再把dwSize的值填好,就可以传给Lock了。
Lock执行成功的话,就把ddsd的各成员填好了,你就可以用它里面的值了。

33

主题

669

帖子

669

积分

高级会员

Rank: 4

积分
669
QQ
发表于 2004-10-21 14:38:00 | 显示全部楼层

Re:初学DX没几天...有问题,请大家帮忙。

ddsd.dwSize=sizeof(ddsd);
因为Lock会用到它,它也要分派一定的内存来存放Lock后的一些相关信息,所以先要设置它的大小的信息.
int mempitch=(int)ddsd.lPitch; // 记录程序所在显示模式的内存间距
UCHAR *video_buffer=(UCHAR *)ddsd.lpSurface; // 记录显示表面所驻留的实际内存的指针
只有在锁定了表面以后,才能得到表面的内存指针和宽距,所以要放到后面.
建议多找些教程研究一下,为什么不学Direct3D呢 ? 现在Direct编写游戏已经主要用它了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-22 21:21

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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