Javascript实现简单的超级马里奥小游戏



写在前面:

这是自己自学前端之路上第一次写博文,希望以此来巩固自己所学的知识,也希望能和大家多多交流!

这个小案例是韩顺平的js学习视频中的案例,视频中给出了一部分的实现,之后由本人补充了一些功能并改进了页面布局。

功能需求分析:

1)通过上下左右四个button控制马里奥的移动

2)使用面向对象的思想,设计Mario的类,并为Mario添加方法

3)注意Mario移动不能跑出游戏界面(边界检测)

4)Mario遇到得分物体获得加分(碰撞检测+得分统计)



页面初步布局:

设置控制中心,可通过table标签实现,表格中的内容可添加input标签, type="button" value="上/下/左/右"的箭头符号

控制中心初步效果

设置游戏区域div,命名为gamefield,并添加一张马里奥的图片,游戏主角,以及草莓的图片作为可得分物体。


游戏区域初步效果



核心功能实现:

1)该小案例是为了熟悉js的面向对象语法,所以设置Mario的类 通过构造函数 function Mario(){...}声明该类,类中需要实现的方法为this.move=function(direnction){.....},移动的情况分为上下左右四种情况,所以通过case语句来区分。当然其中还有很多细节,但是一步步先把整体框架搭建出来,之后再一步步修改细化。

构造函数写完之后,通过实例化才能生成一个Mario的对象,用这句话来实现

var mario=new Mario ();

接下来,在主程序中 声明一个全局函数,就可以调用mario的move方法了

移动 0-上 1-右 2-下 3-左



2)好了,接下来就是对Mario类中公有方法move的具体实现了。

想要移动mario,首先需要获取它的图片元素,js中获取单个元素的方法getElementById()

var mymario=document.getElementById("marioimg");

获得这个元素之后,我们还需要获得这个图片的位置。视频教程中对图片设置为了行内样式,其坐标位置就是相对于游戏区域gamefield的位置,其前提是gamefield的定位必须为obsolute,否则无法获取到。

直接通过obj.style.left和obj.style.top即可获得图片在游戏区域的相对位置。

用这个方法中间遇到了一些坑点,上网查了半天终于解决了!!!是这样说的:获取元素的位置通常有两种方法 

1.直接通过obj.style.left和obj.style.top,但是有局限性,这种获取的方法只能获取到行内样式的left和top的属性值,不能获取到style标签和link 外部引用的left和top属性值。(当时没按照教程来设置成了外部样式,半天都是空,获取不到值)

2使用obj.offsetLeft来获取对象的left属性值,用obj.offsetTop来获取对象的top属性值。  但这两个属性是只读的,不能赋值

var left=mymario.style.left; //取到的是带px的字符串

left=parseInt(left.substring(0,left.length-2));  //去掉px,转为int数字

var top=mymario.style.top;

top=parseInt(top.substring(0,top.length-2));

switch语句可以初步这样写出来:

改变mario的位置

这是设置好之后,就可以将全局函数marioMove(direction)绑定到button的onclick事件上,此时我们就可以通过button控制mario的移动了。但是现在还有很多不足,mario会跑出界,遇到其他图片没有响应,所以需要继续添加新的功能。



3)实现边缘检测功能,防止mario跑出游戏区域之外。直接上代码因该可以一目了然。

注:图片本身大小为60*60,所以判断宽高出界时要减去图片的宽高



4)实现碰撞检测功能,mario碰到其他物体可以得分

其基本原理如下图所示:

碰撞检测原理示意图

物体1只要处于上图的四条边界线之外的任意一种情况,就没有发生和物体2的碰撞,否则就发生了碰撞。具体代码如下:


碰撞检测



5)得分统计

道理也很简单,每检测到一个发生了碰撞检测,得分score变量就进行累加

var spanArray=document.getElementById("score").getElementsByTagName("span"); //ByTagName获取的是一组元素

var score=parseInt(spanArray[0].innerHTML); //元素必须转化为int型的分数

之后检测到碰撞之后就是:

score+=100;

spanArray[0].innerHTML=score;



6)得分物体随机生成(自己想出来的小功能)

一次碰撞之后,得分物体(草莓消失),在游戏区域的任意位置再次生成,所以这里的主要思路就是像获得mario的位置那样,获得草莓的位置,统计完得分后,生成随机数,重新改变草莓的位置。就可以实现。

//随机初始化草莓的位置

caomei.style.left=(Math.floor(Math.random()*42+1))*20+"px";

caomei.style.top=(Math.floor(Math.random()*17+1))*20+"px";

用到了random和floor函数,这里的参数是根据游戏区域大小,还有每次移动的步长而设置的。

接下来就放我的整体实现效果图了


最终效果图


完整的代码,请移步至我的github中去查看https://github.com/mermaidgaogao/EasyMario.git

写完了第一篇博文,内心还有点小激动,多多指教,哈哈!永远on the way

You don't have to be afraid of what you are......

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容