记中兴软件园一个月实训(四)

控制台做完了,剩下的就是贴图了,简单的说。

本着共享源代码的思想,文章结尾我会赋上0.0----1.4版本的代码

(名字为Popstar的为构建完成的代码,名字为*1.0----*1.4的为构建过程代码)

东西有点多,我都不知道从哪点讲起。

创建项目工程的时候选Win32项目

然后看1.0版本,在WinMain中只写了一个函数

 1 int WINAPI WinMain(HINSTANCE hInstance,        //当前应用程序的实例句柄HANDLE
 2                    HINSTANCE hPrevInstance, //win32中不用了
 3                    LPSTR lpCmdLine,            //命令行参数
 4                    int nCmdShow)            //窗口显示的状态
 5 {
 6     g_hInstance = hInstance;
 7     //创建窗口
 8     //1、设计窗口类
 9     WNDCLASSEX wndclassex;
10     wndclassex.cbClsExtra = 0;
11     wndclassex.cbSize = sizeof(WNDCLASSEX);
12     wndclassex.cbWndExtra = 0;
13     wndclassex.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(0,255,0));//CreateSolidBrush(RGB(0,255,0))可以替换为(5,6,7,8,^^^^)
14     wndclassex.hCursor = LoadCursor(NULL,IDC_ARROW/*箭头样式*/);
15     wndclassex.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));//载入ico图标
16     wndclassex.hIconSm = 0;
17     wndclassex.hInstance = hInstance;
18     wndclassex.lpfnWndProc = WndProc;//重要一点
19     wndclassex.lpszClassName = ClassName;//重要一点
20     wndclassex.lpszMenuName = 0;//菜单名
21     wndclassex.style = CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
22     //2、注册窗口类
23     RegisterClassEx(&wndclassex);
24     //3、根据设计的窗口类创建窗口
25     int nScreenCX = GetSystemMetrics(SM_CXSCREEN);//获取屏幕的宽高
26     int nScreenCY = GetSystemMetrics(SM_CYSCREEN);
27     HWND hwnd = (HWND)CreateWindowEx(
28         WS_EX_OVERLAPPEDWINDOW,
29         ClassName,L"PopStar",
30         WS_SYSMENU|WS_MINIMIZE,
31         (nScreenCX - WND_WIDTH)/2,//窗口的位置
32         (nScreenCY - WND_HEIGHT)/2,
33         WND_WIDTH,WND_HEIGHT,NULL,0,hInstance,0);
34     //4、显示创建好的窗口
35     ShowWindow(hwnd,nCmdShow);
36     //5、刷新窗口
37     UpdateWindow(hwnd);
38     //6、进入消息循环
39     MSG msg;
40     while(1)
41     {
42         if(PeekMessage(&msg,0,0,0,PM_REMOVE))
43         {
44             if(msg.message == WM_QUIT)
45             {
46                 break;
47             }
48             DispatchMessage(&msg);
49         }
50         else
51         {
52             g_currTime = GetTickCount();
53             if(g_currTime - g_preTime > 60)
54             {
55                 DrawGame();
56             }
57         }
58     }
59     return 0;
60
61 }

用于创建窗口,是windows编程的主函数

定义了游戏状态

1 typedef enum game_state
2 {
3     GAME_READY,
4     GAME_START,
5     GAME_PAUSE,
6     GAME_OVER,
7 }enumGAME_STATE;

然后就是画整个游戏的状态

 1 void DrawGame(void)
 2 {
 3     if(g_game_state == GAME_READY)
 4     {
 5         StickReadyPics();
 6
 7     }
 8     else if(g_game_state == GAME_START)
 9     {
10         StickStartPics();
11
12     }
13
14     BitBlt(g_hdc,0,0,WND_WIDTH,WND_HEIGHT,
15         g_hBuffer2,0,0,SRCCOPY);
16     //TransparentBlt();
17     g_preTime = GetTickCount();
18
19 }

再有就是回调函数

 1 //回调函数---->用于处理消息:产生消息的时候自动调用
 2 //所有的消息都要被这个函数处理,所以default不能省略
 3 LRESULT _stdcall WndProc(HWND hwnd,
 4                          UINT message,
 5                          WPARAM wParam,//消息的附加参数
 6                          LPARAM lParam//消息的附加参数
 7                          )
 8 {
 9     switch(message)
10     {
11     case WM_CREATE:
12         {
13             InitGame(hwnd);
14             break;
15         }
16     case WM_PAINT:
17         {
18             PAINTSTRUCT ps;
19             HDC hdc = BeginPaint(hwnd,&ps);
20             DrawGame();
21
22             EndPaint(hwnd,&ps);
23             break;
24         }
25     case WM_DESTROY:
26         {
27             CleanGame(hwnd);
28             PostQuitMessage(0);
29             break;
30         }
31     case WM_LBUTTONDOWN:
32         {
33             OnBtnClick(LOWORD(lParam),HIWORD(lParam));
34             break;
35         }
36     case  WM_ERASEBKGND:
37         {
38             ;
39         }
40         break;
41     default:
42         {
43             return DefWindowProc(hwnd,message,wParam,lParam);
44         }
45     }
46     return 0;
47 }

