五邑隱俠,本名關健昌,10年游戲生涯,現隱居五邑。本系列文章以TypeScript為介紹語言。
這一篇將介紹在游戲客戶端常用的架構MVC架構。一個游戲的MVC如下划分:
M:1)單例全局的數據中心World,所有游戲模塊的數據在World中有入口,2)各個模塊自己的數據結構。
V:1)通過creator預制體制作的UI界面、場景,2)各個界面顯示邏輯的ViewCtrl
C:1)全局的MainCtrl,2)各個模塊的業務邏輯類ModuleCtrl
先介紹M部分。由於一個模塊的數據,在其他模塊也有訪問的需求,例如好友模塊,在聊天的時候也需要訪問,在排行榜里需要訪問。數據應該有一個單例全局的數據中心類World,所有游戲模塊的數據類在World中有入口。這些數據可以在玩家登錄后從服務器獲取並設置。
export class World {
private static instance: World = null;
private _test: TestData = null;
/**
* 單例模式
*/
private constructor() {
}
/**
* 獲取實例
*/
public static get inst(): World {
if (!World.instance) {
World.instance = new World();
}
return World.instance;
}
// FOR TEST
public set test(val: TestData) {
this._test = val;
}
public get test(): TestData {
return this._test;
}
}
這樣模塊間可以獨立設計自己的數據結構,通過發送消息請求對應模塊的ModuleCtrl更改,通過World讀取。

export class TestData {
private _text: string = null;
public constructor() {
}
public set text(val: string) {
this._text = val;
}
public get text(): string {
return this._text;
}
}
上一章介紹過消息分發。數據的更新時可以派發消息,界面可以監聽消息做刷新。
下面介紹界面和腳本代碼的關聯。前面篇章中介紹過,cocos creator是基於組件模式。我將每個ui界面都做成一個預制體,每個預制體都可以添加一個腳本組件,用於控制這個界面的顯示邏輯。


在彈窗管理里提到我設計了一個繼承cc.Component的類叫ViewCtrl,所有界面的顯示邏輯類都繼承ViewCtrl,並添加到對應的界面預制體。前面提到數據更新時會派發消息,ViewCtrl監聽數據更新消息,刷新關聯的界面。
const {ccclass, property} = cc._decorator;
@ccclass
export default class TestViewCtrl extends ViewCtrl {
}
ViewCtrl只處理界面的顯示邏輯,不處理數據業務邏輯,模塊的數據業務邏輯由該模塊的ModuleCtrl處理。ViewCtrl響應用戶操作,派發消息,ModuleCtrl監聽消息處理。大部分模塊的ModuleCtrl主要做網絡通信,和對本模塊緩存數據的修改。
export class TestCtrl {
public constructor() {
}
public init(): void {}
public start(): void {
NotifyCenter.addListener(MSG_TEST_HTTP, (src: any, data: any) => {
this.testHttp();
}, this);
}
public testHttp(): void {
let data = {
mod: 1, // 模塊
cmd: 1, // 命令
}
let params: HttpReq = {
path: "",
method: HTTP_METHOD_GET
}
MainCtrl.inst.http.sendData(data, params, (data: NetData) => {
World.inst.test = new TestData();
World.inst.test.text = "123";
}, (code: number, reason: string) => {});
}
}
前面提到,C層還有一個全局單例的MainCtrl。該類主要負責模塊注冊、提供全局的操作接口(例如界面/場景的顯隱)、網絡通信處理。
MVC架構先說到這里,下一篇我們將介紹代碼組織。
