射击类游戏《小魔女》中窗口的创建与编程

(整期优先)网络出版时间:2009-07-04
/ 1
本文将讲解射击类游戏《小魔女》制作的剩余部分。通过对游戏对象的控制、数据的更新、碰撞检测、画图和难度设置等方面系统的详细讲解,读者可以了解射击类游戏制作的各个环节,制作自己喜欢的射击类游戏。
关键词 DirectDraw,碰撞检测,类,画图,难度设置
一、创建游戏
本讲仍然采用上一讲中的游戏窗口框架。切换到资源视图,将主对话框按Del键删除掉,然后切换到文件视图中,将对话框关联的两个文件删除掉(默认为CMyDlg.h和CMyDlg.cpp)。接着切换到CMyApp类的实现文件中,将所有关于CMyDlg代码删除。最后切换到工程目录中,将主对话框关联的两个文件删除(默认为CMyDlg.h和CMyDlg.cpp)删除。
在创建窗口中,上一讲将窗口类和DirectDraw放到一个类中,因此显得比较乱,本讲将窗口创建部分独立开来,窗口类仍然用CWnd为基类,将窗口创建部分放到CWinApp类的初始化函数InitInstance中完成,然后为窗口类添加一个功能函数,用来将先前封装好的DirectDraw和当前窗口关联起来,因此,需要在当前窗口类中,包含My_DirectDraw.h头文件引用封装好的My_DirectDraw类,接下来具体完成这个窗口类的创建
首先创建一个基于MFC框架的类,类名用“GameWnd”,它的基类为generic Cwnd,然后单击确定创建这个窗口类。

在使用GameWnd类时,需要包含一些头文件,如游戏中要用到的类对象以及封装好的DirectDraw和一些常量定及结构等,实现的核心代码如下:

#include "MyMusicPlay.h"
#include "ESGirl.h"
#include
#include "EneMy.h"
#include

#define DEFENEMY_SPEED 3 //敌人默认速度
#define DEFENEMY_BULLET_SPEED 5 //敌人默认子弹速度
#define DEFENEMY_LIFE_COUNT 10 //敌人默认生命值
#define DEFCLOUD_SPEED 2 //默认云移动速度
#define DEF_MAX_ENEMY_COUNT 10; //默认一次允许最多出现敌人数

struct dxdata
{
int m_style; // 1表示敌人,2表示子弹,3表示云
EneMy m_enemy; //敌人
Bullet m_bullet; //子弹
Cloud m_cloud; //云
};

MyMusicPlay是先前封装好的DirectShow,因此需要将该类用到的头文件以及实现文件插入到当前工程来。可以直接将上一章的MyMusicPlay.h和MyMusicPlay.cpp文件直接复制过来,然后在VC的文件视图中,将这两个文件插入到工程即可。

ESGirl.h是小魔女对象的头文件,其中还包含了云对象 (Cloud),子弹对象(Bullet)。mmsystem.h是调用sndPlaySound函数播放声音时必须包含的一个头文件。Enemy.h是敌人对象的头文件,最后的list是STL中链表的头文件。

结构dxdata包含三个主要对象的结构。游戏运行中,需要将各个活动对象添加到同一个链表中,而一个链表只能添加一种类型变量,所以需要将Bullet、EneMy、Cloud这三个对象全部组合在一个结构中,以实现不同对象添加到同一个链表中。
结构成员m_style是标志该结构具体是什么对象,为1时,表示该结构代表的是敌人这个对象;2表示是子弹对象;3表示云对象。

完成了这些基本数据的定义后,接着还需要创建主窗口GameWnd。切换到CMyApp类中,包含GameWnd.h这个头文件,再切换到CMyApp类的初始化函数InitInstance中,创建窗口。核心代码如下:

GameWnd * pgw=new GameWnd;
pgw->CreateEx(0,AfxRegisterWndClass(0,0,HBRUSH(GetStockObject(BLACK_BRUSH)),0),"小魔女",WS_POPUP,0,0,800,600
,NULL,NULL,NULL);
m_pMainWnd=pgw;
pgw->ShowWindow(SW_NORMAL);
pgw->UpdateWindow();