想用HTML5开发2D网页游戏,用什么游戏引擎最好

想用HTML5开发2D网页游戏,用什么游戏引擎最好,第1张

1.Impact :支持桌面环境和移动端,支持所有主流浏览器: FIrefox, Chrome,, Safari, Opera 和 IE 。

2.Craftjs 是另外一个完美的游戏引擎,提供一个开发杰出游戏的接口,并且跨浏览器兼容。

3.playcraft 引擎提供给开发者许多工具集,帮助开发各种类型的游戏,这些工具集非常强大,可以让开发者自由发挥自己的各种想法,并且可以很容易转换到其他的平台,比如 Facebook,旧版的网站,原生 Android 和 iOS 应用等等。

4.Jaws 是个 HTML5 驱动的 2D 游戏库,刚开发的时候只能用来制作 canvas,现在支持通过同样的 API 来制作普通基于 DOM 的 sprites。支持的浏览器:Chrome 9+, Firefox 3.6+, Safari 5+ &IE9。

5.Enchant.js 是个简单的 JavaScript 框架,可以使用 HTML5 和 JavaScript 来开发简单的游戏和应用。现在还是由 UEI 的 Akihabara 研究中心来开发和维护。

近些年,国内的网络发展速度还是很快的,大家可以通过网络了解很多的东西,因此网络上也有很多热词开始流行起来,其中flag算是十分流行的一个词汇,网上老说的flag是什么意思?立个flag是什么梗?可能还有一些朋友并不是很了解,在网络上,不少网友都会在把flag这个词语组成立flag,特别是在一些电视剧以及动漫的d幕中,立flag这个词语十分的常见。下面就来简单介绍一下网上老说的flag是什么意思。

其实flag这个词语的中文含义是“旗帜”的意思,也是编程代码里面经常会用到的一个词语,在编程代码里面主要指的是某一件事情的判定依据。也就是说flag指的是确定一件事情的结局的关键内容,是这个结局比较直接的相关事情,立flag也就是触发了关键事情的意思。

后来flag这个词语也经常的出现在很多的动漫里面,开始慢慢的发展成为了网络用语,在网络上面一般表示的都是不详信号的意思。比如说自己在某件事情里面说了很坚定的话,或者是做了很坚定的决定,但是最终的结果往往是相反的,也可以理解为是乌鸦嘴的意思。

立个flag这个梗也是现在很多人会经常使用的语言,也是flag这个词语发展而来的。简单的来解释,其实就是一个人说了一些话或者是做了一些事情,但是最终的结果是被自己做的事情打脸。那么在结局之前说的相反的关键话或者是做的关键事情就叫做flag,其实也就是为结局做的完全相反的铺垫。

举一些例子说明一下在电视剧里面flag的常用手法,比如说在打仗之前给自己的女朋友打电话说等他打仗完回去就娶她,那么一般这个人的结局多半都是死亡。比如说在我回来之前站在原地,一定不要乱走,那么一般来说留下的人都是会乱走的,这些话就被称为是立flag。现在flag的使用还是有几种含义的,比如说用来表示伏笔的意思,表示剧情里面的一些伏笔让人可以猜测到之后的发展。还有就是乌鸦嘴的意思,一般都是和相反的不好的结果相呼应的行为,也被称为是死亡flag和失败flag。还有一种含义就是确定自己的目标,别人认为一定会失败的调侃。

以上就是有关网上老说的flag是什么意思的简单介绍,Flag这个词语在网络上面的含义其实是比较的多元化的,但是比较常用的还是类似于乌鸦嘴的含义,或者是自己说过的话做过的事与结果完全不同,被自己打脸的一种形容。

创建画布

// 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()

总算完成了,这是本游戏最后一段代码了。先是设置一个初始的时间变量then用于首先运行main函数使用。然后调用 reset 函数来开始新一轮游戏(如果你还记得的话,这个函数的作用是将英雄放到画面中间同时将怪物放到随机的地方以方便英雄去捉它)。

到此,相信你已经掌握了开发一个简单H5小游戏需要的基本功了。玩玩这个游戏或者下载代码自己研究研究吧 :)

Feel free to repost but keep the link to this page please!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7283706.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存