方法一、,速度完成与H5类似iOS 版本的APP,然后至少还需要招聘一名iOS开发人员,以解决iOS版本的更新迭代。(工作量和成本都很高)
方法二、针对AppStore进行包装。将HTML5应用用phonograph打包,取消HTML5中的d簧效果等,让其看起来更像是一个原生应用。(适合刚开始进行HTML5开发人员,用phonegrap开发然后打包)
方法三、针对AppStore的规则,隐藏webview,在审核期间,展示APP的外壳,以供AppStore审核用。在审核通过后,可以通过后台,对其布局进行配置。这个时候,用户后打开的就是你在后台配置的布局了。。。
如果使用第三种,要注意几个地方。
1、APP审核期间要保证你的后台布局是为了给AppStore审核人员看的布局。
2、APP审核通过之后,其实也是有几率会被发现及下架的,做好最坏的打算。
3、试用与应急或者对APP体验要求不高的应用,一般服务类APP。
微信公众平台上做HTML5游戏,基本的有三个法子。1 阅读原文中添加链接。但,如果这样坐引导的文章一定要做好来,不然转换率会很低的。千万要走心一点,不要平白无故的就放在阅读原文,谁看?反正俺是不会看的。
2 图片的形式,在图片中添加入h5的二维码。别人只要长按就可识别二维码跳转到你的h5去,什么图片你随意,例如植入到节日的场景啊、各种动漫图片均可。同样要做好引导,才能引发转化。
3 最直接的形式,你们大部分可能都实现不了,以前公众号有一种功能可以开通,叫直接跳转,也就是只要点击标题就可以直接看到h5,但据我所知现在这个功能申请不了,也就是大多数人都实现不了,原来申请通过的才可以。
另外需要了解HTML5用什么软件制作的,一般的有maka、易企秀、兔展。
选择毋庸赘述,可以都尝试一下,都是较为简单上手的,如果你觉得逼格不够,可以用互动大师。用这些软件如果自己有一定的设计能力做出简易的h5页面基本是没有问题啦。
但如果是很复杂炫技的h5,一些是可以在前面提及的平台的模板处购买,一些是找第三方公司做的。
制作的小贴士:
1 不要用原生字体、真的好hi丑,自己选好看的字体然后做成png格式,然后放进去。
2 如果你有设计能力,最好把图层分开放进去,才能设置每个不同的动态动画。也就是不要做整张图放进去,其实一页可能是好几张图甚至十来张图。
3 如果你自己没有设计能力,那还是在平台上找模板吧。。。然后配合自己的文案。尤其是节日类的h5,模板一搜一大堆,但即便是用模板,也请走走心,不要全特么照搬过来一句话不改。
4 如果不会用ps,去练习用美图秀秀,基础效果基本没多大问题。
5 如果你连png都不会做,艺术字体在线生成器 艺术字转换器 这个神器送给你,大把字体你挑。
6 如何插入报名表 免费制作报名网页 报名表设置后可在后台查看以及下载excel模式。
7 文字尽量少而美,没人愿意看你长篇大论,尤其是h5.
8 文字太多、页面太复杂要注意,很可能造成打开的时候回很卡。
创建画布// 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!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)