【游戏开发】定时器循环播放动画

//Windows窗口头文件
#include <windows.h>
 
//swprintf_s函数包含的头文件
#include <tchar.h>

//PlaySound函数包含的库文件
#pragma comment(lib,"winmm.lib") 
 
//TransparentBlt函数包含的库文件
#pragma  comment(lib,"Msimg32.lib")  

//窗口宽度
#define WINDOW_WIDTH 1132	
 
//窗口高度
#define WINDOW_HEIGHT 708			
				
//窗口标题
#define WINDOW_TITLE L"【游戏开发】定时器循环播放动画"
 
//全局环境设备和全局内存设备
HDC	g_hdc=NULL,g_mdc=NULL; 

//12张位图
HBITMAP g_hSprite[12]; 

//记录目前显示的图号
int g_iNum=0;    

//7种画刷
HBRUSH g_hBrush[7]={0}; 

//6种画刷样式
int g_iBrushStyle[6] = {HS_VERTICAL,HS_HORIZONTAL,HS_CROSS,HS_DIAGCROSS,HS_FDIAGONAL,HS_BDIAGONAL}; 

//位图
HBITMAP g_hBackGround; 
 
//窗口过程函数
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );
 
//初始化
BOOL Game_Init(HWND hwnd);		
 
//绘图
VOID Game_Paint( HWND hwnd);		
 
//释放资源
BOOL Game_CleanUp(HWND hwnd );
 
//主函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)
{
	//定义窗口类
	WNDCLASSEX wndClass = { 0 };
 
	//结构体的字节数大小
	wndClass.cbSize = sizeof( WNDCLASSEX ) ;	
 
	//窗口的样式
	wndClass.style = CS_HREDRAW | CS_VREDRAW;	
 
	//指向窗口过程函数的指针
	wndClass.lpfnWndProc = WndProc;		
 
	//窗口类的附加内存,取0
	wndClass.cbClsExtra		= 0;		
 
	//窗口的附加内存,依然取0
	wndClass.cbWndExtra		= 0;		
 
	//窗口过程的程序的实例句柄
	wndClass.hInstance = hInstance;						
 
	//ico图标
	wndClass.hIcon=(HICON)::LoadImage(NULL,L"天龙八部图标.ico",IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
 
	//光标句柄
	wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); 
 
	//画刷句柄
	wndClass.hbrBackground=(HBRUSH)CreateSolidBrush(RGB(255,255,255));  
 
	//指定菜单资源的名字
	wndClass.lpszMenuName = NULL;					
 
	//指定窗口类的名字
	wndClass.lpszClassName = L"TWJDWQ";
 
	//注册窗口类
	if( !RegisterClassEx( &wndClass ) )			
		return -1;		
 
	//创建窗口
	HWND hwnd = CreateWindow( L"TWJDWQ",WINDOW_TITLE,	
		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH,
		WINDOW_HEIGHT, NULL, NULL, hInstance, NULL );
 
	//窗口显示的位置
	MoveWindow(hwnd,55,0,WINDOW_WIDTH,WINDOW_HEIGHT,true);
	
	//显示窗口
	ShowWindow( hwnd, nShowCmd );
 
	//更新窗口
	UpdateWindow(hwnd);	
 
	//初始化
	if (!Game_Init (hwnd)) 
	{
		//消息窗口
		MessageBox(hwnd, L"资源初始化失败", L"消息窗口", 0);
		return FALSE;
	}
 
	//循环播放背景音乐
	PlaySound(L"我行即我道.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); 
 
	//定义并初始化msg
	MSG msg = { 0 };			
 
	//消息循环
	while( msg.message != WM_QUIT )			
	{
		//查看并派发消息
		if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )
		{
			//将虚拟键消息转换为字符消息
			TranslateMessage( &msg );		
 
			//捕捉消息给窗口
			DispatchMessage( &msg );
		}
	}
 
	//注销窗口类
	UnregisterClass(L"TWJDWQ", wndClass.hInstance); 
 
	return 0;  
}
 
//处理窗口消息
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )      
{
	//记录绘制信息
	PAINTSTRUCT paintStruct;			
 
	switch( message )						
	{
	//定时器消息
	case WM_TIMER:			

		//调用绘制函数
		Game_Paint(hwnd);      
		
		break;		

	//绘制
	case WM_PAINT:		
 
		//指定窗口开始绘制(将和绘图有关的信息填充到paintStruct结构体中)
		g_hdc = BeginPaint( hwnd, &paintStruct ); 
 
		//调用绘制函数
		Game_Paint( hwnd);
 
		//结束绘制
		EndPaint( hwnd, &paintStruct );			
 
		//更新窗口
		ValidateRect(hwnd, NULL);		
 
		break;									
 
	//按键
	case WM_KEYDOWN:	
 
		//按键为ESC,销毁窗口,并发送一条WM_DESTROY消息
		if (wParam == VK_ESCAPE)    
			DestroyWindow(hwnd);	
 
		break;									
 
	//销毁
	case WM_DESTROY:
 
		//清理资源
		Game_CleanUp(hwnd);	
 
		//请求终止,并发送一条WM_DESTROY消息
		PostQuitMessage( 0 );			
 
		break;									
 
	//缺省
	default:										
		return DefWindowProc( hwnd, message, wParam, lParam );		
	}
 
	return 0;						
}
 
