说在前面
游戏可以说是面对用户群最广泛最复杂的一类软件
各个年龄层、不同文化层用户,都是要兼顾的对象
其中,小游戏更是如此
小游戏一个特点是一定得普罗大众,老少皆宜
**“进来都是客,点了广告再走”**已经成为小游戏设计的基本原则
这里有两层意思
一个是“客”,游戏一进来让用户感觉舒服
第二是“点广告”,绝大多数小游戏的唯一收入来源
但要把这两点都兼顾到极致是不可能的
两者天然排斥,顾此失彼
这就要求游戏设计者对这两个点拿捏精准
而这拿捏的过程,也是一个改来改去的过程
这也必然要求代码一定得 经得住折腾
笔者一直从事传统软件行业,折腾小游戏半年多了
虽然在做小游戏之前,已经好多年不写代码
但我寻思,可以把之前的一些经验和思路应用到小游戏开发当中
在这快一年开发过程中,积累的一些经验想与各位分享,与大家一起探讨
我会在后面的文章中逐一分享这些经验
其实这些经验也收录到我们的基础框架gmoon中:
https://gitee.com/facemap/gmoon
首先要说明的是,这系列文章不是讨论游戏怎么实现
这不是文章要讨论的重点
它侧重于讨论游戏怎么高效灵活的支撑运营的方法。
这第一期,我想与大伙分享一下其中的一个小技巧:route的用法
【本人现在正研究和试探一些小游戏的高效开发和运营的方法
欢迎加个微信交个盆友wx:huline】
route的妙用
gmoon.js中做了一个类叫route
游戏中各个功能组件之间的跳来跳去,给程序员带来很大挑战
特别是如果要支持组件之间状态的互动跳转,那就更加复杂和不可控
不仅如此还经常面临需求变化,改来改去。
为了能加入适应后期的变化,有时会加入各种控制变量来以确保之前的逻辑正常跑通
到后来基本改的面目全非
route就是用来对这种组件和功能方法之间跳转的集中有效的管理,更重要的是,它还可轻松做到配置化
它是对程序执行流的有效和直观的管理
吃个栗子:
我们以游戏关卡结束时游戏执行的逻辑为例
前期上线时,我们游戏上线可能是这样,逻辑还算清晰相对简单:
假设我们把相关的方法都绑定到game脚本上。
1、触发关卡结束流程 game.filish
2、判断是否闯关成功 game.checkPlay
3、如果成功,显示成功信息 game.showSuccess
4、如果失败,显示失败提示 game.showFail
5、进入关卡选择页继续游戏 game.gotoLevelPage
game.filish()
.then(()=>{
return game.checkPlay()
})
.then(( suc )=>{
if(suc){
return game.showSuccess()
}else{
return game.showFail()
}
})
.then(()=>{
return game.gotoLevelPage()
})
这是理想状态,每个方法规划不错,写的尽量与其他方法解耦
在实际项目中可能会把两个或几个方法的功能结合到一个方法中实现
但为了适应后期的逻辑变化,那种高耦合的编码方式是不可取的
而这也是使用route的前提要求。
使用route实现如下:
let $ = require("gmoon")
let r = new $.Route();
r.route("game.filish")
.route("game.checkPlay")
.if( true , "game.showSuccess")
.endif()
.if( false , "game.showFail")
.endif()
.route("game,gotoLevelPage")
.reday();
r.go( callback )
后面这个逻辑可能会发生一些变化。
简单的变化:如果关卡结束时,我想插入一个插屏广告
let $ = require("gmoon")
let r = new $.Route();
r.route("game.filish")
.route("game.checkPlay")
.if(true)
.route("[wxSDK].showAd" , "Interstitial")
.route("game.showSuccess")
.endif()
.if(false)
.route("game.showFail")
.endif()
.route("game,gotoLevelPage")
.reday();
r.go( callback )
在关卡结束时,询问用户是否一键复活
let $ = require("gmoon")
let r = new $.Route();
r.route("game.filish")
.route("game.checkPlay")
.if(true)
.route("[wxSDK].showAd" , "Interstitial")
.route("game.showSuccess")
.endif()
.if(false)
.route("game.askRepeat")
.if(true)
.route("game.repeat")
.stop()
.endif()
.if(false ,"game.showFail")
.endif()
.route("game,gotoLevelPage")
.reday();
r.go( callback )
大家可以通过这个简单介绍,了解到route的一些基本用法
它能很好的支持用户对执行逻辑的非常直观的修改,给代码维护带来极大方便
更重要的一点是用route来做的路由,可轻松做到配置化
以以上代码为例,其实只要给route传入一个配置信息,就能跑起来:
r.readConf([
["route" , "game.filish"],
["route" , "game.checkPlay"],
["if" , true ]
["route" , "[wxSDK].showAd" , "Interstitial"],
["endif"]
......
......
]).ready().go();
这个配置化的数组,完全可用通过从服务器中读取json,来控制路由的执行。
总结一下使用route的几点不得不提的好处:
1、促使在开发过程中,以最低耦合度的方式开发功能方法。提高代码可维护度
2、非常清晰完成执行逻辑的定制和修改。
3、可非常轻松的实现执行逻辑的配置化
4、功能模块高可复用
当然,gmoon对route也是集中化管理的
gmoon中实现了一个route的管理类,它同时负责route的配置更新。
let $ = require("gmoon");
let r = new $.Route();
r.readConf([....]).ready();
$().appendRoute( "level-filish" , r );
这时,你可以在系统任何地方使用这个route
let $ = require("gmoon");
$("route.level-filish");
或者你觉得不够直观,也可以这样些:
$("route").do("level-filish");
或者要更新一下再执行
$("rotue").upgrade("level-filish").do("level-filish");
route只是gmoon提供的一个比较有代表性的方法。
还有更多好用的工具加入了gmoon中,比如对资源的管理、配置的管理,功能模块的管理,动画的管理
特别是通过gmoon开发的一些功能模块,可轻松实现跨项目复用
有兴趣的童鞋来这里: https://gitee.com/facemap/gmoon ,项目还在不断完善中,欢迎拍砖或建议

