图形化界面创建

本文介绍了一个使用Windows API进行的游戏编程示例,包括窗口创建、位图加载、精灵动画及碰撞检测等关键技术实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <Windows.h>  
#include<time.h>
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#define WINDOW_CLASS L"为了所有人的IT梦"
#define WINDOW_TITLE L"一个测试窗口"
#define SPRITES_NUM 30
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"Msimg32.lib")


HBITMAP g_sprites[4];
int g_spritesn;
struct Sprites
{
	int x, y;
	int direction;
}sprites[SPRITES_NUM];

HDC g_hdc, g_memdc, g_bufdc;//绘图环境句柄
HBITMAP g_BackGround;
VOID GamePaint(HWND hWnd);
BOOL GameInit(HWND);
void BubSort(int n);
DWORD g_tPre, g_tNow;


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



/*入口函数*/
int WINAPI WinMain(HINSTANCE hInstance,
	HINSTANCE  prehInstance,
	LPSTR  lpCmdLine,
	int nShowCmd)
{
	
	WNDCLASSEX wnd = { 0 };//wnd就是窗口
	wnd.cbSize = sizeof(WNDCLASSEX);//窗口所占内存
	wnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wnd.hCursor = NULL;//鼠标
	wnd.hIcon = NULL;
	wnd.cbClsExtra = 0;
	wnd.cbWndExtra = 0;
	wnd.hInstance = hInstance;
	wnd.lpszClassName = WINDOW_CLASS;//项目名字
	wnd.lpszMenuName = NULL;//窗口菜单
	wnd.style = CS_HREDRAW | CS_VREDRAW;
	//响应客服指令
	wnd.lpfnWndProc = WndProc;//窗口过程函数
	RegisterClassEx(&wnd);

	HWND hWnd = CreateWindow(WINDOW_CLASS,//窗口名称
		WINDOW_TITLE,//窗口标题
		WS_OVERLAPPEDWINDOW,//窗口风格
		300, 300, //窗口出现位置
		WINDOW_WIDTH, 
		WINDOW_HEIGHT,
		NULL, NULL, hInstance, NULL);
	//显示   更新
	ShowWindow(hWnd, nShowCmd);
	UpdateWindow(hWnd);
	//播放音乐
	PlaySound(L"OrcTheme.wav", NULL, SND_FILENAME | SND_LOOP | SND_ASYNC);

	//SND
	
	GameInit(hWnd);

	//消息循环
	//窗口不断去接受客户的指令
	MSG msg = { 0 };
	while (msg.message != WM_QUIT)
	{
	
		if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
		{
			//发送消息
			//虚拟键值---字符消息的转化
			TranslateMessage(&msg);//转化处理
			DispatchMessage(&msg);
		}
		else
		{
			g_tNow = GetTickCount();
			if (g_tNow - g_tPre >= 100)//1秒贴10次图
			GamePaint(hWnd);
		}


	}


	return 0;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
		case WM_DESTROY: 
			PostQuitMessage(0);//结束进程
			break;
		default:
			break;
	}
	return DefWindowProc(hWnd, message, wParam, lParam);
}

BOOL GameInit(HWND hWnd)
{
	srand((unsigned int)time(NULL));
	g_hdc = GetDC(hWnd);
	g_memdc = CreateCompatibleDC(g_hdc);
	g_bufdc = CreateCompatibleDC(g_hdc);
	HBITMAP bmp = CreateCompatibleBitmap(g_hdc, WINDOW_WIDTH, WINDOW_HEIGHT);

	SelectObject(g_memdc, bmp);

	g_BackGround = (HBITMAP)LoadImage(NULL, L"bg.bmp", IMAGE_BITMAP, WINDOW_WIDTH, WINDOW_HEIGHT, LR_LOADFROMFILE);
	g_sprites[0]= (HBITMAP)LoadImage(NULL, L"11.bmp", IMAGE_BITMAP, 384, 96, LR_LOADFROMFILE);
	g_sprites[1]= (HBITMAP)LoadImage(NULL, L"22.bmp", IMAGE_BITMAP, 384, 96, LR_LOADFROMFILE);
	g_sprites[2]= (HBITMAP)LoadImage(NULL, L"33.bmp", IMAGE_BITMAP, 384, 96, LR_LOADFROMFILE);
		g_sprites[3]= (HBITMAP)LoadImage(NULL, L"44.bmp", IMAGE_BITMAP, 384, 96, LR_LOADFROMFILE);

		for (int i = 0; i < SPRITES_NUM; i++)
		{
			sprites[i].direction = 3;
			sprites[i].x = rand() % WINDOW_WIDTH;
			sprites[i].y = rand() % WINDOW_HEIGHT;
		}
		g_spritesn = 0;


	return TRUE;
}

VOID GamePaint(HWND hWnd)
{

	//背景图
	SelectObject(g_bufdc, g_BackGround);
	BitBlt(g_memdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY);

	BubSort(SPRITES_NUM);

	for (int i = 0; i < SPRITES_NUM; i++)
	{
		SelectObject(g_bufdc, g_sprites[sprites[i].direction]);
		TransparentBlt(g_memdc, sprites[i].x, sprites[i].y, 96, 96, g_bufdc, g_spritesn*96, 0, 96, 96, RGB(0, 0, 0));

	}

	BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_memdc, 0, 0, SRCCOPY);

	if (++g_spritesn == 4)
		g_spritesn = 0;
	
	for (int i = 0; i < SPRITES_NUM; i++)
	{
		switch (rand() % 4)
		{
		case 0:sprites[i].y += 20;
			if (sprites[i].y > WINDOW_HEIGHT)
				sprites[i].y = WINDOW_HEIGHT;
			sprites[i].direction = 0;
			
			break;
		case 1:sprites[i].x -= 20;
			if (sprites[i].x < 0)
				sprites[i].x = 0;
			sprites[i].direction = 1;
			break;
		case 2:sprites[i].x += 20;
			if (sprites[i].x > WINDOW_WIDTH)
				sprites[i].x = WINDOW_WIDTH;
			sprites[i].direction = 2;
			break;
		case 3:sprites[i].y -= 20;
			if (sprites[i].y < 0)
				sprites[i].y = 0;
			sprites[i].direction = 3;
			break;
		}
	}
	g_tPre = GetTickCount();

}

void BubSort(int n)
{
	int i, j;
	Sprites temp;

	bool f = false;

	for (int i = 0; i < n - 1; i++)
	{
		f = false;
		for (int j = 0; j < n - 1 - i; j++)
		{
			if (sprites[j + 1].y < sprites[j].y)
			{
				temp = sprites[j + 1];
				sprites[j + 1] = sprites[j];
				sprites[j] = temp;
				f = true;
			}

		}
		if (!f)
		{
			break;
		}
	}
}


运行效果




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值