写在前面:

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

这个小案例是韩顺平的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......

Javascript实现简单的超级马里奥小游戏相关推荐

  1. Java开发的超级马里奥小游戏410 相对简单 功能非常齐全 完整源码

    今天为大家继续分享泡泡堂小游戏的开发与制作 410,目前系统已经完成了初步功能,后续会进一步完善.整个系统界面漂亮,有完整得源码,希望大家可以喜欢.喜欢的帮忙点赞和关注.一起编程.一起进步!! 开发环 ...

  2. Cocos creator(JavaScript)- 简单实现连线小游戏

    步骤 效果 实现思路 效果 实现思路 * 游戏结束标志:所有灯被点亮,即所有灯均连接到电源.* * 第一步: 创建好整个棋盘(叫着比较方便,懒得起名字了)中的数据;* 第二步: 清空已通线路,查找所有 ...

  3. unity超级马里奥2d游戏开发课程-01课程介绍

    大家好,我是小兵,今天给大家带来Unity开发超级马里奥2d游戏的第1课,课程介绍,你可以在我的个人博客geekape.net上找到完整的课程. 我之前主要是做前端开发工作的,并不是做游戏开发的,但由 ...

  4. 编程猜单词游戏python_Python实现简单的猜单词小游戏

    本文实例为大家分享了Python实现猜单词小游戏的具体代码,供大家参考,具体内容如下 思路 1.一个words列表里存放若干的单词,例如:["extends", "pri ...

  5. java代码实现打气球游戏_关于javascript和css3开发打气球小游戏的完整代码

    这篇文章主要介绍了关于javascript和css3开发打气球小游戏的完整代码,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 这是一个简单但是印象深刻的小游戏,打气球小游戏的实现代码, ...

  6. Javascript开发的金山打字简易小游戏

    记得以前读书的时候,由于课前都预习过了,所以听课一般都是为了给老师面子很"耐心"的坐在教室里,发着呆走着神.突然,那天上课讲了几天前预习的课题,采用JS可以识别键盘输入,嘿嘿,好玩 ...

  7. Py之tkinter:python最简单的猜字小游戏带你进入python的GUI世界

    Py之tkinter:python最简单的猜字小游戏带你进入python的GUI世界 目录 输出结果 设计思路 输出结果 设计思路 from tkinter import * import tkint ...

  8. 写一个简单的实时互动小游戏

    在写之前,我们先回顾上一篇文章,从需求.架构.设计.开发上讲述并演示了搭建一个实时通信客户端的过程,并附了图片与视频. 写这篇文章的之前,第一个互动的游戏DEMO已经写好了,先附上截图 很奇怪的一张图 ...

  9. STM32+LCD实现简单的贪吃蛇小游戏

    寒假放假回家,只能宅在家里,无聊之余,幸好带了一块开发板回来,以前做项目都是在网上找相似或者有关联的项目,把别人的代码拿过来,修改修改,拼拼凑凑出自己项目,既然无聊就自己动脑筋思考,自己动手写贪吃蛇的 ...

  10. 【Verilog】马里奥小游戏的FPGA实现

    经典马里奥小游戏的FPGA实现 新年好!祝各位朋友新年快乐!!健康平安!!! 代码有部分删减,不影响理解. 演示视频. 具体过程: 按下十字按键的中央按键开始游戏. 碰到柱子边界游戏结束. 累计平安通 ...

最新文章

  1. mysql最高权限超级用户是_MySQL中,预设的、拥有最高权限超级用户的用户名为( )...
  2. 从文本分类来看图卷积神经网络
  3. 通用权限实现的核心设计思想
  4. python列表生成多个号码_python遍历多个列表生成列表或字典
  5. react路由守卫+重定向_React + Apollo:如何在重新查询后进行重定向
  6. 9 个小技巧让你的 if else 看起来更优雅!
  7. DockOne微信分享(七十七):用Harbor实现容器镜像仓库的管理和运维
  8. AAAI 2019 使用循环条件注意力结构探索回答立场检测任务
  9. ps-将斜拍的图片扶正
  10. ubuntu 安装mono Fiddler后The proxy server is refusing connections
  11. Amesim学习——气体混合室仿真
  12. java要学多久_学会JAVA需要多长时间?
  13. 【Watery DP】[Dota1002]光之守卫(Gandolf)
  14. editormd显示后台html,yaboxxx. -yaboxxx.V0.8.82
  15. 查询微信被谁投诉举报方法
  16. 地图制图基础(三):地图制作要求
  17. CyberSecurity Knowledge Base笔记
  18. spring 的 applicationcontext.xml
  19. 计算机系统实验三——buflab(缓冲区实验)
  20. PiXYZ Studio教程

热门文章

  1. PVC地板IMO船舶防火测试认证注意事项
  2. 学excel还是学python_以Excel处理为目的学习python还是VBA?
  3. 金蝶服务器换了无线网怎么办,搬家后wifi怎么重新设置?
  4. php strict,PHP 5.4中的E_STRICT和E_ALL有什么区别?
  5. 群体智能与进化计算_群智能计算简介
  6. seo技巧,seo技巧搜行者SEO
  7. 一个创业失败案例的复盘
  8. python英语单词 扇贝英语安卓下载_扇贝单词英语版手机版|扇贝单词英语版安卓版下载 v3.6.402 - 跑跑车安卓网...
  9. python画聚类树状图_聚类分析python画树状图--Plotly(dendrogram)用法解析
  10. 【Python 多进制转换】——数值多进制转换bin、oct、int、hex(2进制、4进制、8进制、10进制、16进制、32进制)