⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demo.cpp

📁 小游戏 不过不怎么好玩
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				KeyFlag=8;
			else if(KeyFlag==4)
				KeyFlag=11;
			else if(KeyFlag==8)
				KeyFlag=8;
			else if(KeyFlag==11)
				KeyFlag=11;
			else
				KeyFlag=7;
			break;

        case VK_ESCAPE:
            PostMessage(hWnd, WM_CLOSE, 0, 0);
            break;
        }
        break;

		case WM_KEYUP:
			switch(wParam)
			{
			case VK_UP:
				KeyFlag-=1;
				SpriteCountY=3;
				break;
			case VK_LEFT:
				KeyFlag-=7;
				SpriteCountY=3;
				break;
			case VK_DOWN:
				KeyFlag-=4;
				SpriteCountY=3;
				break;
			case VK_RIGHT:
				KeyFlag-=2;
				SpriteCountY=3;
				break;
			}
			break;

    case WM_DESTROY://销毁窗口消息
		MID_Close();
		KillTimer(hWnd,0);
        FreeObjects();
        PostQuitMessage(0);
        break;
    }

	//调用缺省的过程处理过程
    return DefWindowProc(hWnd, message, wParam, lParam);
}

//******************************************************************
//函数:InitWindow()
//功能:创建主窗口。
//******************************************************************
BOOL InitWindow( HINSTANCE hInstance, int nCmdShow )
{
    WNDCLASS			wc;		//窗口类结构

	//填充窗口类结构
    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 = CLASSNAME;

	//注册窗口类
    RegisterClass( &wc );
    
	//创建主窗口
    hWndMain= CreateWindowEx(
		0,
		CLASSNAME,	//窗口的类名称,必须与上面的wc.lpszClassName一致
		TITLE,		//窗口的标题名
		WS_POPUP,
		0,
		0,
		GetSystemMetrics( SM_CXSCREEN ),
		GetSystemMetrics( SM_CYSCREEN ),
		NULL,
		NULL,
		hInstance,
		NULL );

    if( !hWndMain )		return FALSE;

	//显示并更新窗口
    ShowWindow( hWndMain, nCmdShow );
    UpdateWindow( hWndMain );

	return TRUE;
}

//******************************************************************
//函数:InitDDraw()
//功能:初始化DirectDraw环境,创建换页链(主页面,一个后台缓冲区)
//		以及创建一个定时器。
//******************************************************************
BOOL InitDDraw(void)
{
    DDSURFACEDESC       ddsd;
    DDSCAPS             ddscaps;
    HRESULT             ddrval;

    //创建DirectDraw对象
	ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
    if( ddrval != DD_OK )
        return FALSE;

    //取得全屏独占模式
    ddrval = lpDD->SetCooperativeLevel( hWndMain, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
    if( ddrval != DD_OK )
        return FALSE;

    //设置显示器显示模式为640x480x8
    ddrval = lpDD->SetDisplayMode( WIDTH, HEIGHT, 16);
    if( ddrval != DD_OK )
        return FALSE;

    //填充换页链结构
    ddsd.dwSize = sizeof( ddsd );
    ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
                          DDSCAPS_FLIP |
                          DDSCAPS_COMPLEX;
	//指定后台缓冲区数量为1
    ddsd.dwBackBufferCount = 1;

	//创建换页链,包括了主页面及其后台缓冲区
    ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
    if( ddrval != DD_OK )
        return FALSE;

    //获得指向后台缓冲区的页面指针
	ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
    ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack);
    if( ddrval != DD_OK )
        return FALSE;

	//创建离屏页面
	ZeroMemory(&ddsd, sizeof(ddsd));
    ddsd.dwSize = sizeof(ddsd);
    ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
    ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
    ddsd.dwWidth = 640;
    ddsd.dwHeight = 480;

    if (lpDD->CreateSurface(&ddsd, &lpDDSPic1, NULL) != DD_OK)
		return FALSE;
	if (lpDD->CreateSurface(&ddsd, &lpDDSPic2, NULL) != DD_OK)
		return FALSE;

    //从磁盘文件中载入调色板
//	lpDDPal = DDLoadPalette(lpDD, "001.bmp");
	//将调色板设置给主页面
//    if (lpDDPal)
//        lpDDSPrimary->SetPalette( lpDDPal );


	//调用页面初始化函数
	if( !InitSurfaces() )
        return FALSE;

    return TRUE;
}

