Win32Api游戏编程记录

Win32Api游戏编程记录

1.播放声音

PlaySound(L"FirstBlood.wav", NULL, SND_FILENAME | SND_ASYNC |SND_LOOP);//循环播放背景音乐

2.获取设备环境句柄HDC

1.一般在WM_PAINT消息循环中使用。
HDC BeginPaint(HWND,LPPAINTSTRUCT)
bool EndPaint(HWND,LPPAINTSTRUCT)
2.常用
HDC GetDC(HWND) //获取设置环境句柄
int ReleaseDC(HWND,HDC) //释放环境句柄

3.GDI基本几何绘图

1.画笔
HPEN = CreatePen(int penStyle,int width,COLORREF color);
COLORREF RGB(byte red,byte green,byte blue);
2.画刷
HBRUSH = CreateSolibBrush(COLORREF color) //创建实心画刷
HBRUSH = CreateHatchBrush(int style,COLORREF color) //创建阴影画刷
3.选择图形对象

图形对象包括画刷/画笔之类的

HGDIOBJ SelectObject(HDC,HGDIOBJ) //返回之前的图形对象,并设置现在的图形对象  
bool DeleteObject(HGDIOBJ) //删除画刷对象
4.绘制线条
bool LineTo(HDC,x,y) //从当前坐标画线到终点坐标(x,y)
bool MoveToEx(HDC,x,y,LPPOINT) //从当前坐标移动到(x,y),保存之前坐标
5.随机数
srand((unsigned)time(NULL)) //初始化随机数种子
srand(timeGetTime()) 

x = random(100) 0-99的随机数
6.文字输出函数TextOut
bool TextOut(HDC,int xStart,int yStart,char*,int len)

int DrawText(HDC,char*,len,LPRECT,UINT format)//以矩形区域输出文字

format常用标识

image-20220413194303297

7.设置文字颜色
COLORREF SetTextColor(HDC,COLORREF) //设置以后,再输出文字就是这个颜色了
8.设置文字背景透明
int SetBkMode(HDC,int mode) 
mode:OPAQUE 用背景画刷的颜色输出到文字的背景
mode:TRANSPARENT 透明背景
9.创建字体

image-20220413194224358

10.文字显示功能API

image-20220413194353796

image-20220413194431025

4.位图绘制

1.加载位图
HANDLE LoadImage(HINSTANCE,char* picName,UINT type,int xWidth,int yHeight,UINT loadtype)

image-20220413201645373

loadType:LR_LOADFROMFILE 从文件加载图像

2.建立兼容DC
HDC CreateCompatibleDC(HDC) //参数为与之兼容目的DC的句柄

bool DeleteDC(HDC) //撤销指定的设备环境
3.选用位图对象
HGDIOBJ SelectObject(HDC,HGDIOBJ)
4.贴图

image-20220413202322472

6.透明贴图

1.透明遮罩法
SelectObject(g_mdc,g_hBackGround);
	BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY);    //采用BitBlt函数在g_hdc中先贴上背景图

	//用透明遮罩法绘制出第一个人物
	SelectObject(g_mdc,g_hCharacter1);
	BitBlt(g_hdc,50,WINDOW_HEIGHT-579,320,640,g_mdc,320,0,SRCAND);//透明遮罩法第一步,即将屏蔽图与背景图做"AND"运算 
	BitBlt(g_hdc,50,WINDOW_HEIGHT-579,320,640,g_mdc,0,0,SRCPAINT);//透明遮罩法第二步,即将前景图与背景图做"OR"运算
2.透明色彩法

image-20220413204551514

image-20220413204601322

//先贴上背景图
	SelectObject(g_mdc,g_hBackGround);
	BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY);    //采用BitBlt函数在g_hdc中先贴上背景图

	//贴第一张人物图
	SelectObject(g_mdc,g_hCharacter1);
	TransparentBlt(g_hdc,0,WINDOW_HEIGHT-650,535,650,g_mdc,0,0,535,650,RGB(0,0,0));//透明色为RGB(0,0,0)

7.定时器

1.创建定时器

image-20220413205447908

2.响应。

指定回调函数,或者在窗口的消息处理函数中处理WM_TIMER消息

3.删除定时器
bool WINAPI KillTimer(HWND,int timerID) //删除指定ID的定时器
4.获取程序运行时间
DWORD WINAPI GetTickcount(void) //返回运行了多少毫秒
5.游戏循环
MSG msg = { 0 };				//定义并初始化msg
	while( msg.message != WM_QUIT )		//使用while循环,如果消息不是WM_QUIT消息,就继续循环
	{
		if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )   //查看应用程序消息队列,有消息时将队列中的消息派发出去。
		{
			TranslateMessage( &msg );		//将虚拟键消息转换为字符消息
			DispatchMessage( &msg );			//分发一个消息给窗口程序。
		}
		else
		{
			g_tNow = GetTickCount();   //获取当前系统时间
			if(g_tNow-g_tPre >= 100)        //当此次循环运行与上次绘图时间相差0.1秒时再进行重绘操作
				Game_Paint(hwnd);
		}

	}

本来是想总结一下,有时间也写个小游戏的,不过也没时间一直弄这个,只能说是未完待续吧。

posted @ 2022-05-28 22:31  念秋  阅读(140)  评论(0编辑  收藏  举报