游戏效果图:

做这个游戏很轻松,就是想练练windows编程技术。零零散散花点时间,心情不好就放着不管,半个月也做好了。主业其实是继续学习操作系统原理。

3月28号,设计了雷电战斗机的第一幅图。 
                做出了一个实验性的动画。
3月29号,实现了炮弹效果。
4月14号,实现了连续发射炮弹功能。
4月7号,加入敌机AI。
4月9号,为敌机AI加入发射炮弹功能。
4月13号,爆炸效果实现。
4月14号,采用新的游戏动画制作技术(位图背景透明显示技术),以游戏循环代替定时器来控制动画。
              使游戏画面终于流畅了!这是令人激动的进展!
                同时重绘了所有战机,加入游戏背景,一切都开始用位图表示。
4月15号,花了一个小时,最后润色了一下。

做这个游戏也是追求梦想的过程,一直想做一个真正有界面,有漂亮的画面,有战斗场面的游戏。只是一直不知道该怎么实现,现在我终于可以做到了!

我的收获:
         1,练习了windows编程技术,由一无所知到有信心开发简单应用程序。
         2,掌握了许多游戏开发和动画制作的技术。
         3,认识到了C语言的局限,与C++的优势。(在写大程序的基础之上)
         4,确定了自己的专攻领域--------游戏开发。

位图资源:

邪恶战机.bmp

帝国战机.bmp 

炮弹.bmp

爆炸.bmp

海.bmp

源码:

