C/C++超级玛丽C++游戏项目详细教程

这篇博客通过回忆超级马里奥的历史,激发读者重温经典。作者分享了一个C/C++编写超级玛丽游戏的详细教程,包括游戏结构体、初始化、移动函数、碰撞检测等关键部分,旨在让读者感受编程乐趣并提供学习资源。
摘要由CSDN通过智能技术生成

在你的童年记忆里,是否有一个蹦跳、顶蘑菇的小人已经被遗忘?

如果你回忆起了它,你定然会觉得现在它幼稚、无聊,画面不漂亮,游戏不精彩……但请你记住:这才是真正的游戏,它给了你无限的欢乐!许多人只玩过红白机或者网上玩家自己制作的几个破Flash小游戏就还以为任天堂所骄傲的“马里奥”系列就这样子的,你们真的以为超级马里奥就是1985年的“踩蘑菇/采蘑菇”么?也许大家都管马里奥叫超级玛丽,踩蘑菇,这是谁宣传的?

谁认为马里奥就1个游戏?谁说马里奥没有一个是2000年后出的!

从32K的ROM卡带到4.3G的特制光盘,从1.79MHZ的8位处理器到主频数G的次世代主机,从画面简陋的2D时代到音色俱佳的3D动画……你们才知道多少就说什么“超级玛丽”是所谓的幼稚游戏呢?一点也不亚于怪物猎人,极品飞车,火影忍者等等!在华丽的3D游戏、CG 动画大行其道的今天,你们应该想想,游戏是为了看画面还是为了让你快乐,请你回想马里奥在以前给你带来的快乐,它不是最真实、最纯朴的快乐么?

所有曾经的马迷,如果你渴望重新找回超级马里奥在以前给你带来的快乐,那么,试试在百度上打 超级马里奥 吧!超级玛丽只是一个人们习惯性的叫法,任天堂出的这款游戏是马里奥系列.

有一些人说"超级玛丽"说只有1个游戏.连一点意思都没有.还说马里奥是美国出的.是美国1970年出的下流东西。这对马里奥的忠实者会造成很大的伤害.

根据我们的不完全统计,在周围的游戏玩家中:

知道马里奥的人 100%

对马里奥说成超级玛丽的人:95%

知道马里奥有其他游戏的人 5%

其实马里奥不包括同人游戏已经出了上百款了,加上HACK ROM【改版】那就更多了。

初次登场开始两年后,还默默无闻的马里奥又出现在《大金刚Jr.》中。游戏中马里奥反串了绑架大金刚的绑匪,是一个使用鞭子操纵着怪物的角色。之后在《网球》和《PUNCH OUT》游戏中还客串过裁判。马里奥的名字第一次出现在游戏标题中是《马里奥兄弟》这款游戏,而且他的弟弟路易也初次登场。渐渐地,马里奥的个性也开始显现出来。而且也是在这个时候,他开始作为游戏的主人公,并开始独当一面了。到了1985年,把马里奥捧成明星的决定之作《超级马里奥兄弟》登场。保留了用头顶、用脚踩等基本动作系统的同时,更是加入了身体变大、发射火炮等多彩的系统。因此,马里奥也就成了真正的动作英雄。特别是吃到蘑菇后,身体变大的系统,给人强烈的震撼。一时间本作成为广大玩家的宠儿,马里奥也终于坐上了明星的宝座。从此马里奥的动作英雄传说,便一发而不可收。续篇2代、3代,也是一经推出,便马上热销。之后,更是进入了马里奥的颠峰时代。不只是动作游戏,作为医生的《马里奥医生》和高尔夫球手《马里奥高尔夫》,已经完全确立了马里奥在当时整个日本游戏界的地位。随着《超级马里奥USA》等国际版本的推出,马里奥的人气在全世界开始爆发。1990年在美国进行的调查显示,美国人对马里奥的认知度甚至超过了美国本土的明星米老鼠。一个游戏角色能达到如此出名的地步,就连宫本茂也没有想到。

我们今天就来看看我们自己能不能写出这样一个游戏呢?

来,话不多说,直接开始,gogogo

代码有点多,有一千多行吧,请耐心观看,好好看好好学!!!

首先就是我们的各种结构体(子弹、硬币等等)

struct ROLE
{
	int id;
    int x;//横坐标
    int y;//纵坐标
    int w;//图片宽度
    int h;//图片高度
    int xleft;//水平运动的左界限 
    int xright;//水平运动的右界限
    int turn;//精灵的运动方向
    int jump;//精灵是否跳跃
    int iframe;//加载第几副精灵图,这样就能让精灵看上去动起来了
};
struct MAP        //储存地图的结构体
{
	int id;
	int x;
	int y;
};
struct BULLET      //子弹的结构体
{
	int x;
	int y;
	int turn;
	int iframe;
	int id;
};
struct COINT      //硬币的结构体
{
	int x;
	int y;
	double iframe;
};
struct ENEMY      //敌人的结构体
{
	int id;
	int x;
	int y;
	int turn;
	int iframe;
};

为了方便大家,我就把函数全写在一个类里面啦