//******************************************************************
//函数:WinMain()
//功能:应用程序入口
//******************************************************************
int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine, int nCmdShow)
{
    MSG         msg;
	hInst=hInstance;

	//初始化主窗口
	if (!InitWindow( hInstance, nCmdShow))
			return FALSE;

	//初始化DirectDraw环境
	if (!InitDDraw())
	{
		MessageBox(hWndMain, "初始化DirectDraw过程中出错!", "Error", MB_OK);
		FreeObjects();
		DestroyWindow(hWndMain);
		return FALSE;
	}

	//进入消息循环
	while(1)
	{
		if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
		{
			if(!GetMessage(&msg, NULL, 0, 0 )) return msg.wParam;
			TranslateMessage(&msg); 
			DispatchMessage(&msg);
		}
		else if(bActive)
		{
			UpdateFrame();
		}
		else WaitMessage();
	}

    return msg.wParam;
} 

//******************************************************************
//函数:InitSurfaces()
//功能:初始化页面图象
//******************************************************************
BOOL InitSurfaces( void )
{
    HBITMAP hbm,hbm1;

    //从磁盘文件中将我们所需要的图象载入到一个hbm位图对象中
    hbm = (HBITMAP)LoadImage(hInst, "002.bmp", IMAGE_BITMAP, 
		0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
    hbm1 = (HBITMAP)LoadImage(hInst, "001.bmp", IMAGE_BITMAP, 
		0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);

    if (hbm == NULL)
		return FALSE;

	DDCopyBitmap(lpDDSPic1, hbm, 0, 0, 640, 480);
    DDCopyBitmap(lpDDSPic2, hbm1, 0, 0, 640, 480);

	DDSetColorKey(lpDDSPic2, RGB(255,0,255));//CLR_INVALID);

	//释放hbm位图对象
    DeleteObject(hbm);

    return TRUE;
}

//更新屏幕
void UpdateFrame( void )
{
	HRESULT		ddrval;

	//计算刷新率
	static int fps=0, frame=0, nt=0, ot=0;
	frame++;
	nt=timeGetTime(); 
	if (nt > ot+1000)
	{
		ot=nt;
		fps=frame;
		frame=0;
	}

	//计算图象卷轴的坐标数据
	static n=320;
	RECT srect, drect, srect2, drect2;

		MakeRect(&srect, SpriteX[SpriteCountX], SpriteY[SpriteCountY],SpriteX[SpriteCountX]+48, SpriteY[SpriteCountY]+48);
		MakeRect(&drect, 300, 200, 348, 248);
		MakeRect(&srect2, 0, 0, 384, 192);
		MakeRect(&drect2, 0, 0, 384, 192);

/*	n++;
	if (n>1280) n=n-1280;
	if (n>521) 
	{
		MakeRect(&srect, 0, 0, 1280-119-n, 246);
		MakeRect(&drect, n-521, 0, 1280-119-n, 246);
		MakeRect(&srect2, n-640, 0, 640, 480);
		MakeRect(&drect2, 0, 0, 1280-n, 480);
	}
	else
	{
		MakeRect(&srect, 521-n, 0, 521, 246);
		MakeRect(&drect, 0, 0, n, 246);
		MakeRect(&srect2, 0, 0, n, 480);
		MakeRect(&drect2, 640-n, 0, 640, 480);
	}*/

	//清屏后台缓冲区
	DDBLTFX	ddBltFx;
	ddBltFx.dwSize = sizeof(DDBLTFX);
	ddBltFx.dwFillColor = DDColorMatch(lpDDSBack, RGB(255,0,255));
	lpDDSBack->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddBltFx);
	
	//将背景图象Blit到后台缓冲区
	lpDDSBack->Blt(&drect2, lpDDSPic1, &srect2, DDBLT_WAIT, NULL);

	//将前景图象透明Blit到后台缓冲区
//	lpDDSBack->Blt(&drect, lpDDSPic2, &srect,DDBLT_WAIT|DDBLT_KEYSRC,NULL);
	lpDDSBack->BltFast(StaticX+X,StaticY+Y,lpDDSPic2,&srect,DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);

	//打印刷新率fps
	HDC hdc;
	char temp[32];
	lpDDSBack->GetDC(&hdc);
		SetBkMode(hdc, TRANSPARENT);
		SetTextColor(hdc, RGB(0,255,0)); 
		sprintf(temp, "fps=%d", fps);
		TextOut(hdc, 0, 0, temp, strlen(temp));
	lpDDSBack->ReleaseDC(hdc);

    // 换页
    while( 1 )
    {
        ddrval = lpDDSPrimary->Flip( NULL, DDFLIP_WAIT );//调用换页函数
        if( ddrval == DD_OK )//成功则退出while循环
            break;
        else if( ddrval == DDERR_SURFACELOST )//如果页面丢失,则恢复页面,再继续while循环
            RestoreAll();
        else
			break;
	}
}

void MakeRect(RECT *rect, long left, long top, long right, long bottom)
{
	rect->left=left;
	rect->top=top;
	rect->right=right;
	rect->bottom=bottom;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -