第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在cocos2d里面實(shí)現(xiàn)mvc?

如何在cocos2d里面實(shí)現(xiàn)mvc?

精慕HU 2018-12-12 18:10:09
如何在cocos2d里面實(shí)現(xiàn)mvc
查看完整描述

1 回答

?
互換的青春

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊

Cocos2d本身并不是基于mvc的理念來設(shè)計(jì)的,但是,這并不防礙在自己的游戲開發(fā)中使用mvc。實(shí)現(xiàn)方式肯定是多種多樣的,在此是怎么在cocos2d里面實(shí)現(xiàn)mvc的,同時(shí),在最后,會(huì)寫一個(gè)簡單的游戲demo,當(dāng)然,里面使用的是cocos2d+mvc。

現(xiàn)有問題
cocos2d里面有這樣一些類,CCSprite,CCLayer,CCScene,所有這些,都是CCNode的子類?;旧希蠹以谑褂胏ocos2d開發(fā)游戲的時(shí)候,都會(huì)采用下面的步驟來實(shí)現(xiàn)游戲邏輯:
通過應(yīng)用程序代理類來初始化第一個(gè)CCScene(即AppDelegate里面的第一個(gè)CCScene),
CCScene里面實(shí)例化一個(gè)或者多個(gè)CCLayer,并把它們當(dāng)作孩子添加進(jìn)去。
CCLayer 里面實(shí)例化一個(gè)或者多個(gè)CCSprite,也調(diào)用addChild添加進(jìn)去
CCScene 處理用戶輸入(比如touch事件和加速計(jì)的改變),同時(shí)更新CCLayer和CCSpirte的屬性,比如更改CCSprite的position,讓sprite運(yùn)行一個(gè)或多個(gè)actioin等。
CCScene里在運(yùn)行一個(gè)游戲循環(huán)(game loop,一般是1/60更新一次),然后CCLayer和CCSprite就在這個(gè)game loop里面做一些更新和游戲邏輯。
這個(gè)過程看起來非常簡單,而且也可以很快地做出游戲來。這也是為什么cocos2d這么流行的原因,它實(shí)在是太簡單了。但是,當(dāng)你的游戲邏輯越來越復(fù)雜的時(shí)候,你的代碼會(huì)變得越來越難以維護(hù)。這里面最突出的問題就是,CCScene這個(gè)類負(fù)責(zé)的事情太多了---同時(shí)要處理用戶交互,還有負(fù)責(zé)游戲邏輯(邏輯層)和畫面顯示(表示層)。(譯者:根據(jù)SoC的原則,這顯然是不合理的,我們應(yīng)該把職責(zé)分離開來,這樣代碼才更容易維護(hù)。同時(shí)SRP(單一職責(zé)原則)也是這么要求的,一個(gè)類只負(fù)責(zé)一件事情)

