您好,利用epub360的各种功能组件可以轻松制作出H5小游戏,数据计分游戏、重力感应、碰撞检测、摇一摇等。
这个问题还真不好回答,H5小游戏,其实就是 html5 + css3 + javascript 等原生技术开发的小游戏。至于简不简单,那得看你的学习能力和理解能力了。html5+css3+javascript 是前端开发的基础技术,但是也是最重要的技术。入门比较容易,但是要精通还真的不简单。小游戏主要就是结合html5,使用canvas 和 css3的各种属性,然后结合 js来进行操作。学好这些技术,开发一个简单的小游戏并不难。
H5 小游戏开发很难,从开始的立项、执行、写代码,到后来的上线、测试、运营维护都需要很大的成本,小伙伴们的公司之前在年会时选择自己开发小游戏,可是后来成本太大,做到一半就停止了。后来就寻找各种小游戏定制平台,最终选择tomgame专业的团队来定制自己的H5小游戏,只管提出需求,其他的 都不用管,非常不错的。
虽然楼上有点打广告,但基本上说的比较全了。如果你懂一点技术还是借助第三方引擎开发吧,毕竟免费,而且比原生的省时省力很多。国内做H5游戏引擎基本也就那三家白鹭、Cocos、Laya。然后如果你想做一些后端联网的功能,也有比如Matchvs这种专门做这种功能的引擎。一句话总结:现在开发H5游戏门槛真的很低了。
canvas主要是用js在网页上绘制图形的,所以要想用canvas开发小游戏,就要先掌握好js。canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。对这些你都要有一定的了解,之后就相当于有了制作游戏的零件,接下来就是组装了。我研究过也见到过一些别人写的比较不错的用canvas做的小游戏,比如酷炫的倒计时,粒子,贪吃蛇,生成文字图案等等。给你个别人写的贪吃蛇小例子,在里边我又写了点localStorage:另外再给你个w3school的canvas的页面:
创建画布// Create the canvasvar canvas = ("canvas");var ctx = ("2d"); = 512; = 480;(canvas);首先我们需要创建一张画布作为游戏的舞台。这里通过JS代码而不是直接在HTML里写一个元素目的是要说明代码创建也是很方便的。有了画布后就可以获得它的上下文来进行绘图了。然后我们还设置了画布大小,最后将其添加到页面上。准备图片// 背景图片var bgReady = false;var bgImage = new Image(); = function () { bgReady = true;}; = "images/";游戏嘛少不了图片的,所以我们先加载一些图片先。简便起见,这里仅创建简单的图片对象,而不是专门写一个类或者Helper来做图片加载。bgReady这个变量用来标识图片是否已经加载完成从而可以放心地使用了,因为如果在图片加载未完成情况下进行绘制是会报错的。整个游戏中需要用到的三张图片:背景,英雄及怪物我们都用上面的方法来处理。游戏对象// 游戏对象var hero = { speed: 256, // 每秒移动的像素 x: 0, y: 0};var monster = { x: 0, y: 0};var monstersCaught = 0;现在定义一些对象将在后面用到。我们的英雄有一个speed属性用来控制他每秒移动多少像素。怪物游戏过程中不会移动,所以只有坐标属性就够了。monstersCaught则用来存储怪物被捉住的次数。处理用户的输入// 处理按键var keysDown = {};addEventListener("keydown", function (e) { keysDown[] = true;}, false);addEventListener("keyup", function (e) { delete keysDown[];}, false);现在开始处理用户的输入(对初次接触游戏开发的前端同学来说,这部分开始可能就需要一些脑力了)。在前端开发中,一般是用户触发了点击事件然后才去执行动画或发起异步请求之类的,但这里我们希望游戏的逻辑能够更加紧凑同时又要及时响应输入。所以我们就把用户的输入先保存下来而不是立即响应。为此,我们用keysDown这个对象来保存用户按下的键值(keyCode),如果按下的键值在这个对象里,那么我们就做相应处理。开始一轮游戏// 当用户抓住一只怪物后开始新一轮游戏var reset = function () { = / 2; = / 2; // 将新的怪物随机放置到界面上 = 32 + (() * ( - 64)); = 32 + (() * ( - 64));};reset方法用于开始新一轮和游戏,在这个方法里我们将英雄放回画布中心同时将怪物放到一个随机的地方。更新对象// 更新游戏对象的属性var update = function (modifier) { if (38 in keysDown) { // 用户按的是↑ -= * modifier; } if (40 in keysDown) { // 用户按的是↓ += * modifier; } if (37 in keysDown) { // 用户按的是← -= * modifier; } if (39 in keysDown) { // 用户按的是→ += * modifier; } // 英雄与怪物碰到了么? if ( <= ( + 32) && <= ( + 32) && <= ( + 32) && <= ( + 32) ) { ++monstersCaught; reset(); }};这就是游戏中用于更新画面的update函数,会被规律地重复调用。首先它负责检查用户当前按住的是中方向键,然后将英雄往相应方向移动。有点费脑力的或许是这个传入的modifier 变量。你可以在main 方法里看到它的来源,但这里还是有必要详细解释一下。它是基于1开始且随时间变化的一个因子。例如1秒过去了,它的值就是1,英雄的速度将会乘以1,也就是每秒移动256像素;如果半秒钟则它的值为,英雄的速度就乘以也就是说这半秒内英雄以正常速度一半的速度移动。理论上说因为这个update 方法被调用的非常快且频繁,所以modifier的值会很小,但有了这一因子后,不管我们的代码跑得快慢,都能够保证英雄的移动速度是恒定的。现在英雄的移动已经是基于用户的输入了,接下来该检查移动过程中所触发的事件了,也就是英雄与怪物相遇。这就是本游戏的胜利点,monstersCaught +1然后重新开始新一轮。渲染物体// 画出所有物体var render = function () { if (bgReady) { (bgImage, 0, 0); } if (heroReady) { (heroImage, , ); } if (monsterReady) { (monsterImage, , ); } // 计分 = "rgb(250, 250, 250)"; = "24px Helvetica"; = "left"; = "top"; ("Monsterrs caught: " + monstersCaught, 32, 32);};之前的工作都是枯燥的,直到你把所有东西画出来之后。首先当然是把背景图画出来。然后如法炮制将英雄和怪物也画出来。这个过程中的顺序是有讲究的,因为后画的物体会覆盖之前的物体。这之后我们改变了一下Canvas的绘图上下文的样式并调用fillText来绘制文字,也就是记分板那一部分。本游戏没有其他复杂的动画效果和打斗场面,绘制部分大功告成!主循环函数// 游戏主函数var main = function () { var now = (); var delta = now - then; update(delta / 1000); render(); then = now; // 立即调用主函数 requestAnimationFrame(main);};上面的主函数控制了整个游戏的流程。先是拿到当前的时间用来计算时间差(距离上次主函数被调用时过了多少毫秒)。得到modifier后除以1000(也就是1秒中的毫秒数)再传入update函数。最后调用render 函数并且将本次的时间保存下来。关于游戏中循环更新画面的讨论可参见「Onslaught! Arena Case Study」。关于循环的进一步解释// requestAnimationFrame 的浏览器兼容性处理var w = window;requestAnimationFrame = || || || ;如果你不是完全理解上面的代码也没关系,我只是觉得拿出来解释一下总是极好的为了循环地调用main函数,本游戏之前用的是setInterval。但现今已经有了更好的方法那就是requestAnimationFrame。使用新方法就不得不考虑浏览器兼容性。上面的垫片就是出于这样的考虑,它是Paul Irish 博客原版的一个简化版本。启动游戏!// 少年,开始游戏吧!var then = ();reset();main();总算完成了,这是本游戏最后一段代码了。先是设置一个初始的时间变量then用于首先运行main函数使用。然后调用 reset 函数来开始新一轮游戏(如果你还记得的话,这个函数的作用是将英雄放到画面中间同时将怪物放到随机的地方以方便英雄去捉它)。到此,相信你已经掌握了开发一个简单H5小游戏需要的基本功了。玩玩这个游戏或者下载代码自己研究研究吧 :)Feel free to repost but keep the link to this page please!
83 浏览 2 回答
307 浏览 4 回答
207 浏览 3 回答
235 浏览 4 回答
141 浏览 4 回答
223 浏览 5 回答
100 浏览 4 回答
272 浏览 3 回答
257 浏览 3 回答
262 浏览 3 回答
350 浏览 6 回答
258 浏览 6 回答
202 浏览 4 回答
196 浏览 6 回答
187 浏览 4 回答
228 浏览 3 回答
162 浏览 4 回答
221 浏览 3 回答
210 浏览 3 回答
202 浏览 9 回答
286 浏览 4 回答
147 浏览 5 回答
129 浏览 6 回答
122 浏览 2 回答
123 浏览 3 回答