【步兵 经验篇】one step

【步兵 经验篇】one step by EOS.

前段时间罗永浩我发布会上出了个,这么个东西,今天说的又更step有关,所以就引用一下。
话说没看过的,不如周末看看这个发布会,我觉得价值远比手机大,春晚都没这么好看,哈哈。

好了,进入正题,今天要说的其实还是和降低耦合有关系,大家可以借鉴。


关于场景

其实一开始我就不是很喜欢cocos中的Scene的存在,因为2d本来就相当一个平面,
是一层一层的layer叠加出来的,感觉有layer就够了,引入了Scene会让我感觉混淆。
比如一个战斗场景,就可以是 地图层、人物层、特效层、ui层 等 来组成的。

但是随着工作经验的增加,虽然我可以不用cocos的Scene,但是还是来抽象出一个Scene类,
用来做资源管理,游戏中各个阶段理好自己的部分,让程序更加清晰。

比如 我游戏中有分为常见的 登录阶段、主界面阶段、核心战斗阶段。
这三个部分 各有特点:
1、登录阶段:只是个过场,简单也好华丽也罢, 进入游戏后,基本很少回来。
2、主界面阶段:ui庞大,图片资源、ui特效、粒子特效 会占用大量的内存。
3、核心战斗阶段:人物、怪物、技能特效等 占地用大力内存。

最理想的情况应该是充分利用内存,进入游戏就加载好所有的资源,然后只进行隐藏和显示,那样玩家会的流畅无比。(ps:当然要加一些动画,来缓解疲劳=、= 比如加个1秒的加载界面~)
然而,事实上除了休想游戏,那个游戏没有加载界面呢? 好了,扯远了。

其实,已经很明显了,登录阶段,进入游戏后(进入主界面之前),所有的资源都应该删掉。
再就是主界面和战斗界面切换的时候也应该释放掉自己的那部分资源。

MainScene:init()
MainScene:onEnter()--在这加载
MainScene:onExit()--在这释放
MainScene:delete()

然后来回切换场景的时候并不释放(登录场景是否),也就是init()会调用一次,delete()一般不会调用,
除非重新初始化整个场景,比如切换用户,清一下数据。


说好的Step

不过这里的Step和Scene的做法实质上没什么区别,都是为了更加方便的掌控流程或者逻辑。
空口无凭,现举个例子,理解一下:

LoginScene.onEnter( LoginStep.Login ) //就走 登录-选角色-进游戏 流程
LoginScene.onEnter( LoginStep.SelectRole ) //就跳过登录的流程,比如返回角色

首先呢,从简单出发,SceneStep 控制场景中的不同切入点。这样的话,他可以是个枚举。
这种情况后者不够明了?展开一下:

function LoginScene:onEnter(step)
    if step then
        gotoStep(step)
    end
    //...
end

//界面登录
function LoginView:login()
    //...
    gotoStep(LoginStep.SelectRole)
end

简单情况下,这样就可以用step来通过枚举做一些,

if step == LoginStep.SelectRole then
    LoginScene:enterLoginStep()
    LoginScene:levelSelectRoleStep()
end

之类的处理,到这里本章就结束了…………………………………………………………吗?当然没有!太大材小用了!!!


独立门户

step是抽象为一个类,具有自己的onEnter、onExit、init、delete 的方法!
这样就可以:

local lastStep = nil
function gotoStep(newStep, isDeleteLast)
    if lastStep then
        lastStep:onExit()
        if isDeleteLast then
            lastStep:delete()
        end
    end

    lastStep = newStep
    newStep:onEnter()
    //...
end

//当然亦可以用类似指针数组的方法
newStepObj = self.stepArr[newStep]
if newStep == nil then
    newStepObj = self.stepCreateFuncArr[newStep]()
    self.stepArr[newStep] = newStepObj
end

这样step就具备了,处理更复杂问题的能力,也就是拓展性,比如:
进入游戏让玩家体验下“极品装备,一秒刷爆”的快感,就可以用一个GameScene.NewBie来完成,
(ps:科普newbie =/= 牛b, 是新手的意思 =。=)
因为这可能是70级后东西,而一级的玩家要这些资源何用(假设单机的话),
这时候在onExit中卸载掉,就再合适不过了。而你需要做的仍然是gotoStep(XXXX)。

这种思想还可以适用于更多的地方,把复杂的东西模块话,当有了套路之后,
思路就会清晰明了,而代码也向着精简的方向前进。

本文到这里就结束了…………………………………………………….真的!

See Again~
之前
真爱无价,欢迎打赏~
赞赏码

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章