必威体育Betway必威体育官网
当前位置:首页 > IT技术

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

时间:2019-06-30 17:41:07来源:IT技术作者:seo实验室小编阅读:85次「手机版」
 

马里奥小游戏

写在前面:

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

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

功能需求分析

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

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

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

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


页面初步布局:

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

控制中心初步效果

设置游戏区域p,命名为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......

相关阅读

人名中间的小圆点的实现方式

第一种,使用特殊字符 • 第二种,使用CSS + 圆点 .gap-point { display: inline-block; padding: 0 1px; font

(超详细、适合新手)QQ三国实现24小时挂机摆摊卡键喊话

QQ三国原创作者——贴吧ID:杜康技术总监℃ 说明:12到24周岁,没错就是12周岁到24周岁的,现在只要10元一个月就可以24小时挂机,因为阿里

快速排序(来自:算法:C语言实现)

快速排序算法是一种分治排序算法.它将数组划分为两个部分,然后分别对两个部分进行排序.我们将看到,划分的准确位置取决于输入数组

Lazy Load的实现

前言 在对前端性能优化实践的时候,图片的获取是需要http请求的。如果我们在首屏加载的时候,就将所有的图片请求回来,这样会很费性能

MPU6050的Arduino实现

Arduino有多种通信方式,每一种通信方式都有相对应的类库来支持: 1)硬件串口通信——HardwareSerial 类库 2)软件模拟串口通信——Soft

分享到:

栏目导航

推荐阅读

热门阅读