学习了前面的许多知识,现在可以真正做个可以玩的游戏了。
之前是用MFC做的飞机大战,但是有许多的问题。这次我们用Win32程序来开发,所有的代码都是自己写成的,可以控制更多的细节。这次的游戏就没有之前崩溃的问题了,并且绘制血条也很简单,直接GDI绘图完成。具体实现的时候没有用面向对象的思想,完全是面向过程的,感觉自己写的太臃肿了。事后想想如果是大型游戏的话这样肯定不行,还好规模小。先看下效果把。
游戏多个关卡,多个boss,多种道具,可玩行还可以吧。跟之前的差不太多。
运行环境:vs2010
此游戏为飞机大战,胜利条件为玩家消灭最终boss,失败条件为玩家被消灭。
游戏玩法:
开始界面:点击鼠标进入普通模式,按下空格键进入无敌模式,按下Esc键退出游戏。
游戏界面:玩家鼠标控制飞机的移动与射击,A键发射激光,S键使用防护罩,按下Esc键退出游戏,P键暂停。
结束界面:鼠标点击返回主界面回到开始界面。
主要使用技术的实现方式和对应的代码:
血条:使用GDI绘图函数进行绘制,主要使用了Rectangle函数和CreateSolidBrush。
镂空贴图:使用了TransparentBlt完成镂空贴图。TransparentBlt在贴图时可以把源位图中的某种颜色设定为透明色,这样与背景融合时就可以将源位图的部分像素隐藏掉。
位图显示:从文件中加载位图建立与窗口DC兼容的内存DC,内存DC装载创建好的位图对象,将内存DC的内容映射到窗口DC中以完成显像操作
动画:用连续贴图的方法完成动画,通过消息循环的方法
鼠标与键盘交互:通过消息循环实现键盘鼠标与游戏的交互。
子弹与道具运动:
运动物体的速度保持不变,每次画面更新,利用物体速度
计算下次物体出现的位置,产生物体移动的效果。
碰撞检测:框架检测碰撞,使用物体贴图的外围表示方框,
只要检测其中一个矩形的 四个定点是否在另一个矩形内即可。
源代码:
#include <windows.h>
#include <tchar.h>
#pragma comment(lib, "winmm.lib") //调用PlaySound函数所需库文件t
#pragma comment(lib, "Msimg32.lib")
#define WINDOW_WIDTH 500
#define WINDOW_HEIGHT 700
#define WINDOW_TITLE L"飞机大战"
const int SceneNum = 5; //关卡数
const int BulletSpeed = 10; //子弹速度
const int GoodsSpeed = 6; //道具速度
const int BulletNum = 3; //子弹种类
const int LaserNum = 2; //激光种类
const int MaxEnemyCount = 30; //最大敌机数目
const int MaxBulletCount = 100; //最大子弹数目
const int MaxLaserCount = 20; //最大激光数目
const int MaxExplosionCount = 40; //最大特效数目
const int MaxBuffTime = 30; //最大双倍弹药时间
const int MaxProtectedTime = 30; //最大防护罩时间
const int BossCreateTime = 1; //boss创建时间
const int BackGroundSpeed = 5; //背景滚动速度
//玩家弹道间隔距离数组(单倍,双倍弹药)
const int IntervalP[2][10] =
{
{19,38},
{0, 19, 38, 57}
};
//敌机、Boss弹道间隔距离数组
const int IntervalE[6][10] =
{
{15,65},
{35,70,110},
{15,45,90,120},
{12,100},
{15,60,105,150,195,240},
{16}
};
//飞机
struct Plane
{
int x, y; //位