用了双缓冲,不至于游戏卡屏

但是个人觉得CPU还是占用了50%,效率不高

 1 void InitGame(HWND hwnd)
 2 {
 3     g_hdc = GetDC(hwnd);//设备环境---->绘图工具集
 4     g_hBuffer1 = CreateCompatibleDC(g_hdc);
 5     g_hBuffer2 = CreateCompatibleDC(g_hdc);
 6     g_cptBitmap = CreateCompatibleBitmap(g_hdc,WND_WIDTH,WND_HEIGHT);
 7     SelectObject(g_hBuffer2,g_cptBitmap);
 8     //初始化位图
 9     InitBitmap();
10
11     //初始化数据对象
12     InitDataObj();
13     //逻辑变量赋初值
14     g_game_state = GAME_READY;
15 }

接着处理鼠标单击事件

 1 //看鼠标单击的位置是否位于相应的坐标范围内,如果在,就改变当前游戏的状态值
 2 void OnBtnClick(int x,int y)
 3 {
 4     POINT pt = {x,y};
 5     RECT rect;
 6     if(g_game_state == GAME_READY)
 7     {
 8         //游戏开始
 9         rect.left = g_ready_btn_start._pos.x;
10         rect.top =  g_ready_btn_start._pos.y;
11         rect.right = rect.left + g_ready_btn_start._size.cx;
12         rect.bottom = rect.top + g_ready_btn_start._size.cy;
13         if(PtInRect(&rect,pt))
14         {
15             g_game_state = GAME_START;
16         }
17         //游戏退出
18         rect.left = g_ready_btn_exit._pos.x;
19         rect.top =  g_ready_btn_exit._pos.y;
20         rect.right = rect.left + g_ready_btn_exit._size.cx;
21         rect.bottom = rect.top + g_ready_btn_exit._size.cy;
22         if(PtInRect(&rect,pt))
23         {
24             PostQuitMessage(0);
25         }
26
27     }
28     else if(g_game_state == GAME_PAUSE)
29     {
30
31     }
32     else if(g_game_state == GAME_START)
33     {
34         //判断当前鼠标是否与星星位置触碰
35         for (int row = 0; row < ROW; row++)
36         {
37             for (int column = 0; column < COLUMN; column++)
38             {
39                 rect.left = g_arrStars[row][column]._pos.x;
40                 rect.top =   g_arrStars[row][column]._pos.y;
41                 rect.right = rect.left +  g_arrStars[row][column]._size.cx;
42                 rect.bottom = rect.top +  g_arrStars[row][column]._size.cy;
43                 if(PtInRect(&rect,pt))
44                 {
45                     SelectStar(g_arrStars[row][column]);
46                     //Beep(500,500);
47                 }
48             }
49         }
50     }
51 }

至于载入图片,第一步就是先定义数据对象,第二步用LoadImage载入图片,第三步初始化数据对象

这样的一个基本窗口就构建好了,就相当于整个游戏的游戏框架构建完成。以后的工作就是根据需要添砖加瓦。

文件有点大,因为有音频文件

Popstar源代码:http://pan.baidu.com/s/1qWmPFVA

         Code:21pv

扫雷是自己写的一个程序,盗用了这位:http://blog.csdn.net/chenpeijie0_0/article/details/7171284的图,未引用源代码,望原著见谅!

扫雷源代码:http://pan.baidu.com/s/1mgMPAwK

      Code:mnu9

时间: 2024-10-03 13:30:01

记中兴软件园一个月实训(四)的相关文章

记中兴软件园一个月实训(一)

马上大四了,在学期末学校一年一度的企业实训体验开始了. 其实现在已经接近尾声,只是把学到的东西整理一下,供各位君闲聊查看. /**********这个是第一天的笔记*************************/ /*一:程序的结构工程 sln文件 .c 文件包括:函数的定义 变量的定义 .h 文件包括:存放声明 类型的定义 宏定义 函数: 主函数 子函数 语句 单词 字母数字下划线 开头不能是数字二:数据类型 --->size 范围分类:1.基本类型整形 有符号 无符号实型 字符型 :un

记中兴软件园一个月实训(二)

/**********************第二天的内容有点多,看官们耐心点看*********************/ 指针与变量1.指针的概念---->指针就是地址2.指针的类型 是一种逻辑类型不是物理类型"变量的类型 + *"3.如何定义指针变量 "类型名 变量名"变量尺寸占4个字节 4Byte4.加减运算,解引用运算加减都是加减绑定的字节数NOTE:对于指向变量的指针,加减运算没有意义对于未知的内存,可读不可写5.指向变量的指针在实际开发中的应用扩

