1.通用變數設定
2. Pattern 使用說明
3.建立對話框
Setter 以及 Getter 是在將類別封裝時常使用的方式, 但針對每個變數實作Setter & Getter既繁瑣又麻煩, 所幸Cocos2dX 有實做出一組 Macro 可供開發者使用。
CC_SYNTHESIZE - 同時宣告Setter & Getter
CC_SYNTHESIZE(<#varType#>, <#varName#>, <#funName#>);
- 第一個參數為變數類型, ex. int, double, class ...
- 第二個參數為變數的local名稱, 不會直接使用到。
- 第三個參數為getter & setter的函式名稱
class User { CC_SYNTHESIZE(string, email, Email); }
- 會在User 類別中, 宣告一個private 的 string email, public 的 getEmail(), setEmail(string)函式
void searchUserWithEmail (shared_ptr<User> user) { string email = user->getEmail(); // .... }
其他Macro用法
- CC_PROPERTY_PASS_BY_REF(int, m_energy, Energy);
- CC_PROPERTY_READONLY(int, m_energy, Energy);
- CC_PROPERTY_READONLY_PASS_BY_REF(int, m_energy, Energy);
- CC_SYNTHESIZE(cocos2d::CCObject*, m_weapon, Weapon);
- CC_SYNTHESIZE_PASS_BY_REF(cocos2d::CCObject*, m_weapon, Weapon);
- CC_SYNTHESIZE_READONLY(cocos2d::CCObject*, m_weapon, Weapon);
- CC_SYNTHESIZE_READONLY_PASS_BY_REF(cocos2d::CCObject*, m_weapon, Weapon);
- CC_SYNTHESIZE_RETAIN(cocos2d::CCObject*, m_weapon, Weapon);
2.Cocos2dx - Singleton Class 範例
-
當系統中某項資源只有一個,而且絕對獨一無二時,最適合使用這個Pattern,也就是說使用這個Pattern可以確保物件個體只有一個,不會因programmer的疏忽而產生兩個或兩個以上。
當系統中某項資源只有一個,而且絕對獨一無二時,最適合使用這個Pattern,也就是說使用這個Pattern可以確保物件個體只有一個,不會因programmer的疏忽而產生兩個或兩個以上。
Wiki - Singleton
-
- Setter & Getter CC_SYNTHESIZE 參考寫法
-
Singleton.h
class Singleton {
public:
static Singleton* getInstance();
// 所需要透過Singleton存取的變數
CC_SYNTHESIZE(string, email, Email);
private:
static Singleton* singleton;
Singleton();
};
-
Singleton.cpp
Singleton* Singleton::singleton = nullptr;
Singleton::Singleton() { }
Singleton* Singleton::getInstance(){
if (singleton == nullptr) singleton = new Singleton;
return singleton;
}
-
用法
Singleton::getInstance()->getEmail();
Singleton::getInstance()->setEmail("email@gmail.com");
- Setter & Getter CC_SYNTHESIZE 參考寫法
- Singleton.h
class Singleton { public: static Singleton* getInstance(); // 所需要透過Singleton存取的變數 CC_SYNTHESIZE(string, email, Email); private: static Singleton* singleton; Singleton(); };
- Singleton.cpp
Singleton* Singleton::singleton = nullptr; Singleton::Singleton() { } Singleton* Singleton::getInstance(){ if (singleton == nullptr) singleton = new Singleton; return singleton; }
- 用法
Singleton::getInstance()->getEmail(); Singleton::getInstance()->setEmail("email@gmail.com");
3. Cocos2dx - Popup 實作小技巧
-
Popup 基本上就是在Scene 的最上層, 跳出一層對話框, 或者是轉圈圈的Loading小圖示等, Cocos2dx 有支援手機原生的對話框 - MessageBox。
但如果要做一個較為精緻的遊戲 ex. Candy Crush, 客製化的 Popup是不可少的。
- Popup 基本上就是在Scene 的最上層, 跳出一層對話框, 或者是轉圈圈的Loading小圖示等, Cocos2dx 有支援手機原生的對話框 - MessageBox。但如果要做一個較為精緻的遊戲 ex. Candy Crush, 客製化的 Popup是不可少的。
Trick1. 透過傳入 Scene node 建立 Popup
-
-
通常會先建立一個 單例 Helper來處理 Popup 相關的事件。
- Singleton寫法範例
-
透過 注入 Scene Node 當參數來達到泛用 Popup 的效果, eg. 在各個不同的 Scene中可以複用 Popup
void showPopup(Node* sceneNode);
- 通常會先建立一個 單例 Helper來處理 Popup 相關的事件。
- Singleton寫法範例
- 透過 注入 Scene Node 當參數來達到泛用 Popup 的效果, eg. 在各個不同的 Scene中可以複用 Popup
void showPopup(Node* sceneNode);
Trick2. 透過傳入 Lambda 當作函數參數做為 Popup 按鈕的動作函式
-
- 傳入 Lambda 當作函式參數文章
-
宣告範例如下
void showConfirmPopup(Node* sceneNode, function<void()> onSubmit, function<void()> onCancel);
-
記得在回傳 Callback 時判斷 Lambda 語法是否為空, 若為空呼叫回傳會 Crash
-
在宣告主體中, 綁定按鈕的動作到對應的函式指標, ex.
buttonConfirm->addClickEventListener([this, onSubmit](Ref* pSender) {
if (onSubmit) {
onSubmit();
}
});
- 傳入 Lambda 當作函式參數文章
- 宣告範例如下
void showConfirmPopup(Node* sceneNode, function<void()> onSubmit, function<void()> onCancel);
- 記得在回傳 Callback 時判斷 Lambda 語法是否為空, 若為空呼叫回傳會 Crash
- 在宣告主體中, 綁定按鈕的動作到對應的函式指標, ex.
buttonConfirm->addClickEventListener([this, onSubmit](Ref* pSender) { if (onSubmit) { onSubmit(); } });
Trick3. 將背景的 touch event 吃掉
-
- 背景的觸控 Touch Event 還是會持續作用 ex. Menu按鈕, 需要將傳入Scene的觸控事件接管。
-
作法如下:
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = [ & ](cocos2d::Touch* touch, cocos2d::Event* event) {
return true;
};
sceneNode->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, popupLayer);
-
sceneNode 為傳入的 Scene
-
popupLayer 為 Popup 所在的 Layer 層
-
這樣會將 sceneNode 所有觸控的事件接管, 但 popupLayer 上的觸控事件依舊可以運作
-
將 Popup 清除時, 記得將 listener 的觸控事件清除
Director::getInstance()->getRunningScene()->getEventDispatcher()->removeEventListenersForTarget(popupLayer);
-
- 背景的觸控 Touch Event 還是會持續作用 ex. Menu按鈕, 需要將傳入Scene的觸控事件接管。
- 作法如下:
auto listener = EventListenerTouchOneByOne::create(); listener->setSwallowTouches(true); listener->onTouchBegan = [ & ](cocos2d::Touch* touch, cocos2d::Event* event) { return true; }; sceneNode->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, popupLayer);
- sceneNode 為傳入的 Scene
- popupLayer 為 Popup 所在的 Layer 層
- 這樣會將 sceneNode 所有觸控的事件接管, 但 popupLayer 上的觸控事件依舊可以運作
- 將 Popup 清除時, 記得將 listener 的觸控事件清除
Director::getInstance()->getRunningScene()->getEventDispatcher()->removeEventListenersForTarget(popupLayer);
沒有留言:
張貼留言