1. 重庆云诚科技 > 数码百科 >

﹝html5网页游戏开发﹞HTML5 Canvas游戏开发实战

导读目前有哪些比较成熟的 HTML5 游戏引擎贡献用户名:【朝夕盼兮】 ,现在由重庆云诚科技小编为你详解与【html5网页游戏开发】的相关内容!最佳回答cocos2d 应该是IOS平台最火的游戏引擎...

本文中提到了2个关于html5网页游戏开发的相关看点,同时还对HTML5 Canvas游戏开发实战也有不同的看法,希望本文能为您找到想要的答案,记得关注哦!

目前有哪些比较成熟的 HTML5 游戏引擎

贡献用户名:【朝夕盼兮】 ,现在由重庆云诚科技小编为你详解与【html5网页游戏开发】的相关内容!

最佳回答cocos2d 应该是IOS平台最火的游戏引擎之一,保险起见加个『之一』总是没有错了哈。而cocos2d-js则是官方新推出不久的JS版本,之前还有个cocos2d-html5,也不知道为什么又推出cocos2d-js,有什么区别呢看还有c++版本之类的,万一你以后要改其它编程语言,还可以继续使用cocos2d。大公司,好像要上市,团队作品,文档很全。开发完可以转换成原生应用,打包之后你的游戏也就和html5没什么关系了,调用的都是高级接口,牛逼闪闪。egret 最近也火到不行,自从出了那个围住神经猫之后……虽是新团队,但也是企业级产品,据说团队都是来自各界精英,大部分是从Flash阵营转过来的。用的是typescript作为开发语言,而且和cocos2d-js一样 也可以转换成原生应用。生命力很旺盛,假以时日必成大器。还有跟腾讯X5浏览器合作,恐怕会是微信游戏开发不二之选。不过看过一些用egret开发的案例,感觉有点Low,也许是围住神经猫给人留下的第一印象吧。比起egret,Sirius2D 展示的一些案例,效果都杠杠的,但是对于他们团队的了解并不是很多,也没有像egret那样搞在线培训,我个人对这引擎还是挺有好感的,但就是不知道它明天会不会死,今天还一度打不开官网…… 拜托也努力一点好吗看lufylegend 应该是《HTML5 Canvas游戏开发实战》作者开发的,这个感觉倒是挺努力的,但是Canvas怎么拼得过WebGL。

以上就是重庆云诚科技小编解答(朝夕盼兮)解答关于“目前有哪些比较成熟的 HTML5 游戏引擎”的答案,接下来继续为你详解投稿用户(夕夏温存)解答“如何开发一个简单的HTML5 Canvas 小游戏”的一些相关解答,希望能解决你的问题!

如何开发一个简单的HTML5 Canvas 小游戏

贡献用户名:【夕夏温存】 ,现在由重庆云诚科技小编为你详解与【html5网页游戏开发】的相关内容!

最佳回答创建画布

// Create the canvas

var canvas = document.createElement("canvas");

var ctx = canvas.getContext("2d");

canvas.width = 512;

canvas.height = 480;

document.body.appendChild(canvas);

首先我们需要创建一张画布作为游戏的舞台。这里通过JS代码而不是直接在HTML里写一个<canvas>元素目的是要说明代码创建也是很方便的。有了画布后就可以获得它的上下文来进行绘图了。然后我们还设置了画布大小,最后将其添加到页面上。

准备图片

// 背景图片

var bgReady = false;

var bgImage = new Image();

bgImage.onload = function () {

bgReady = true;

};

bgImage.src = "images/background.png";

游戏嘛少不了图片的,所以我们先加载一些图片先。简便起见,这里仅创建简单的图片对象,而不是专门写一个类或者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[e.keyCode] = true;

}, false);

addEventListener("keyup", function (e) {

delete keysDown[e.keyCode];

}, false);

现在开始处理用户的输入(对初次接触游戏开发的前端同学来说,这部分开始可能就需要一些脑力了)。在前端开发中,一般是用户触发了点击事件然后才去

执行动画或发起异步请求之类的,但这里我们希望游戏的逻辑能够更加紧凑同时又要及时响应输入。所以我们就把用户的输入先保存下来而不是立即响应。

为此,我们用keysDown这个对象来保存用户按下的键值(keyCode),如果按下的键值在这个对象里,那么我们就做相应处理。

开始一轮游戏

// 当用户抓住一只怪物后开始新一轮游戏

var reset = function () {

hero.x = canvas.width / 2;

hero.y = canvas.height / 2;

// 将新的怪物随机放置到界面上

monster.x = 32 + (Math.random() * (canvas.width - 64));

monster.y = 32 + (Math.random() * (canvas.height - 64));

};

