游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2461|回复: 8

老大,帮我看看代码,出了什么问题?

[复制链接]

12

主题

40

帖子

40

积分

注册会员

Rank: 2

积分
40
发表于 2004-7-5 19:35:00 | 显示全部楼层 |阅读模式
请看代码,为什么有关Direct初始化的部分,老是失败:
#include <windows.h>

#include <windowsx.h>

#include <ddraw.h>

LPDIRECTDRAW7 lpDD; // DirectDraw对象

LPDIRECTDRAWSURFACE7 lpDDSPrimary; // DirectDraw主页面

char szMsg1[] = "Hello World, I am DirectDraw boy !";

char szMsg2[] = "按 ESC 退出";

//函数声明

LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );

BOOL InitWindow( HINSTANCE hInstance, int nCmdShow );

BOOL InitDDraw( void );

void FreeDDraw( void );
//*******************************************************************

//函数:WinMain()

//功能:Win32应用程序入口函数。进行初始化工作,处理消息循环

//*******************************************************************

int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,

                      LPSTR lpCmdLine, int nCmdShow)

{

    MSG msg;

    //初始化主窗口

    if ( !InitWindow( hInstance, nCmdShow ) )

        return FALSE;

    //初始化DirectDraw环境,并实现DirectDraw功能

    if ( !InitDDraw())

    {

        MessageBox(GetActiveWindow(), "初始化DirectDraw过程中出错!", "Error", MB_OK );

        FreeDDraw();

        DestroyWindow(GetActiveWindow());

        return FALSE;

    }

    //进入消息循环

    while (GetMessage(&msg, NULL, 0, 0))

    {

        TranslateMessage(&msg);

        DispatchMessage(&msg);

    }
    return msg.wParam;

}

//******************************************************************

//函数:InitWindow()

//功能:创建主窗口。

//******************************************************************

static BOOL InitWindow( HINSTANCE hInstance, int nCmdShow )

{

    HWND hwnd; //窗口句柄

    WNDCLASSEX wc; //窗口类结构

    //填充窗口类结构
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = 0;

    wc.lpfnWndProc = WinProc;

    wc.cbClsExtra = 0;

    wc.cbWndExtra = 0;

    wc.hInstance = hInstance;

    wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );

    wc.hCursor = LoadCursor( NULL, IDC_ARROW );

    wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);

    wc.lpszMenuName = NULL;

    wc.lpszClassName = "dxHello";
     wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // Windows logo again


    //注册窗口类

    RegisterClassEx( &wc );

    //创建主窗口

    hwnd = CreateWindowEx(

    0,

    "dxHello",

    "",

    WS_POPUP,

    0, 0,

    GetSystemMetrics( SM_CXSCREEN ),

    GetSystemMetrics( SM_CYSCREEN ),

    NULL,

    NULL,

    hInstance,

    NULL );

    if( !hwnd ) return FALSE;

    //显示并更新窗口

    ShowWindow( hwnd, nCmdShow );

    UpdateWindow( hwnd );

    return TRUE;

    }  
//******************************************************************

//函数:WinProc()

//功能:处理主窗口消息

//******************************************************************

LRESULT CALLBACK WinProc( HWND hWnd, UINT message,

                             WPARAM wParam, LPARAM lParam )

{

    switch( message )

    {

        case WM_KEYDOWN://击键消息

            switch( wParam )

            {

                case VK_ESCAPE:

                    PostMessage(hWnd, WM_CLOSE, 0, 0);

                    break;

            }

            break;

        case WM_DESTROY://退出消息

            FreeDDraw();

            PostQuitMessage( 0 );

            break;

    }
//调用缺省消息处理过程

    return DefWindowProc(hWnd, message, wParam, lParam);

}

//******************************************************************

//函数:InitDDraw()

//功能:初始化DirectDraw环境并实现其功能。包括:创建DirectDraw对象,

// 设置显示模式,创建主页面,输出文字。

//******************************************************************

BOOL InitDDraw(void)

{

    DDSURFACEDESC2 ddsd; //页面描述

    HDC hdc; //设备环境句柄

    //创建DirectCraw对象

    if ( DirectDrawCreateEx( NULL,(void**) &lpDD,IID_IDirectDraw7 ,NULL ) != DD_OK ) return FALSE;

    // 取得独占和全屏模式

    if ( lpDD->SetCooperativeLevel(GetActiveWindow(),DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ) != DD_OK)
        return FALSE;

    //设置显示模式

    if ( lpDD->SetDisplayMode( 640, 480, 16,0,DDSDM_STANDARDVGAMODE ) != DD_OK) return FALSE;

    //填充主页面信息

    ddsd.dwSize = sizeof( ddsd );

    ddsd.dwFlags = DDSD_CAPS;

    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

    //创建主页面对象

    if ( lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL ) != DD_OK)

        return FALSE;

    //输出文字

    if ( lpDDSPrimary->GetDC(&hdc) != DD_OK) return FALSE;
   // SetBkColor( hdc, RGB( 0, 0, 255 ) );

    //SetTextColor( hdc, RGB( 255, 255, 0 ) );

    TextOut( hdc, 220, 200, szMsg1, lstrlen(szMsg1));

    TextOut( hdc, 280, 240, szMsg2, lstrlen(szMsg2));

    lpDDSPrimary->ReleaseDC(hdc);

    return TRUE;

}
//******************************************************************