class game        //整个游戏只设置了这一个类
{
private:
	ROLE role;
	MAP map[350];
	BULLET bullet[20];
	COINT coint[50];
	ENEMY enemy[20];
	IMAGE img_mapsky,img_p,img_map,img_ani,img_mapbk,img_home;
	int xmapsky;           //背景天空的起始横坐标
	int xmap;              //地图的起始坐标
	double v0;             //精灵跳跃的初速度             
	double h;              //精灵跳跃的高度
	double t;              //精灵跳跃的时间
	int ibullet;           //第几颗子弹
	int xbullet;           //子弹的x坐标
	int ybullet;           //子弹的y坐标
	int get_bullet;        //是否获得武器,0表示没有获得,1表示已获得
	POINT icoint;          //储存硬币的坐标
	POINT bomb[20];        //储存哪些地方爆炸了的坐标
	POINT temp;            //临时坐标。储存哪些地方爆炸了的坐标
	double score_frame;    //下面3个double型的变量用于控制各自图片的帧,以实现动画的效果。如画面中的流水
	double bomb_frame;
	double mapbk_frame;
	int win;               //玩家是否过关
	int pause;             //玩家是否按Esc(暂停键)
public:
	game();
	~game();
	void start();          //处理游戏开始的界面,和按暂停键后的界面
	void init();           //初始化各项变量
	void move();           //控制主角移动
	void show();           //显示画面
	int isdie();           //判断主角是否已死
	int  GetCommand();	   // 获取控制命令。参阅easyx
	void left();           //主角向左运动
	void right();          //主角向右运动
	void up();             //主角跳跃
	void init_shoot();     //初始化发射子弹
	void fall();	       //主角自由落体或者向上跳跃
	int is_l_touch(int id);//主角的左边是否碰到墙或敌人,以及敌人是否碰到陆地的左边界
	int is_r_touch(int id);//主角的右边是否碰到墙或敌人,以及敌人是否碰到陆地的右边界
	int is_t_touch();      //主角的头是否碰到墙
	int is_b_touch(int id);//主角是否踩到敌人。
	int is_touch();        //主角是否吃到金币
	int is_land(ENEMY e);  //敌人是否站在陆地上
	void getbullet();      //获取子弹
	void shoot();          //发射子弹
	int eat(BULLET b);     //子弹是否打到敌人或者墙壁
	void end();            //处理游戏结束
};

接下来就是我们的常见的函数了——游戏初始化函数

void game::init()
{
	if(pause==1)
		return;
	role.id=1;
	role.x=X;
	role.y=Y;
	role.w=W;
	role.h=H;
	role.xleft=0;
	role.xright=role.w*6+STEP;
	role.iframe=1;
	role.turn=1;
	role.jump=0;

	xmapsky=0;
	xmap=0;
	v0=0;
	h=0;
	t=0;
	ibullet=-1;
	icoint.x=-1;
	icoint.y=-1;
	score_frame=0;
	bomb_frame=1;
	mapbk_frame=1;
	temp.x=-1;
	temp.y=-1;
	xbullet=41*role.w-10;
	ybullet=4*role.h-25;
	get_bullet=0;
	win=0;
	pause=0;
	score=0;
	int i;
	for(i=0;i<350;i++)
    {
		map[i].id=0;
		map[i].x=-1;
		map[i].y=-1;
		if(i<50)
		{
			coint[i].x=-1;
			coint[i].y=-1;
			coint[i].iframe=1;
		}
		if(i<20)
		{
			bullet[i].id=0;
			bullet[i].x=-1;
	        bullet[i].y=-1;
	        bullet[i].iframe=1;
	        bullet[i].turn=-1;  

			enemy[i].id=0;
   			enemy[i].x=-1;
	        enemy[i].y=-1;
         	enemy[i].turn=1;
	        enemy[i].iframe=1;

			bomb[i].x=-1;
			bomb[i].y=-1;
	 	}
	}
	loadimage(&img_mapsky,"res\\mapsky.bmp",XSIZE,YSIZE*4);
	loadimage(&img_p,"res\\role.bmp");
	loadimage(&img_map,"res\\map.bmp");
	loadimage(&img_ani,"res\\ani.bmp");
	loadimage(&img_mapbk,"res\\mapbk.bmp");
	loadimage(&img_home,"res\\home.bmp",XSIZE,YSIZE*5);

    mciSendString("open 背景音乐.mp3 alias mymusic1", NULL, 0, NULL);
	mciSendString("open 子弹.mp3 alias mymusic2", NULL, 0, NULL);
	mciSendString("open 金币.mp3 alias mymusic3", NULL, 0, NULL);
	mciSendString("open 跳.mp3 alias mymusic4", NULL, 0, NULL);
	mciSendString("open 子弹打到敌人.mp3 alias mymusic5", NULL, 0, NULL);
	mciSendString("open 子弹撞墙.mp3 alias mymusic6", NULL, 0, NULL);
	mciSendString("open 踩敌人.mp3 alias mymusic7", NULL, 0, NULL);
	mciSendString("open 吃到武器.mp3 alias mymusic8", NULL, 0, NULL);	
	mciSendString("open 胜利.mp3 alias mymusic9", NULL, 0, NULL);
	mciSendString("open 死亡1.mp3 alias mymusic10", NULL, 0, NULL);
	mciSendString("open 死亡2.mp3 alias mymusic11", NULL, 0, NULL);
	                                       
	for(i=0;i<300;i++)                 //以下都是编辑地图
	{
		map[i].id=1;
		map[i].x=i%100
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值