模型(Model)
MVC它會(huì)把一個(gè)系統(tǒng)劃分為以下幾個(gè)組件:
Model ,它負(fù)責(zé)與領(lǐng)域相關(guān)的邏輯處理代碼,也可以說是邏輯層,或者領(lǐng)域?qū)印?br/>View ,只負(fù)責(zé)界面顯示。
Controller ,它負(fù)責(zé)處理用戶交互。
讓我們先從model開始。Model代表了游戲邏輯。因?yàn)槲椰F(xiàn)在正在制作一個(gè)platform游戲,所以,我講的一些東西也是與platform游戲相關(guān)聯(lián)的。我的游戲里面的model包含下面一些類(當(dāng)然,僅僅是一部分類)
Player,
包含一些屬性,比如:player的位置、當(dāng)前速度(x軸速度、y軸速度)等。
包含一些與player有關(guān)的處理邏輯,比如:run,walk,jmup等。
包含一個(gè)update方法,該方法會(huì)被游戲主循環(huán)每一幀刷新時(shí)所調(diào)用,它主要負(fù)責(zé)更新player model。
Platform,
包含一些屬性,比如:platform位置、寬度、高度等。
包含一些與platform有關(guān)的處理邏輯,比如:傾塌等
包含一個(gè)update方法,該方法會(huì)被游戲主循環(huán)每一幀刷新時(shí)所調(diào)用,它主要負(fù)責(zé)更新patform的model。
GameModel,
包含一些游戲世界的屬性,比如重力等。
包含一些方法來執(zhí)行游戲邏輯。
包含一個(gè)update方法,該方法會(huì)在每一幀刷新的時(shí)候被game loop所調(diào)用,然后它就可以更新自己的狀態(tài),同時(shí)還會(huì)觸發(fā)游戲世界里面的其它對(duì)象也相應(yīng)地更新自己的狀態(tài)。
你可能會(huì)問:有些屬性你完全沒有必要重復(fù)定義,你可以直接從CCSprite里面得到,比如position、width、height等。我想說:有對(duì)有錯(cuò)。說對(duì)呢,是因?yàn)樗鼈兇_實(shí)差不多,可以拿來就用。說不對(duì)呢,那是因?yàn)?,model有可能使用一些不同的計(jì)量單位,比如米,而不是像素。(比如box2d這樣的,就不是使用像素作為單位)。在我的model里面,我使用的是米,當(dāng)然,你也可以使用英尺,或者其它單位。渲染引擎對(duì)于model來說是透明的,model完全不用關(guān)心。
視圖(View)
根據(jù)mvc的原則,view應(yīng)該只負(fù)責(zé)界面顯示。它實(shí)際上也是在cocos2d里面實(shí)現(xiàn)mvc時(shí),最簡單的一個(gè)。如果你有一個(gè)model,你可以使用CCLayer,然后添加一些CCSprite或者其它c(diǎn)oocs2d類來處理顯示問題。把model和view分開的好處就是,你沒必要把model的屬性直接映射到view的屬性上面去。比如,你的玩家在x軸方向上移動(dòng),但是,你想讓它總是在距離屏幕左邊10px的位置。這時(shí)候,你就可以移動(dòng)CCLayer了,而不是真的在移動(dòng)sprite。當(dāng)把model對(duì)象顯示出來的時(shí)候,你必須考慮單位,如果你使用的是米作為計(jì)量單位,你在渲染的時(shí)候必須轉(zhuǎn)化為像素。(你可以像box2d里面一樣,定義一個(gè)PTM_RATIO)那么你的model怎么和view打交道呢?你可以從controller里面得到view,或者你可以把game model制作成一個(gè)單例,然后使用靜態(tài)方法來處理它。
控制器(Controller)
controlller負(fù)責(zé)把view和model聯(lián)系起來。它的主要職責(zé)就是處理用戶輸入。由于我們需要實(shí)例化model和view,我發(fā)現(xiàn)在controller里面來做非常合適。我是把controller類繼承到CCScene類,然后我們需要建立一個(gè)初始的controller類,它由appDelegate來實(shí)例化。然而,這里會(huì)有一個(gè)問題,touch事件是由CCLayer來處理的,而它在我的設(shè)計(jì)里面的角色是view。而我又不想讓view來處理用戶輸入,所以,我需要傳遞一個(gè)view的引用給controller(不是直接傳遞,而是通過delegate),然后通過delegate來執(zhí)行controller的touch事件處理代碼,以此來處理view里面的touch事件。好了,現(xiàn)在我的controller類就能夠處理來自view的用戶事件了。然后,它可以根據(jù)用戶的輸入來操作model,要么通過修改model的屬性,或者調(diào)用model的方法。再更新完model之后,我們的view也需要得到通知并更新。所有這些,我都在game loop里面完成,實(shí)際上它就是一個(gè)controller。controller的職責(zé)只是負(fù)責(zé)調(diào)用view的update方法,然后剩下的就交給view去完成即可。



查看完整回答
反對(duì) 回復(fù) 2019-01-11
  • 1 回答
  • 0 關(guān)注
  • 697 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)