reset方法用于开始新一轮和游戏,在这个方法里我们将英雄放回画布中心同时将怪物放到一个随机的地方。

更新对象

// 更新游戏对象的属性

var update = function (modifier) {

if (38 in keysDown) { // 用户按的是↑

hero.y -= hero.speed * modifier;

}

if (40 in keysDown) { // 用户按的是↓

hero.y += hero.speed * modifier;

}

if (37 in keysDown) { // 用户按的是←

hero.x -= hero.speed * modifier;

}

if (39 in keysDown) { // 用户按的是→

hero.x += hero.speed * modifier;

}

// 英雄与怪物碰到了么?

if (

hero.x <= (monster.x + 32)

&& monster.x <= (hero.x + 32)

&& hero.y <= (monster.y + 32)

&& monster.y <= (hero.y + 32)

) {

++monstersCaught;

reset();

}

};

这就是游戏中用于更新画面的update函数,会被规律地重复调用。首先它负责检查用户当前按住的是中方向键,然后将英雄往相应方向移动。

有点费脑力的或许是这个传入的modifier 变量。你可以在main

方法里看到它的来源,但这里还是有必要详细解释一下。它是基于1开始且随时间变化的一个因子。例如1秒过去了,它的值就是1,英雄的将会乘以1,也就

是每秒移动256像素;如果半秒钟则它的值为0.5,英雄的就乘以0.5也就是说这半秒内英雄以正常一半的移动。理论上说因为这个update 方法被调用的非常快且频繁,所以modifier的值会很小,但有了这一因子后,不管我们的代码跑得快慢,都能够保证英雄的移动是恒定的。

现在英雄的移动已经是基于用户的输入了,接下来该检查移动过程中所触发的事件了,也就是英雄与怪物相遇。这就是本游戏的胜利点,monstersCaught +1然后重新开始新一轮。

渲染物体

// 画出所有物体

var render = function () {

if (bgReady) {

ctx.drawImage(bgImage, 0, 0);

}

if (heroReady) {

ctx.drawImage(heroImage, hero.x, hero.y);

}

if (monsterReady) {

ctx.drawImage(monsterImage, monster.x, monster.y);

}

// 计分

ctx.fillStyle = "rgb(250, 250, 250)";

ctx.font = "24px Helvetica";

ctx.textAlign = "left";

ctx.textBaseline = "top";

ctx.fillText("Monsterrs caught: " + monstersCaught, 32, 32);

};

之前的工作都是枯燥的,直到你把所有东西画出来之后。首先当然是把背景图画出来。然后如法炮制将英雄和怪物也画出来。这个过程中的顺序是有讲究的,因为后画的物体会覆盖之前的物体。

这之后我们改变了一下Canvas的绘图上下文的样式并调用fillText来绘制文字,也就是记分板那一部分。本游戏没有其他复杂的动画效果和打斗场面,绘制部分大功告成!

主循环函数

// 游戏主函数

var main = function () {

var now = Date.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 = w.requestAnimationFrame || w.webkitRequestAnimationFrame || w.msRequestAnimationFrame || w.mozRequestAnimationFrame;

如果你不是完全理解上面的代码也没关系,我只是觉得拿出来解释一下总是极好的

为了循环地调用main函数,本游戏之前用的是setInterval。但现今已经有了更好的方法那就是requestAnimationFrame。使用新方法就不得不考虑浏览器兼容性。上面的垫片就是出于这样的考虑,它是Paul Irish 博客原版的一个简化版本。

启动游戏!

// 少年,开始游戏吧!

var then = Date.now();

reset();

main();

关于[html5网页游戏开发]的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于html5网页游戏开发、HTML5 Canvas游戏开发实战的信息别忘了在本站进行查找喔。

推荐文章:

  • 管家婆一句赢钱料图
  • 两肖两码准
  • 今期香港挂挂牌生肖表
  • 小鱼儿特马站
  • 平心静气打一生肖数字
  • 马会传真2019特马
  • 管家婆三十码
  • 管家婆登陆官网
  • u7金牛版
  • 平特一尾什么意思
  • 本文由网上采集发布,不代表我们立场,转载联系作者并注明出处:https://www.cqycseo.com/kangadmin/makehtml_archives_action.php?endid=0&startid=-1&typeid=15&totalnum=6115&startdd=3120&pagesize=20&seltime=0&sstime=1679321406&stime=&etime=&uptype=&mkvalue=0&isremote=0&serviterm=

    联系我们

    在线咨询:点击这里给我发消息

    微信号:

    工作日:9:30-18:30,节假日休息