VC++超级玛丽游戏系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
超级玛丽游戏系统
1.课程设计的目的
随着科学技术的发展,人们的生活水平的提高,然而也越来越繁忙。在充满竞争的社会条件,压力往往带给人们很多烦恼。为了给大家提供一个合理的解压平台,在本次课程设计中为大家开发了一款适合休闲解压的小游戏,超级玛丽。
本次设计加深对面向对象程序设计中基础理论和基本知识的理解,培养学生的实践能力,促进理论与实践的结合。通过课程设计,能够熟练运用C++进行面向对象编程,建立对象模型,降低软件的复杂性,改善软件的重用性和维护性,提高软件的生产效率,全面掌握面向对象编程技术。
2.设计方案论证
2.1设计思路
游戏基本功能:
1. 玩家起初只能用普通子弹或踩踏杀死敌人,但是踩踏无法杀死特殊敌人,无法顶碎砖块。被敌人碰到将失去一条生命。
2. 在玩家吃旋风炮弹之后,攻击能力变强,可以轻松杀死普通敌人和特殊敌人。
3. 玩家一共有三条命的机会去闯关超级玛丽游戏,玩家要在一定时间,通过游戏。如果三条生命都丢掉,将输掉整个游戏。
本游戏的用例模型如图1所示。
图1 用例模型
2.2开发工具选择
代码编写调试使用Visual C++ 6.0。美术工具,Windows自带的画图(开始-程序-附件-画图),Photoshop,记事本或UltraEdit等文本编辑工具。
3.2.2游戏背景类MYBKSKY
这是一个专门处理游戏背景的类。在横版游戏或射击游戏中,都有一个背景画面如图2所示,如山、天空、云、星空等等。这些图片一般只有1到2倍屏幕宽度,然后像一个卷轴一样循环移动,连成一片,感觉上像一很长的图片。这个类就是专门处理这个背景的。在超级玛丽增强版中,主要关卡是3关,各有一背景图片;从水管进去,有两关,都用一全黑图片。共四图。这四图大小一致,纵向排列在一个位图文件中。MYBKSKY 这个类,派生于MYBITMAP。由于背景图片只需要完成循环移动的效果,只需要实现一个功能,而无需关心其他任何问题(例如句柄、dc)。
图2 背景图
技术原理:一图片像卷轴一样不停移动。假设有一条垂直分割线,把图片分成左右两部分。先显示右边部分,再把左边部分接到图片末尾。不停移动向右移动分割线,图片就会循环地显示。
成员函数功能列表:
class MYBKSKY:public MYBITMAP
{
public:
MYBKSKY();
~MYBKSKY();
//show
//功能显示一个背景.
//入参无
void DrawRoll(); //循环补空
//功能显示一个背景,并缩放图片
//入参横纵方向缩放比例
图3 子弹发射图
3.4子弹的显示和帧的刷新
上次讲所有的子弹存储到一个数组里。用一个游标(数组下标)表示新生产的子弹存储的位置。设数组为a,长度为n。游戏开始,一个子弹存储在a0,然后是a1,a2,...,a(n-1).然后游标又回到0,继续从a0位置存储.数组长度30,保存屏幕上所有的子弹足够了。
子弹的显示功能由图像层完成。如同图像处理中讲的。显示一个子弹(所有图片都是如此),只需要子弹坐标,子弹图片id,图片帧。
函数:void GAMEMAP::ShowAniObj(MYANIOBJ & bmobj)
用一个函数不停地检测所有子弹,,如果某个子弹碰到了小怪,小怪消失,子弹消失。
实现由函数:
int GAMEMAP::CheckAni(int itimeclip)
至此,玩家按下攻击键然后子弹生成,显示运动,碰到小怪,子弹消失,小怪消失。这些功能全部完成。如果只做成这样,不算本事.攻击方式分两种:子弹和旋风。小怪包括:两种蘑菇兵、两种火圈。同时火圈能产生两种蘑菇兵。而旋风的攻击效果明显高于普通子弹。
3.5旋风攻击,小怪运动,火圈
作为魔法攻击方式的旋风,和子弹小异。旋风的存储与子弹同存储在一个数组中即:struct ROLE FireArray[MAX_MAP_OBJECT];
旋风生成函数:
int GAMEMAP::CheckAni(int itimeclip)
这和子弹生成的处理相同。唯一区别是旋风不移动,所以movex属性最后设置为0。在幕上的绘制和子弹相同,函数void GAMEMAP::ShowAniObj(MYANIOBJ & bmobj)。代码部分和子弹相同。但是旋风的帧刷新有些特殊处理,函数是:
void GAMEMAP::ChangeFrame(int itimeclip)
至此,旋风将会显示,动画播放结束后消失。旋风不涉及运动。碰撞检测的处理和子弹相同,唯一区别是:当旋风和小怪碰撞,旋风不消失,如图4旋风与小怪的碰撞。
图4 旋风与小怪的碰撞
小怪可以分为:蘑菇兵和火圈两种。
存储是我问题.和攻击方式处理相同, 用数组加游标的方法.蘑菇兵和火圈存储在同一数组中,如下:
struct ROLE MapEnemyArray[MAX_MAP_OBJECT];
int iMapEnemyCursor;
小怪是由地图文件设定好的。比生成子弹要复杂一些,尤其是火圈。火圈要不停地生成蘑菇兵,所以“分区管理”,数值前一半存储蘑菇兵,后一半存储火圈。
3.6玩家动作控制MYROLE
玩家移动:把行走和跳跃看成两个状态,各自用不同的变量表示横纵方向的速度。相关属性:
行走:横向速度为movex,纵向不移动。
跳跃:横向速度为jumpx,纵向速度为movey。当前跳跃高度jumpheight。
运动方向:idirec
思路:
第一步:玩家按键,按键处理函数设置这些属性。按键松开,清除动作属性。
第二步:用一个函数不停检测这些变量,控制玩家移动。