【步兵 經驗篇】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~
之前
真愛無價,歡迎打賞~
讚賞碼

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