Windows编程之旅(十)

来源:互联网 发布:淘宝网正规催情药 编辑:程序博客网 时间:2024/06/05 20:32

冒泡排序贴图



#include <windows.h>//#include <tchar.h>       //swprintf  打印宽字符到字符串#include <time.h>          //srand()#pragma comment(lib,"winmm.lib")     //调用PlaySound函数所需库文件#pragma comment(lib,"Msimg32.lib")#define WINDOWS_WIDTH 800#define WINDOWS_HEIGHT 600#define SPRITE_NUMBER 30    //人物数目#define WINDOWS_TITLE L"--这是一个美丽而又宁静的夜晚[排序贴图]--"HDC g_hdc = NULL,g_mdc = NULL,g_bufdc=NULL;   //全局设备环境句柄    两个全局内存DC句柄 缓存dc句柄HBITMAP g_hSprite[4] = { NULL }, g_hBackGround = NULL;   //定义位图句柄  一个储存贴图数组  一个为背景int g_iNum = 0, g_iX = 0,g_iY=0;    //g_iNum记录图号    g_iX  g_iY贴图的位置  DWORD g_tPre=0, g_tNow=0;           //g_tPre  记录上一次绘图的时间  g_tNow  此次准备绘图的时间struct Sprites{int direction;   //方向  int x, y;       //位置};Sprites Sprite[SPRITE_NUMBER];   //30人物对象的数组LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lParam);VOID BubSort(int n);           //对对象进行排序   BOOL Game_Init(HWND hwnd);   // 游戏初始化 VOID Game_Paint(HWND hwnd);   //在此函数中绘画BOOL Game_CleanUp(HWND hwnd);  //游戏资源清理int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow){//1.初始化窗口类WNDCLASSEX wndClass = { 0 };wndClass.cbSize = sizeof(WNDCLASSEX);wndClass.cbClsExtra = 0;wndClass.cbWndExtra = 0;wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);  //白色背景wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);  //光标句柄wndClass.hInstance = hInstance;wndClass.hIcon = (HICON)::LoadImage(NULL, L"icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);wndClass.lpszClassName = L"ForTheDreamOfGameDevelop";wndClass.lpszMenuName = NULL;wndClass.lpfnWndProc = WndProc;wndClass.style = CS_HREDRAW | CS_VREDRAW;//2.注册窗口类if (!RegisterClassEx(&wndClass))return -1;//3.创建窗口HWND hwnd = CreateWindow(L"ForTheDreamOfGameDevelop", WINDOWS_TITLE,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOWS_WIDTH, WINDOWS_HEIGHT, NULL, NULL, hInstance, NULL);//4.窗口移动,显示,更新MoveWindow(hwnd, 250, 80, WINDOWS_WIDTH, WINDOWS_HEIGHT, true);ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);//游戏资源初始化if (!Game_Init(hwnd)){MessageBox(hwnd, L"资源初始化失败", L"消息窗口", 0);return FALSE;}PlaySound(L"OrcTheme.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//5.消息循环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 >= 200)Game_Paint(hwnd);              //当间隔相差0.1s  重新绘画}}//6.  注销窗口 UnregisterClass(L"ForTheDreamOfGameDevelop", 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:          //绘图信息//g_hdc = BeginPaint(hwnd, &paintStruct);  //指定窗口 准备绘画//Game_Paint(hwnd);                      //开始绘画//EndPaint(hwnd, &paintStruct);           //结束绘画//ValidateRect(hwnd, NULL);               //更新客户区的显示//break;case WM_KEYDOWN:         //退出信息if (wParam == VK_ESCAPE)DestroyWindow(hwnd);   //销毁窗口 并发出一条WM_DESTROY信息break; case WM_DESTROY:Game_CleanUp(hwnd);   //资源清理PostQuitMessage(0);   //响应  WM_DESTROY信息break;default:return DefWindowProc(hwnd, message, wParam, lParam);}return 0; //正常退出}VOID BubSort(int n){int i, j;BOOL flag;Sprites tmp;for (i = 0; i < n - 1; i++){flag = false;for (j = 0; j < n - i - 1; i++){if (Sprite[j].y > Sprite[j + 1].y)     //坐标大的往后移{tmp = Sprite[j];Sprite[j] = Sprite[j + 1];Sprite[j + 1] = tmp;flag = true;}}if (!flag) //没有进行交换  直接退出break;}}BOOL Game_Init(HWND hwnd){HBITMAP bmp;    srand((unsigned)time(NULL));   //随机数种子g_hdc = GetDC(hwnd);  //获取环境句柄//1.建立兼容DCg_mdc = CreateCompatibleDC(g_hdc);       //建立和hdc兼容的内存DCg_bufdc = CreateCompatibleDC(g_hdc);     //建立和hdc兼容的缓冲DC//建立与窗口兼容的空的位图对象 并选入mdcbmp = CreateCompatibleBitmap(g_hdc, WINDOWS_WIDTH, WINDOWS_HEIGHT);SelectObject(g_mdc, bmp);   //将空位图对象选入mdc//2.加载位图g_hBackGround = (HBITMAP)LoadImage(NULL, L"bg.bmp", IMAGE_BITMAP, WINDOWS_WIDTH,WINDOWS_HEIGHT, LR_LOADFROMFILE);g_hSprite[0] = (HBITMAP)LoadImage(NULL, L"11.bmp", IMAGE_BITMAP, 384, 96, LR_LOADFROMFILE);  //为下  可以按自身需要设定g_hSprite[1] = (HBITMAP)LoadImage(NULL, L"22.bmp", IMAGE_BITMAP, 384, 96, LR_LOADFROMFILE);   //左g_hSprite[2] = (HBITMAP)LoadImage(NULL, L"33.bmp", IMAGE_BITMAP, 384, 96, LR_LOADFROMFILE);  //右g_hSprite[3] = (HBITMAP)LoadImage(NULL, L"44.bmp", IMAGE_BITMAP, 384, 96, LR_LOADFROMFILE);   //上//3.随机设置贴图 起始位置  方向for (int i = 0; i < SPRITE_NUMBER; i++){Sprite[i].direction = 3;      //初始化为左Sprite[i].x = rand() % WINDOWS_WIDTH;Sprite[i].y = rand() % WINDOWS_HEIGHT;}Game_Paint(hwnd);return TRUE;}//绘制函数VOID Game_Paint(HWND hwnd){//4.恢复图号if (g_iNum == 4)     //图号为大于3时   回置0g_iNum = 0;//5.选用位图对象  在没mdc中SelectObject(g_bufdc, g_hBackGround);   //对象要选入g_bufd   将位图对象图号  //5.进行贴图BitBlt(g_mdc,0,0,WINDOWS_WIDTH,WINDOWS_HEIGHT,g_bufdc,0,0,SRCCOPY);  //在g_mdc中 以目前的对象进行  SRCCOPY贴图//选用贴图之前要进行排序BubSort(SPRITE_NUMBER);//6.在mdc进行透明处理for (int i = 0; i < SPRITE_NUMBER; i++){                  //g_hSprite[Sprite[i].direction]  要确定是那个方向的图SelectObject(g_bufdc,g_hSprite[Sprite[i].direction]);   //对象要选入g_bufdc 384/4=96  96不变     (g_iNum*96,0)每一次开始源位置TransparentBlt(g_mdc, Sprite[i].x, Sprite[i].y, 96, 96, g_bufdc, g_iNum * 96, 0, 96, 96, RGB(0, 0, 0));  //透明色彩法}//7.将后面的画面显示在窗口中BitBlt(g_hdc, 0, 0, WINDOWS_WIDTH, WINDOWS_HEIGHT, g_mdc, 0, 0, SRCCOPY);//8.记录此次的绘图时间g_tPre = GetTickCount();//9.图号要自增g_iNum++;//10.决定精灵移动的方向 以及贴图坐标for (int i = 0; i < SPRITE_NUMBER; i++){switch (rand() % 4)    { case 0:   //下Sprite[i].y += 20;if (Sprite[i].y>WINDOWS_HEIGHT - 100)     //要判断是否越出窗口Sprite[i].y = WINDOWS_HEIGHT - 100;Sprite[i].direction = 0;break;case 1:   //左Sprite[i].x -= 20;if (Sprite[i].x < 0)Sprite[i].x = 0;Sprite[i].direction = 1;break;case 2:   //右Sprite[i].x += 20;if (Sprite[i].x > WINDOWS_WIDTH-100)Sprite[i].x = WINDOWS_WIDTH - 100;Sprite[i].direction = 2;break;case 3:   //上Sprite[i].y -= 20;if (Sprite[i].y <0)Sprite[i].y = 0;Sprite[i].direction = 3;break;}}}BOOL Game_CleanUp(HWND hwnd){//释放资源对象DeleteObject(g_hBackGround);for (int i = 0; i < 4; i++){DeleteObject(g_hSprite[i]);}DeleteDC(g_bufdc);DeleteDC(g_mdc);ReleaseDC(hwnd, g_hdc);return TRUE;}



原创粉丝点击