//初始化
BOOL Game_Init( HWND hwnd )
{
	//环境设备
	g_hdc = GetDC(hwnd); 
 
	//加载1张位图
	g_hBackGround = (HBITMAP)LoadImage(NULL,L"天龙八部壁纸.bmp",IMAGE_BITMAP,WINDOW_WIDTH,WINDOW_HEIGHT,LR_LOADFROMFILE);   
 
	//内存设备
	g_mdc = CreateCompatibleDC(g_hdc);  

	//1种默认画刷,6种样式画刷
	for(int i=0;i<=6;i++)
	{
		if(i==6)
			g_hBrush[i] = CreateSolidBrush(RGB(135,206,250));
		else
			g_hBrush[i] = CreateHatchBrush(g_iBrushStyle[i],RGB(135,206,250));
	}

	//图片名称
	wchar_t filename[20];

	//载入11张位图
	for(int i=0;i<12;i++)      
	{
		//filename的初始化
		memset(filename, 0, sizeof(filename));  

		//“组装”出对应的图片文件名称
		swprintf_s(filename,L"%d.bmp",i); 

		//加载图片
		g_hSprite[i] = (HBITMAP)LoadImage(NULL,filename,IMAGE_BITMAP,WINDOW_WIDTH,WINDOW_HEIGHT,LR_LOADFROMFILE);
	}

	//设置初始的显示图号为"0"
	g_iNum = 0;            

	//建立定时器,间隔3秒发出消息
	SetTimer(hwnd,1,3000,NULL);   
 
	//绘制
	Game_Paint(hwnd);
 
	return TRUE;
}
 
//绘制
VOID Game_Paint( HWND hwnd )
{
	//选择图片
	SelectObject(g_mdc,g_hBackGround);
 
	//贴背景图
	BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY);  

	//创建字体
	HFONT hFont=CreateFont(30,0,0,0,0,0,0,0,GB2312_CHARSET,0,0,0,0,L"微软雅黑"); 

	//在环境设备中选择字体
	SelectObject(g_hdc,hFont); 

	//设置文字背景为透明
	SetBkMode(g_hdc, TRANSPARENT);  

	//定义三段文字
	wchar_t text1[]=L"新天龙八部:";
	wchar_t text2[]=L"高山流水觅知音,画地为牢心无悔。 ";
	wchar_t text3[]=L"--------逍遥派";

	//定义门派
	wchar_t emei[]=L"峨眉派";
	wchar_t xiaoyao[]=L"逍遥派";
	wchar_t guigu[]=L"鬼谷派";
	wchar_t tangmen[]=L"唐门派";
	wchar_t wudang[]=L"武当派";
	wchar_t mingjiao[]=L"明教派";
	wchar_t xingxiu[]=L"星宿派";

	//设置文字颜色并输出第一段文字
	SetTextColor(g_hdc,RGB(135,206,250));
	TextOut(g_hdc,30,150,text1,wcslen(text1));

	//设置文字颜色并输出第二段文字
	SetTextColor(g_hdc,RGB(135,206,250));
	TextOut(g_hdc,30,200,text2,wcslen(text2));

	//设置文字颜色并输出第三段文字
	SetTextColor(g_hdc,RGB(135,206,250));
	TextOut(g_hdc,300,250,text3,wcslen(text3));

	//输出“峨眉派”
	SetTextColor(g_hdc,RGB(135,206,250));
	TextOut(g_hdc,95,70,emei,wcslen(emei));

	//输出“逍遥派”
	SetTextColor(g_hdc,RGB(135,206,250));
	TextOut(g_hdc,245,70,xiaoyao,wcslen(xiaoyao));

	//输出“鬼谷派”
	SetTextColor(g_hdc,RGB(135,206,250));
	TextOut(g_hdc,395,70,guigu,wcslen(guigu));

	//输出“唐门派”
	SetTextColor(g_hdc,RGB(135,206,250));
	TextOut(g_hdc,545,70,tangmen,wcslen(tangmen));

	//输出“武当派”
	SetTextColor(g_hdc,RGB(135,206,250));
	TextOut(g_hdc,695,70,wudang,wcslen(wudang));

	//输出“明教派”
	SetTextColor(g_hdc,RGB(135,206,250));
	TextOut(g_hdc,845,70,mingjiao,wcslen(mingjiao));

	//输出“星宿派”
	SetTextColor(g_hdc,RGB(135,206,250));
	TextOut(g_hdc,995,70,xingxiu,wcslen(xingxiu));

	//释放字体对象
	DeleteObject(hFont);

	//定义两个x坐标值
	int x1 = 100;
	int x2 = 150;

	//用7种不同的画刷填充矩形
	for(int i=0;i<=6;i++)
	{
		//选用画刷
		SelectObject(g_hdc,g_hBrush[i]); 

		//画出一个封闭的矩形 ,矩形左上角坐标为(x1,70),右下角坐标为(x2,y)
		Rectangle(g_hdc,x1,0,x2,70);	

		//矩形直接的间隔
		x1 += 150;
		x2 += 150;
	}

	//处理图号,循环播放
	if(g_iNum == 12)               
		g_iNum = 0;               

	//根据图号选入对应的位图
	SelectObject(g_mdc,g_hSprite[g_iNum]);

	//贴图
	BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY);     

	//图号自增
	g_iNum++;                    //将“g_iNum”值加1,为下一次要显示的图号
}
 
//清理资源
BOOL Game_CleanUp( HWND hwnd )
{
	//释放位图
	DeleteObject(g_hBackGround);
 
	//释放内存设备
	DeleteDC(g_mdc);

	//释放画刷
	for (int i=0;i<=6;i++)
	{
		DeleteObject(g_hBrush[i]);
	}

	//删除所建立的定时器 
	KillTimer(hwnd,1);    

	//释放图片资源
	for(int i=0;i<12;i++)
		DeleteObject(g_hSprite[i]);

	//释放环境设备
	ReleaseDC(hwnd,g_hdc);

	return TRUE;
}

猜你喜欢

转载自blog.csdn.net/qq_23996157/article/details/84108557