C++代码
#include <windows.h>
#define IDT_TIMER1 1
int nMode;
HBITMAP Ene,bg,cannonball,Eme,Explode;
HDC mdc;
DWORD tPre,tNow,tCheck;
int num,frame,fps;int x=400;
int y=600;HDC hdc;#define IDT_TIMER3 3//敌机发弹速度#define IDT_TIMER2 2//定义定时器2每12秒出现一个A类敌机#define IDT_TIMER4 4    //定义定时器4,我放飞机爆炸效果持续时间//-----------------------------------------
int Cannonball_x[20];                 //表示炮弹的横坐标
int Cannonball_y[20];                 //表示炮弹的纵坐标int C_Num[20];                        //用该数组标记一到二十个炸弹
int Num=0;                             //Num取值零到十九
int i;
int f;
//----------------------------------------//++++++++++++++++++++++敌方炮弹++++++++++
int E_A_Cannonball_x[10];              //敌机A炮弹横坐标数组
int E_A_Cannonball_y[10];              //敌机A炮弹纵坐标数组
int E_A_Num=0;                           //标记敌机炮弹
int E_A_NumCount[10];                 //标记敌机炮弹数组
//++++++++++++++++++++++++++++++++++++++++//===================================初始化A类敌机坐标     该类敌机由屏幕左上向屏幕右下移动并射击====================
int E_A_x=0;
int E_A_y=0;
//==================================================================================================================//是否我方战机撞到敌方炮弹
int If_Explode=0;
int  Draw_Explode=0;
int If_A_Explode=0;
int  Draw_A_Explode=0;LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{HWND hwnd;MSG Msg;WNDCLASS wndclass;char lpszClassName[]="日向";                                     char lpszTitle[]="日向";                                  wndclass.style=0;                                          wndclass.lpfnWndProc=WndProc;                             wndclass.cbClsExtra=0;                                      wndclass.cbWndExtra=0;                                      wndclass.hInstance=hInstance;                                 wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);              wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);                  wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);   wndclass.lpszMenuName=NULL;                                    wndclass.lpszClassName=lpszClassName;                          if(!RegisterClass(&wndclass))
{MessageBeep(0);return FALSE;
}hwnd=CreateWindow(lpszClassName,                   lpszTitle,                        WS_OVERLAPPEDWINDOW,               CW_USEDEFAULT,            CW_USEDEFAULT,                  CW_USEDEFAULT,CW_USEDEFAULT,                    NULL,                            NULL,                           hInstance,                    NULL                          );
MoveWindow(hwnd,0,0,1400,800,true);
ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd);  //------------------------------------------------for(int jj=0;jj<20;jj++)                 //初始化C_Num[20]数组为0{C_Num[jj]=0;}
//------------------------------------------//+++++++++++++++++++++++++++++++++++++++++++for(i=0;i<9;i++){E_A_NumCount[i]=0;}//++++++++++++++++++++++++++++++++++++++++++hdc=GetDC(hwnd);mdc=CreateCompatibleDC(hdc);  /*************************************************************这两个语句必须在下面的游戏循环之外**********************/
bg=(HBITMAP)LoadImage(NULL,"海.bmp",IMAGE_BITMAP,1500,1000,LR_LOADFROMFILE);
Ene=(HBITMAP)LoadImage(NULL,"帝国战机.bmp",IMAGE_BITMAP,170,99,LR_LOADFROMFILE);
cannonball=(HBITMAP)LoadImage(NULL,"炮弹.bmp",IMAGE_BITMAP,70,39,LR_LOADFROMFILE);
Eme=(HBITMAP)LoadImage(NULL,"邪恶战机.bmp",IMAGE_BITMAP,170,99,LR_LOADFROMFILE);
Explode=(HBITMAP)LoadImage(NULL,"爆炸.bmp",IMAGE_BITMAP,170,99,LR_LOADFROMFILE);
/**********************************************************************************************************************/while(Msg.message!=WM_QUIT)
{if(PeekMessage(&Msg,NULL,0,0,PM_REMOVE)){TranslateMessage(&Msg);DispatchMessage(&Msg);}else{tNow=GetTickCount();if(tNow-tPre>=1000){绘图                  SelectObject(mdc,bg);BitBlt(hdc,0,0,1500,1000,mdc,0,0,SRCCOPY);//---------------画我方飞机---------------------------------if(If_Explode==0){SelectObject(mdc,Ene);BitBlt(hdc,x,y,85,99,mdc,85,0,SRCAND);BitBlt(hdc,x,y,85,99,mdc,0,0,SRCPAINT);//----------------------------------------------------------SelectObject(mdc,cannonball);                                       //画炮弹for(i=0;i<20;i++){if(C_Num[i]==1){                                          //如果C_Num[i]=1表示有炮弹,开始画炮弹。可以//标记20个不同时间的BitBlt(hdc,Cannonball_x[i],Cannonball_y[i],70,39,mdc,70,0,SRCAND);BitBlt(hdc,Cannonball_x[i],Cannonball_y[i],70,39,mdc,0,0,SRCPAINT);//*********************************在这里判断是否敌机A被炮弹击中******************************if((E_A_x-20<=Cannonball_x[i]+10)&&(Cannonball_x[i]+10<=E_A_x+20)&&(E_A_y>=Cannonball_y[i]+20)&&(E_A_y<=Cannonball_y[i]+60)){C_Num[i]=0;                  Cannonball_x[i]=0;           //炮弹坐标重置,表示不再画这个炮弹             Cannonball_y[i]=0; If_A_Explode=1;Draw_A_Explode=1;}//********************************************************************************************}}}//If_Explode结束//--------------------------------------------for(i=0;i<20;i++){if(C_Num[i]==1)                                            //如果C_Num[i],表示炮弹发射,通过不断改变纵坐标实现运动{             Cannonball_y[i]-=1;}}//--------------------------------------------------//===========================================================画敌机if(If_A_Explode==0){SelectObject(mdc,Eme);BitBlt(hdc,E_A_x,E_A_y,85,99,mdc,85,0,SRCAND); BitBlt(hdc,E_A_x,E_A_y,85,99,mdc,0,0,SRCPAINT);}//===========================================================E_A_x+=1;                           //敌机坐标变化E_A_y+=1;//===========================================================//+++++++++++++++++++++++++++++++++++画敌机炮弹+++++++++++++if(If_A_Explode==0){SelectObject(mdc,cannonball); for(i=0;i<9;i++){if(E_A_NumCount[i]==1){BitBlt(hdc,E_A_Cannonball_x[i],E_A_Cannonball_y[i],70,39,mdc,70,0,SRCAND);BitBlt(hdc,E_A_Cannonball_x[i],E_A_Cannonball_y[i],70,39,mdc,0,0,SRCPAINT);if((x-20<=E_A_Cannonball_x[i]+10)&&(E_A_Cannonball_x[i]+10<=x+20)&&(y>=E_A_Cannonball_y[i]+20)&&(y<=E_A_Cannonball_y[i]+60)){        //是否我方飞机撞到炮弹E_A_NumCount[i]=0;E_A_Cannonball_x[i]=0;E_A_Cannonball_y[i]=0;If_Explode=1;Draw_Explode=1;                                    }}}}//If_A_Explode结束//---------------------------------------------------如果我方战机撞到地方炮弹if( Draw_Explode==1){                                       //画爆炸效果SelectObject(mdc,Explode);BitBlt(hdc,x+20,y,85,99,mdc,85,0,SRCAND); BitBlt(hdc,x+20,y,85,99,mdc,0,0,SRCPAINT); }//--------------------------------------------------如果敌机A被毁if(Draw_A_Explode==1){                                       //画爆炸效果SelectObject(mdc,Explode);BitBlt(hdc,E_A_x+20,E_A_y,85,99,mdc,85,0,SRCAND); BitBlt(hdc,E_A_x+20,E_A_y,85,99,mdc,0,0,SRCPAINT); }//--------------------------------------------------------------------------//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/敌机AI炮弹坐标变化for(i=0;i<10;i++){if(E_A_NumCount[i]==1){E_A_Cannonball_y[i]+=4;}}//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//------------------------------判断是否相撞--------------------if((x-20<=E_A_x+10)&&(E_A_x+10<=x+20)&&(y>=E_A_y+20)&&(y<=E_A_y+60)){If_Explode=1;                     //若相撞两飞机都爆炸Draw_Explode=1; If_A_Explode=1;Draw_A_Explode=1;}//--------------------------------------------------------------}}
}return Msg.wParam;
}LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{switch(message){case WM_CREATE://******************************************定时器的定义*********************************************//我方飞机的定时器::SetTimer(hwnd,IDT_TIMER3,600,NULL);//定义定时器2每12秒出现一个A类敌机::SetTimer(hwnd,IDT_TIMER2,6000,NULL);//定义定时器3,每一秒敌机发射一发炮弹::SetTimer(hwnd,IDT_TIMER4,600,NULL);      //设置爆炸效果持续时间break;case WM_TIMER:switch(wParam){case IDT_TIMER2:       E_A_x=0;E_A_y=0;if(If_A_Explode==1){              //如果敌机已被击中,规定时间内重画If_A_Explode=0;}break;case IDT_TIMER3:if(E_A_Num==9)E_A_Num=0;else{E_A_NumCount[E_A_Num]=1;}E_A_Cannonball_x[E_A_Num]=E_A_x+25;E_A_Cannonball_y[E_A_Num]=E_A_y+50;E_A_Num++;break;case IDT_TIMER4:Draw_Explode=0;Draw_A_Explode=0;break;}case WM_KEYDOWN:{switch(wParam){case VK_UP:                                   //控制我方飞机方向y-=22;break;case VK_RIGHT:x+=22;break;case VK_LEFT:x-=22;break;case VK_DOWN:y+=22;break;//----------------------------------------------------------------------------------case VK_SPACE:                 //按shift键发射炮弹if(Num==19)                //若Num增至19,转为零从新开始Num=0;else{C_Num[Num]=1;}Cannonball_x[Num]=x;            //获取第Num个炸弹的刚发射时的坐标值,发射后Cannonball_y[Num]=y-20;         //只需不断改变纵坐标自动的实现运dNum++;break;//---------------------------------------------------------------------------}}break;       case WM_DESTROY:PostQuitMessage(0);                                default:                                          return DefWindowProc(hwnd,message,wParam,lParam);}return 0;
}

《宇宙战争》游戏开发总结(雷电游戏)相关推荐

  1. 基于cocos2d-x的快速的游戏开发--回合制游戏

    2019独角兽企业重金招聘Python工程师标准>>> #基于cocos2d-x的快速的游戏开发--回合制游戏 开发时间:3天 开发工具:cocos2d-x和cocostudio 开 ...

  2. 微信小游戏开发教程-2D游戏原理讲解

    微信小游戏开发教程-2D游戏原理讲解 原理 为了更加形象的描述,这里先上一张图: 背景 a. 首先,我们看到背景好像是一张无限长的图片在向下移动.实际则不然,这是一张顶部和底部刚好重叠的图片.这是一种 ...

  3. Unity 2D游戏开发教程之游戏中精灵的跳跃状态

    Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...

  4. 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇

    马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...

  5. 小游戏开发怎么选游戏引擎

    前言 小游戏开发怎么选游戏引擎 微信小游戏现在非常的火,当我们下定决心做微信小游戏开发的时候, 面临我们的第一个问题是怎么选一个H5的游戏引擎, 那么今天本尊就来给大家分析一下目前能开发各大平台H5小 ...

  6. H5游戏开发包括哪些游戏类型

    H5在微信还没有诞生的时候,就已经在各大手机应用方面展露头角.最早的H5小游戏,例如4399公司开发的,开始了新一轮的热潮.随着微信的推出,很多H5游戏开始嵌入到微信公众号.微信群.朋友圈. H5因其 ...

  7. 从线下棋牌室到棋牌游戏开发平台 棋牌游戏行业发生了太多变化

    随着互联网的发展,许多线下棋牌室被渐渐的取缔,更多的棋牌运营商选择了开发棋牌游戏.线上棋牌游戏开发平台不依赖于空间的位置.时间的限制,给用户带来了更加方便的选择,受到了许多用户的青睐. 很多人对于线下 ...

  8. Threejs系列--9游戏开发--沙漠赛车游戏【基础场景渲染】

    Threejs系列--9游戏开发--沙漠赛车游戏[基础场景渲染] 序言 准备工作 目录结构 代码一览 index.js代码 index.css代码 Camera.js代码 Sizes.js代码 App ...

  9. Threejs系列--11游戏开发--沙漠赛车游戏【初步加载地面】

    Threejs系列--11游戏开发--沙漠赛车游戏[初步加载地面] 序言 目录结构 代码一览 world/index.js代码 world/Floor.js代码 materials/Floor.js代 ...

  10. Threejs系列--22游戏开发--沙漠赛车游戏【布置游戏开始场景】

    Threejs系列--22游戏开发--沙漠赛车游戏[布置游戏开始场景] 序言 目录结构 代码一览 index.js代码 Objects.js代码 Materials.js代码 materials/Fl ...

最新文章

  1. python笔记总结_python学习笔记总结(1)
  2. SpringBoot - 优雅的实现【参数校验】高级进阶
  3. C#:多线程使用TextBox控件
  4. Elasticsearch Suggester搜索建议详解
  5. windows调试器设置
  6. php防止跨域提交,PHP防止跨域提交表单的简单示例
  7. struts2 配置
  8. mysql meb安装_用meb搭建MySQL Master/Slave
  9. opencv 读取、显示、保存视频
  10. 设置sqlplus 显示列数和行数
  11. 实战:京东购物车静态界面实现
  12. 常见的射频同轴连接器(N型/TNC型/BNC型/SMA型等)
  13. (转载)《相信自己》
  14. 2.4G射频电路设计参考(wifi ble)
  15. stm32 服务器 文件系统,stm32关于fat16/32的文件系统底层
  16. 时尚圈美女撰文主攻方向
  17. 词袋模型基本原理——DBoW3
  18. wish商户平台登录网址中国版【wish圈】
  19. 微信小程序支付,微信支付【小白专用】
  20. Event事件-6:new Event自定义事件 / addEvent绑定自定义 / trigger触发自定义 / removeEvent移除自定义

热门文章

  1. ArrayList 遍历ArrayList的3种方法,和删除的两种方法
  2. [邮票上的故事] 乃木希典
  3. web前端入门基础教程
  4. Unity 2D 学习手札 (一) 基本概念
  5. pytoch 使用float64训练
  6. 整理好了,开关电源关键元件的各个参数中英文对照表
  7. cube station下载_Cube Station软件下载-Cube Station(魔方)下载v1.4.4安卓版-西西软件移动版下载...
  8. 我的单片机之路姗姗来迟
  9. 用dw制作php网站模板,如何用DW编辑网站模板
  10. python课程报告模板_我用Python做了一份PDF报告!!!