Cocos2dx 小技巧(二)單例

來源:互聯網
上載者:User

我們的主題是:有些技巧你不知道不要緊,但知道後會很牛逼。

-----------------------------------------------------------------------------------------------------------

首先來說下什麼是單例:
單例模式是設計模式中最簡單的形式之一。這一模式的目的是使得類的一個對象成為系統中的唯一執行個體。單例模式的要點有三個;一是某個類只能有一個執行個體;二是它必須自行建立這個執行個體;三是它必須自行向整個系統提供這個執行個體。
上面這段話講的很嚴謹,很抽象有木有!沒錯,你猜對了,它來自百度百科...下面我用簡短、無科學依據的語言群組織一下:


假如你是個一個男的,但是你私生活不能自理:不會煮飯,洗衣服,穿的衣服永遠都no fashion。這時候你需要什嗎?沒錯,需要一個女朋友!但這個女朋友你該怎麼“使用”呢?給你以下兩種選擇:
1、要洗衣服的時候“建立”一個女朋友(也就是去找一個女朋友),洗完後將女朋友甩了;當你要做飯,繼續“建立”一個女朋友,做完後甩掉;甚至是當你需要滿足某種不可告人的需求時,你需要“建立”一個女朋友...然後..
2、找一個可以過一輩子的女朋友,永遠在一起,你若不離,她便不棄!想怎麼用就怎麼用,省去了相親等一系列麻煩!
以上兩種方法雖然都可以讓你告別你的右手,但是第一種方法的前提條件太誇張了:你要是一個高富帥,像博主這樣的。呵呵。呵呵
所以,還是選第二種吧,也就是我們所說的單例模式,你想甩也甩不掉。



好了,言歸正傳,為什麼我們要用單例來設計遊戲呢,參考這句話:
眾所周知,遊戲開發中離不開遊戲資料儲存和載入。這些資料包括關卡資料、遊戲進行中的狀態資料等。這樣一些資訊很多遊戲模組中都需要訪問,所以可以為之設定一個單例對象。我武斷地認為,用戶端遊戲開發中,至少需要一個單例對象。因為一個全域的訪問點可以方便很多個物件之間的互動。

-----------------------------------------------------
下面介紹單例的簡單使用方法:
1、聲明一個類:

class TestSingleton : public cocos2d::Layer{public:static TestSingleton* getInstance();//建立一個全域訪問點,例如我們常用的Director::getInstance()就是這樣一個單例void test();//測試單例時用到。private:static TestSingleton* m_singleton;};
2、定義實現:

TestSingleton* TestSingleton::m_singleton = nullptr;//m_singleton指向null 指標TestSingleton* TestSingleton::getInstance(){//判斷m_singleton是否已被執行個體化, 如果沒有,將之執行個體if(nullptr == m_singleton){m_singleton = new TestSingleton();//}return m_singleton;}void TestSingleton::test(){CCLOG("test testSingleton success~~");}
3、測試單例
我直接在HelloWorld這裡測試。代碼如下:

bool HelloWorld::init(){TestSingleton::getInstance()->test();//調用TestSingleton裡的test(),看控制台是否輸出success}

很明顯是成功的,我就不貼結果啦。

4、釋放

單例這東西用起來一定要謹慎謹慎再謹慎,如非萬不得已,儘可能別用吧。因為大家要考慮這麼一個問題:單例是什麼時候被釋放的?按目前實現的方法,單例是直到遊戲退出時才釋放的!所以當遊戲中使用過多的單例是十分浪費空間,或者說根本不能容忍的!

在網上尋找了一些釋放單例的辦法。這篇部落格總結了挺多,大家可以按自身申請使用。http://blog.csdn.net/gogogo/article/details/7009862

因為Director也使用到了單例,我看了下,它是在解構函式裡釋放的。所以我這裡模仿它釋放第二步建立的單例:

TestSingleton::~TestSingleton(){    m_singleton = nullptr;釋放}

這一系列的部落格特點就是精簡精簡再精簡...

尊重原創,轉載請註明來源:http://blog.csdn.net/start530/article/details/22610229

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.