在你的童年记忆里,是否有一个蹦跳、顶蘑菇的小人已经被遗忘?
如果你回忆起了它,你定然会觉得现在它幼稚、无聊,画面不漂亮,游戏不精彩……但请你记住:这才是真正的游戏,它给了你无限的欢乐!许多人只玩过红白机或者网上玩家自己制作的几个破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