//函数:FreeDDraw()

//功能:释放所有的DirectDraw对象。

//******************************************************************

void FreeDDraw( void )

{

    if( lpDD != NULL )

    {

        if( lpDDSPrimary != NULL )

        {

            lpDDSPrimary->Release();

            lpDDSPrimary = NULL;

        }

        lpDD->Release();

        lpDD = NULL;

    }

}

36

主题

382

帖子

498

积分

中级会员

Rank: 3Rank: 3

积分
498
发表于 2004-7-5 19:46:00 | 显示全部楼层

Re:老大,帮我看看代码,出了什么问题?

应该在render函数中写屏。
只在初始化时写屏,缓冲区一交换,就丢了。

69

主题

335

帖子

343

积分

中级会员

Rank: 3Rank: 3

积分
343
QQ
发表于 2004-7-5 19:47:00 | 显示全部楼层

Re:老大,帮我看看代码,出了什么问题?

提示什么错误?

12

主题

40

帖子

40

积分

注册会员

Rank: 2

积分
40
 楼主| 发表于 2004-7-5 19:52:00 | 显示全部楼层

Re: 老大,帮我看看代码,出了什么问题?

问题是Direct ddraw的初始化部分,老是失败,怎摸回事,

6

主题

26

帖子

26

积分

注册会员

Rank: 2

积分
26
QQ
发表于 2004-7-5 20:04:00 | 显示全部楼层

Re:老大,帮我看看代码,出了什么问题?

这样创建DirectDraw对象试试:
    if (DirectDrawCreate(NULL, &lpDD, NULL)!=DD_OK)
                return FALSE;

69

主题

335

帖子

343

积分

中级会员

Rank: 3Rank: 3

积分
343
QQ
发表于 2004-7-5 20:06:00 | 显示全部楼层

Re:老大,帮我看看代码,出了什么问题?

你的 if ( lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL ) != DD_OK)

        return FALSE;
失败了。
添加如下代码:

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

12

主题

40

帖子

40

积分

注册会员

Rank: 2

积分
40
 楼主| 发表于 2004-7-5 21:14:00 | 显示全部楼层

Re: 老大,帮我看看代码,出了什么问题?

问题解决了,可是新的问题有来了,为什么我的程序不能输出两行字母?

69

主题

335

帖子

343

积分

中级会员

Rank: 3Rank: 3

积分
343
QQ
发表于 2004-7-6 06:54:00 | 显示全部楼层

Re:老大,帮我看看代码,出了什么问题?

建议你看看游戏编程大师。
要显示出东西,必须前后页面必须交换,并要不停的刷新
void LoadPic(char* path)
{
    hdc=::CreateCompatibleDC(NULL);
        bitmap=(HBITMAP)LoadImage(NULL,path,IMAGE_BITMAP,800,600,LR_LOADFROMFILE);
    SelectObject(hdc,bitmap);
        pOPla->GetSurfaceDesc(&desc);
        result=pOPla->GetDC(&hdc1);
        if(result!=DD_OK)
                MessageBox(NULL,"取得暂存区DC失败!","",0);
        BitBlt(hdc1,0,0,desc.dwWidth,desc.dwHeight,hdc,0,0,SRCCOPY);
        pOPla->ReleaseDC(hdc1);

}
void outtext()
{
......
        pBBuf->BltFast(0,0,pOPla,&rect,DDBLTFAST_WAIT);
        result=pPSur->Flip(NULL,DDFLIP_WAIT);
......
}


在winmain里
//注册窗口
//执行directx初始
while(true)
{
outtext() ;
}

上面代码乱粘贴的,大概就是这个思路,好久没写过ddraw,可能有错误,你再研究吧。

36

主题

382

帖子

498

积分

中级会员

Rank: 3Rank: 3

积分
498
发表于 2004-7-6 07:41:00 | 显示全部楼层

Re:老大,帮我看看代码,出了什么问题?

就是说ddraw情况下与window窗口刷新下的情况不同。
在ddraw下一切都要自己来。

显然,ddraw的前后缓冲区在不断的交换。
你只在初始化时写进去,前后一交换,再一交换,就不见了。
因为速度很快,所以你连瞧都没瞧到。

所以解决办法是,不断地向后缓冲区写入。这样就有了。

一般是把这个过程放在一个函数render()中。
而这个render()函数的位置一般在如下地方。

        
         if(PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
            {
               TranslateMessage(&msg);  // Translate any messages.
               DispatchMessage(&msg);   // Dispatch any messages.
            }
         else
            {
               Render();          // Render a frame.
            }
     
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-5 16:10

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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