记中兴软件园一个月实训(三)

前两天只是简单复习了下C语言的基础知识,到第三天就采用项目驱动的方式,带着我们一个班的学生做项目----Popstar游戏 其实还是很倾向于项目驱动的方式来学习的,老师在上边一边讲一边敲代码,我们就只要听,和抄下投影仪上的代码.带着我们走过一遍流程以后,再让我们自己写一个小游戏,老师只提供技术难点帮助. 话不多说,给各位君看看记录的东西. 首先做了一个控制台下的Popstar,用于测试算法的正确性,由于Popstar涉及到选择附近四个方向的同颜色的星星,因此要用到扩展查找算法.因为是学习,老师展

Pathon实训四

#实训的第四天,哦吼,今天有学生占用教室期末考试,我们今天等于没上课,难受哦.上午坦#克老师教我们装程序是的,没错,装了半个上午. #以下是我直接copy坦克老师的 1.什么是selenium? selenium是一个自动测试工具,它可以帮我通过代码 去实现驱动浏览器自动执行相应的操作. 所以我们也可以用它来做爬虫. 2.为什么要使用selenium? 主要使用selenium的目的是为了跳过登录验证. 3.安装与使用 - 下载驱动器: http://npm.taobao.org/mirrors

18年7月实训unity项目中遇到的问题记录

1.在一个项目中做好的UI做成预置体后在另一个项目中使用时发现无法响应鼠标的输入事件 解决:在使用预置体的项目中添加EventSystem. 2.使用DontDestroyOnLoad()来避免场景切换后GameObject被销毁存在的问题 假如A场景中有一个GameObject名为player,为了不让player在场景切换到B时消失而使用DontDestroyOnLoad(player),这样会导致场景再次切换回A时,A场景中同时出现两个player,并且两个player在场景切换后都不会消

记一次Mysql魔鬼实训

1.查看某个Mysql数据库当前使用的字符集 show create database [库名称] 2.查看当前书库版本信息 #mysql -V MariaDB [(none)]> use mysql; MariaDB [mysql]> select version(); 3.查看当前登录的用户 MariaDB [mysql]> select user(); 4.创建GBK字符集的数据库test1; MariaDB [mysql]> create database test1 de

实训四(cocos2dx sharesdk集成-1)

随着项目的进行,好像陷入的技术优先的迷局,对那些可以实现的功能,代码的编写上越来越漫不经心,反而对没有掌握的技术求之若渴,不免显得有些好高骛远.在没有掌握之前,思考.学习.交流也是一种快乐与享受. 言归正传, ShareSDK是一种社会化分享组件,为iOS.Android.WP8 的APP提供社会化功能,集成了一些常用的类库和接口,缩短开发者的开发时间,还有社会化统计分析管理后台.ShareSDK移动开发者服务平台由广州掌淘网络科技有限公司开发. 支持包括QQ.微信.新浪微博.腾讯微博.开心网.

&lt;实训|第四天&gt;Linux下的vim你真的掌握了吗?附上ftp远程命令上传。

期待已久的linux运维.oracle"培训班"终于开班了,我从已经开始长期四个半月的linux运维.oracle培训,每天白天我会好好学习,晚上回来我会努力更新教程,包括今天学到了什么知识点,用了什么方法,使用了什么工具,工具在哪里共享着等等,努力做到让每一位感兴趣的.关注我的.没关注我的老司机都能在自己闲暇的时光学到一点额外的知识,指不定那一天你就用上了少许呢! ------------------------------------------------------------

实训第1天(12月29日)

一.目标 大家自选主题(建议毕业设计题目)进行系统开发和测试,并完成相关文档. 最终提交:(1)系统源代码:(2)实训报告:需求分析+系统设计+系统实现+系统测试. 二.进度安排 1.12月29日(周一),3-8节 完成需求分析和系统设计的文档,及相关代码. 2.12月31日(周三),1-7节 完成系统模板和首页的设计,以及实现一个功能模块. 3.1月4日(周日),1-8节 完成主要功能模块,更新完善文档. 4.1月5日(周一),1-10节 完成主要功能模块,更新完善文档. 5.1月6日(周二)