第一次写技术性博文,以前都只是写一些生活感想,记录一些生活发生的事情。

  博主大三学生一枚,目前学习JS一年多,还处于学习阶段,有什么说的不好的希望大牛指点下,由于第一次写博文,排版什么的有待改进,希望大家谅解。

  这是我学习H5 canvas以来写的第一个游戏,第一次接触H5游戏呢,是看了一位大哥码农终结者的博客(http://www.cnblogs.com/chaogex/)(基础要求有点高,等以后一定要研究透彻),正好实验室老师准备喊我写H5的游戏游戏,看了很多canvas的API和大神vajoy(http://www.cnblogs.com/vajoy/)写的canvas教程,打好canvas的基础以后又看了HTML5研究小组第二期技术讲座《手把手制作HTML5游戏》的视频,下了源代码学习了很长一段时间,那段时间一直反反复复的写这个游戏,慢慢领悟很多游戏的概念,然后就有种成竹在胸的感觉(别逗了,我还什么都不懂),当然这种成就感是非常重要的,动力来源于此。这就是我游戏开发到现在将近3个星期的学习经历,分享给大家,希望对大家有用。

        

游戏做出来是这个效果,玩过黑白钢琴的人应该知道,这和那个游戏差不多。

一。图片渲染

  写过游戏的人都知道大多数游戏都是以背景加精灵的方式开展的,这里渲染图片是经常要用的,本人自己封装了一个图片渲染的方法,希望大家给点意见。

  

/*** author yh* @param imgCount 图片数组 必须有id和src* @param callback 回调函数* @returns 每个精灵的canvas和context*/
function getImg(imgCount,callback){var total = imgCount.length,load = 0,img = {},w = 0,h = 0;for(var i = 0;i < total;i++){var id = imgCount[i].id;var imgs = new Image();imgs.src = imgCount[i].src;//设置canvas的width和heightif(imgCount[i].width && imgCount[i].height){w = imgCount[i].width;h = imgCount[i].height;}else{w = imgs.width;h = imgs.height;}img["cvs"+id] = document.createElement("canvas");img["cvs"+id].width = w;img["cvs"+id].height = h;img["ct"+id] = img["cvs"+id].getContext("2d");img["ct"+id].drawImage(imgs,0,0,imgs.width,imgs.height,0,0,w,h);imgs.onload = function(){load++;       delete imgs;       imgs = undefined;};};if(typeof callback == "function"){var me = this;function check(){if(load >= total)callback.call(me,arguments);elsesetTimeout(check,300);}check();};return img;
}

因为考虑到性能的问题,所以每次加载一个图片都创建一个canvas来画这张图片,当然我们并不需要显示这个canvas,只为以后每次画图的时候可以直接用getImageData和putImageData方法来直接取canvas中的data就可以得到图片,而不用每次都去画图,等下会为大家展示画图的过程,这个方法的调用是这样的:

var global = getImg([{id:"bg",src:"img/bg.png",width:game.width,height:game.height},{id:"over",src:"img/over.jpg",width:game.width,height:game.height},{id:"di1",src:"img/1.png",width:w-20,height:h-20},{id:"di2",src:"img/2.png",width:w-20,height:h-20},{id:"di3",src:"img/3.png",width:w-20,height:h-20},{id:"di4",src:"img/4.png",width:w-20,height:h-20},{id:"di5",src:"img/5.png",width:w-20,height:h-20},{id:"di6",src:"img/6.png",width:w-20,height:h-20},{id:"di7",src:"img/7.png",width:w-20,height:h-20},{id:"di8",src:"img/8.png",width:w-20,height:h-20},{id:"di9",src:"img/9.png",width:w-20,height:h-20},{id:"hand",src:"img/hand.png",width:w-20,height:h-20},],callback);

定义一个变量来存取getImg的返回对象,下面是画图的方法:

/*** 根据id来获取global中的canvas和context,进行get和put ImageDa* target放所有canvas的对象,上面的global * context为目标画布的上下文* x y 为初始坐标* id 为精灵的id*/
function draw(target,context,x,y,id){var canvas = target["cvs" + id],ct = target["ct" + id],data = ct.getImageData(0,0,canvas.width,canvas.height);context.putImageData(data,x,y);
}

这个方法封装得不是很好,因为很多时候呢我们都需要精灵的动画,就是要随时改变截取图片的x和y,这里封装的只是这个游戏中用到的方法,因为这个游戏中无精灵动画。

二。游戏类

  当图片渲染完以后呢我们需要定义一个game类,在这里写代码,为了提高性能,用的原型方法,这样每次加载JS文件的时候只加载一份,不浪费资源。

因为本人没有github(还没用过这么高端的东西),只能在这里贴代码了。

function Game(option){//对象扩展for(var attr in option)this[attr]  = option[attr];
}
Game.prototype = {canvas:null,ct:null,width:999,height:999,x:0,y:0,n:4,m:6,FPS:30,sleep:0,arr:[],dinoArr:[],click:0,init : function(){this.canvas = document.createElement("canvas");this.canvas.width = this.width;this.canvas.height = this.height;document.body.appendChild(this.canvas);this.ct = this.canvas.getContext("2d");this.sleep = (1000/this.FPS)|0;this.time = Date.now();this.moused = false;},update:function(){this.initDraw();this.move();},initDraw : function(){this.drawImg(global,this.ct,0,0,"bg");var y = 0;for(var i = 0;i<this.m;i++){var x = 0;var ran = ((Math.random()*4)|0);for(var j = 0;j<this.n;j++){this.ct.fillStyle = "#fff";this.ct.fillRect(x,y,97,97);if(j == ran && i != this.m-1){this.drawImg(global,this.ct,x+10,y+10,"hand");this.arr.push(j);}else if(j == ran && i == this.m-1){this.drawImg(global,this.ct,x+10,y+10,"di6");}x += 100;}y += 100;}this.listener(this.arr);},drawImg : function(target,context,x,y,id){var canvas = target["cvs" + id];var    ctx = target["ct" + id];var data = ctx.getImageData(0,0,canvas.width,canvas.height);context.putImageData(data,x,y);}
}

上面这些代码呢完成了初始化,我们先把每个效果实现以后再进行动画,下面我们会设置鼠标事件,还有主循环,这是个很重要的东西,一般一个游戏只有一个主循环。

listener : function(arr,reloadImg){this.arr = arr;//获取边界var me = this,index = this.arr.pop();this.dinoArr.push(index);this.reloadImg = reloadImg;if(this.reloadImg){console.log(this.dinoArr)var dinoIndex = this.dinoArr.shift();this.y = 500 + 10;this.x = dinoIndex*100 + 10;}var targetX = index*100 + 50,targetY = 450;//添加鼠标事件,判断范围this.canvas.onmouseup = function(event){var    cx =  event.clientX - me.canvas.offsetLeft - targetX,cy = event.clientY - me.canvas.offsetTop - targetY;if(-50<=cx&& cx <= 50 && -50<= cy && cy<= 50){me.moused = true;}};},move : function(){var me = this;this.mainLoop = setInterval(function(){me.loop();},this.sleep);},loop : function(){var time = document.getElementById("time");Time = (Date.now() - this.time)/1000;time.innerHTML = Time;document.getElementById("grade").innerHTML = this.click;if(this.moused){this.moused = false;this.click++;this.reload();}if(Time >= 20){this.drawImg(global,this.ct,0,0,"over");clearInterval();alert("你一共抓了"+this.click+"只恐龙");}},reload:function(){var data = this.ct.getImageData(0,0,this.width,this.height);this.ct.clearRect(0,0,this.width,this.height);this.reDraw();this.ct.putImageData(data,0,100);this.reDino();},reDino:function(){var random = (Math.random()*9+1)|0,id = null;switch(random){case 1:id = "di1";break;case 2:id = "di2";break;case 3:id = "di3";break;case 4:id = "di4";break;case 5:id = "di5";break;case 6:id = "di6";break;case 7:id = "di7";break;case 8:id = "di8";break;case 9:id = "di9";break;}this.drawImg(global,this.ct,this.x,this.y,id);},reDraw:function(){this.drawImg(global,this.ct,0,0,"bg");var y = 0;var x = 0;var ran = ((Math.random()*4)|0);for(var j = 0;j<this.n;j++){this.ct.fillStyle = "#fff";this.ct.fillRect(x,y,97,97);if(j == ran){this.drawImg(global,this.ct,x+10,y+10,"hand");this.arr.unshift(j);}x += 100;}this.reloadImg = true;this.listener(this.arr,this.reloadImg);}

每次点击以后我们会得到一份当前context的getImageData,然后设置为putImageData(data,0,100),然后在第一行重新渲染一次,再把数组中的值更新,这样就可以看起来是个动画。比较水平有限,大牛看看就当玩玩,如果水平和我差不多的话可以学习下,以后我们也能成为大牛,也会分享更多更好的东西。

  最近呢还在研究司徒正美的《JS框架设计》,这本书给我第一感觉就是思想高度太高,第一次看就把我看郁闷了,看了第一章什么都没看懂,然后我又从头到尾依次把不懂得新概念百度了一遍,历经2天终于把第一章搞完,慢慢的越来越喜欢这本书,写了一个自己框架的种子模块,打算等自己的框架出来以后再去找工作,到时候应该会更轻松一些。

转载于:https://www.cnblogs.com/xiaohaoxuezhang/p/4219020.html

H5游戏开发之抓住小恐龙相关推荐

  1. H5游戏开发包括哪些游戏类型

    H5在微信还没有诞生的时候,就已经在各大手机应用方面展露头角.最早的H5小游戏,例如4399公司开发的,开始了新一轮的热潮.随着微信的推出,很多H5游戏开始嵌入到微信公众号.微信群.朋友圈. H5因其 ...

  2. 极光会客厅:大型H5游戏如何登陆微信小游戏及游戏性能优化分享

    上周末,由极光网络主办的首期"极光会客厅"正式开门迎客.在本次的"2D小游戏开发实战技术沙龙"上,极光网络客户端主程陈策以及极光网络项目总监陈源向一众与会者分享 ...

  3. H5游戏开发:决胜三分球

    前言 本次是与腾讯手机充值合作推出的活动,用户通过氪金充值话费或者分享来获得更多的投篮机会,根据最终的进球数排名来发放奖品. 用户可以通过滑动拉出一条辅助线,根据辅助线长度和角度的不同将球投出,由于本 ...

  4. H5游戏开发:一笔画

    一笔画是图论科普中一个著名的问题,它起源于柯尼斯堡七桥问题科普.数学家欧拉在他1736年发表的论文<柯尼斯堡的七桥>中不仅解决了七桥问题,也提出了一笔画定理,顺带解决了一笔画问题.用图论的 ...

  5. 移动端h5游戏开发中的动画和动效展示

    在移动端h5游戏开发中,经常会遇到动画和动效的展现需求,比较常用的实现方法有css3.svg.定时器等,针对不同的场景和需求使用不同的技术,可以提升设计和开发的效率,保证产品的效果和质量,也能让用户有 ...

  6. H5游戏开发之扫雷-李强强-专题视频课程

    H5游戏开发之扫雷-119人已学习 课程介绍         <扫雷>是一款大众类的益智小游戏,于1992年发行.游戏目标是在短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷 ...

  7. 微信H5游戏开发需要注意什么?

    微信H5游戏开发需要注意什么? 如果一些企业要做H5游戏开发的话,首先要明确思考H5开发的内容和推广方式,同时开发时也要注意一些技术问题.七猫网络小编在这总结一下开发H5游戏时需要注意的几个问题的要点 ...

  8. 微信H5游戏开发的发展与现状

    2021年,随着诸多企业和品牌借助H5游戏营销一次次赚的盆满钵满,尚未布局的商家们除了羡慕,还依旧抱着观望,不敢尝试的想法.经过与此类商家的深入交流,不难发现此类商家疑虑的是H5游戏本身的特性,TOM ...

  9. H5游戏开发:推金币

    近期参与开发的一款「京东11.11推金币赢现金」(已下线)小游戏一经发布上线就在朋友圈引起大量传播.看到大家玩得不亦乐乎,同时也引发不少网友激烈讨论,有的说很带劲,有的大呼被套路被耍猴(无奈脸),这都 ...

最新文章

  1. 《重构-改善既有代码设计》读书笔记-重构篇
  2. numpy 排序, 查询功能
  3. 新世纪英汉词典 | 今日最佳
  4. Linux内核调试原理和工具介绍--理解静态插装/动态插装、tracepoint、ftrace、kprobe、SystemTap、Perf、eBPF
  5. 将一个存放了若干个对象的数组按照对象的某个属性值进行分组
  6. JMeter安装详细教程
  7. 2020秋招华为笔试题-买钉子
  8. Python 的切片语法为什么不会出现索引越界呢?
  9. 计量经济学及Stata应用 陈强 第七章异方差习题7.2
  10. 前后端分离架构设计(权限模型)
  11. 如何使用ERD设计关系数据库?
  12. R730服务器内存扩展安装
  13. netscape.exe_评论-Netscape 6.1
  14. linux 进程 cmd su,linux下常用管理命令
  15. 从创建服务器到搭建一台内网穿透服务器
  16. 端午送粽子祝福微信小程序源码下载支持打赏模式带背景音乐
  17. 【区块链】使用 Fabric 测试网络
  18. 万维网互联网计算机网络的区别,互联网、万维网、因特网之间有什么区别?
  19. 几个常用的免费高清无版权图片网站
  20. 信号与电源完整性分析(一)提高信号质量

热门文章

  1. bootstrap-loader使用过程中遇到的几个坑爹问题
  2. C++ 泛型编程/模板 泛函编程/Lambda/λ演算
  3. shell脚本函数声明,调用
  4. 同城老乡互帮互助附近人脉抱怨取暖小程序开发
  5. 量化投资学习-18:切换思考问题的立场与视角,与庄家共赢共舞,是散户真正转变的开始
  6. BP算法实例—鸢尾花的分类(Python)
  7. C语言 const详解
  8. python自动化下载_selenium+python自动化--文件下载弹窗处理(PyKeyboard)
  9. 论文《Intelligent Computing: The Latest Advances, Challenges and Future》 思维导图-仅供参考
  10. 解决联想Y7000 双系统下的ubuntu16.04屏幕亮度无法调节的问题