基于C++与Opencv制作的简单马里奥游戏

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/codedoctor/article/details/53165019

代码源码地址:超级马里奥

本游戏是今年夏天暑假的一项选拔的大作业,记得当时用了差不多整整十天的时间,每天编程时间都在十二个小时左右。由于基础的不足,经历了很多的修改和重做。中间的不同版本记得一共有4个,第一个是完全的一整个主函数和一堆功能函数的设计,现在想起来还是有点好笑,当时完全没学过C++,也不太熟悉C++的面向对象的设计,还是在c的基础上思考问题。也是很尴尬,但幸好及时的悬崖勒马,花了一天看视频教程大致学完了C++的类和一些基本操作,才开始正式进行这个游戏。
做这款游戏的第一步就是思考这款游戏应该如何运行,Opencv是一个图像处理库,说白了就是一堆图像处理的函数和功能的总和,所有的物理碰撞,物体接触的实现都得依靠自己的计算和思考来实现,现在想起来不是很难,但当时着实花了很大的功夫才实现了马里奥和各种物体的碰撞。在实现碰撞的过程中,再给马里奥和各种怪物设计了重力因素,物体时时处于重力之下,又由于马里奥和地面的碰撞,让马里奥不会掉入地面。由于时间是几个月前做的东西,标准性等自然有很大的问题。只是希望能够记录一下自己的成长过程。talk is chaep ,show me the code。
由于当时还没有系统学习C++,所以多态封装这些东西都没怎么用
具体的类如下(全部都是public,没错):

具体有八个类,食人花,马里奥,墙,金币,工具类(主管碰撞的判断和图像的绘制),乌龟,背景,墙。
现在说一下几个最重要的类的具体实现:
马里奥类:

class CMario
{
public:
    CMario();
    ~CMario();
 void   Draw( IplImage *tpd); int   GetPosX();
 int   GetPosY();
 void  Move();
 void  GetNowImage();
    int    m_posX;
    int    m_posY;
    bool   m_isAlive;
    int m_speed;
    IplImage* m_img;
    bool m_isDownWall;
    bool m_right;
    bool m_left;
    bool m_isGround;
    bool m_isUp;
    int m_diraction;//马里奥现在所朝的方向
    IplImage *m_l[4];//向左的动作
    IplImage * m_r[4];//向右的动作
    IplImage *m_jump[2];//跳跃;
    int act;
    int life;
    int n_num;
    int up_speed;
    int gravity;
};

总调控类:

class CManager
{
public: 
    CManager();
    ~CManager();
    void Start();
    void Run();
    void End();
    void Is_Game_Over();
    void Mario_Move();
    void All0bj_Move();
    void All_Collider();
    void Refresh_Map();
    void Gravity();
    void Return_Go_On_Game();
    void Draw_Changed_Map();
    void Draw_Count_And_Life();
    int Mario_meet_Stone (int x ,int y);</span>
privateint                          Delta_Length;
    int                           now_Game_Score;
    vector<CTortoise*>::iterator  ittor1;
    vector<CFlower*>::iterator    ittor2;
    vector<CGold*>::iterator      ittor3;
    IplImage                      *BG_Clone;
    CTools                        tools;
    CMario                        mario;
    CMapscene                     scene;
};

就这两个类吧。再多看下去,我担心自己会忍不住重新再写一遍这个程序,真的是处于每一天都看不起自己前一天的代码的成长期,不知道什么时候才会定下自己的写代码风格。
游戏画面如下:(没有指示界面,没有菜单,没有BOSS,hhh)
这里写图片描述
虽然这个游戏有很多的不完美和缺陷,比如类的设计非常的稚嫩,函数名变量名非常不规范,没有遵循封装的思想。
但是我很爱这个游戏,玩完这个游戏的时间只需要短短的几分钟,但做完这个游戏的过程让我很难忘,也很享受。记得那时候每天沉浸在代码的世界中,每天都在思考这个程序的各种设计,每个功能如何实现,某个BUG如何修改,怎样提高程序的运行效率和人物碰撞的判断的精确性,那时候时间过得真的很快,每天一低头打代码,抬头就去吃饭,吃饭的时候都想着如何完善自己的代码。单纯而且有效率,虽然这个程序现在看来有太多的不足,但是却是实现了我童年的愿望——做一款自己的游戏。

作为记录吧,就这样。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页