about 6 years ago

將場景中所有物體 Physicbody 暫停時間

Director::getInstance()->getRunningScene()->getPhysicsWorld()->setSpeed(0);

恢復時間

Director::getInstance()->getRunningScene()->getPhysicsWorld()->setSpeed(1);
 
almost 7 years ago

指令參考

在不同的編譯器和作業系統上, 叫出 C++ 編譯器的指令都不同。
GNU 編譯器的預設指令是 g++

Mac: 在 Terminal環境下

$ g++ prog1.cpp -o prog1

$ 為系統提示號。 這個指令會生成一個 prog1 或 prog1.exe

$ ./prog1

這指令可以執行對應生成的檔案

使用方式

g++ [option] filename

選項

-c : 只做編譯(不做連結)
-S : 輸出組譯碼
-E : 將預處理結果顯示
-o filename : 指定輸出檔名
-ansi : 程式要求依據ansi c標準
-Dmacro : 使定義巨集(marco)為有效
-Dmarco=defn : 使定義巨集(marco)為defn
-Wa,option : 將選項(option)傳給組譯器
-wl,option : 將選項(option)傳給連結器
-I : 追加include檔案的搜尋路徑
-L : 追加library檔案的搜尋路徑
-l : 指定連結的函式庫
-Wall : 顯示所有的警告訊息
-g : 編入除錯資訊(要使用GDB除錯一定要加)
-O2 : 做最佳化

Example:

g++ -o file a.c b.c c.c
g++ -Wall -g -o test test.c
g++ -Iinclude -Llibrary -lmy_lib -o test1 test1.c
g++ -c -o test3 test.c

 
almost 7 years ago

string 的 size 操作和 empty 操作

常使用的 c++ 函式庫會附帶 size() 以及 empty() 操作, 前者是給予對應的長度, 後者是簡單的回傳是否為空。
需特別注意的是 size() 回傳的是一個 string::size_type, 而非常見的基礎型別。

string 和很多程式庫型別 - 定義有數個相關型別。 這些型別讓我們得以使用與機器無關的方式來運用程式庫型別。
size_type 被定義為某個 unsigned 型別 - unsigned int 或 unsigned long 的同義字, 足以保證代表任何 string 的大小。

任何用來存放 string size() 返回值得變數都應該是 string::size_type。 千萬別把 size() 返回值賦予一個 int 變數。

使用 int 除了 int 可以存放負值外, 某些機器上的 int 太小, 連合理的大型 strings 都無法處理。

將 strings 與 character string literals 相加

string 常使用的串接方式會有下面這種做法:

string s1 = "hello";
string s2 = "world";
string s3 = s1 + " " + s2;

這種做法有個需要特別注意的事項, 每個 + 運算子至少要有一個運算元的型別是 string

也就是說下面的語法是不合法的:

string s = "hello " + "world!";
 
almost 7 years ago

C++ 內建型別會不會被自動初始化, 與它在哪裡被定義有關。

定義於函式主體外的任何變數都會獲得初值0。 定義於函式主體內的內建型別則無初值。

#include <iostream>
using namespace std;

int k;

void printVal (){ // <- 所謂的函式主體

    int i;
    cout<< i << endl;
    cout<< k << endl;
}

int main(){ // <- main 為例外的函式主體, 有賦值

    printVal();

    int m;
    cout << m << endl;

    return 0;
}

輸出結果:

i: 32767

k: 0

m: 0

未初始化的變數其實帶有一個值。 編譯器首先把變數 “放在” 記憶體某處, 然後把那塊記憶體的 bit 樣式當作那個變數的初值。

由於初始化會影響程式的結果是否正確, 未明確定義的變數往往會造成很難除錯的 bug 產生, 所以還是養成一律初始化每個變數的習慣會省自己很多麻煩。

 
almost 7 years ago

前幾天遊戲想要開發一個紙娃娃換裝備衣服的系統, 開始研究Spine的具體作法。
將心得整理如下:

技巧1. 關閉 or 隱藏關鍵的 Attachment

spSlot *slot = animationNode->findSlot("SLOTNAME"); 
Slot_setAttachment(slot,0);

將Slot 的Attachment 設為零可以隱藏該Attachment。

技巧2. 設定對應的Slot 中的 Attachment 來更換裝備武器

animationNode->setAttachment("left_hand_slot", "sword01");

這種作法需要配合 Spine Editor中的命名, 而且所有需要使用到的武器裝備, 需要在Spine中做新增。 換句話說, 如果你一個角色有十種武器, 在角色對應的 Spine slot 中就需要新增十種武器的圖片。 有二十種不同骨骼動畫的角色, 搭配上十種可以新增的武器圖片, 應該就會是一個操死設計師的節奏。

技巧3. 複雜的Runtime 新增Attachment到 Spine的 Slot

僅附如下的參考連結:
Spine 官方 Runtime 文件
可能實作細節 Post

大概做法會是在程式碼中, 透過 Texture 的方式新增想要的客製化 Attachment, 之後再將這個 Attachment 新增到對應的 Slot 中。

結論如下:

  1. Spine 中 切換 Skin 膚色的方法簡單, 但如果要切換具體的裝備, 則需要工程端與Spine設計端的合作。 主要是命名規則。

  2. Spine 升級成專業版之後可以使用的功能, 對於開發角色以及設計的環節有很大的加分作用。 主要是在 Meshes的使用上, 可以極大的減少圖片跟資源的使用。


最後, 我們有個關於 Cocos2d-x 的Facebook社團, 如果有任何疑難問題, 歡迎到社團發問。

Cocos2dx Taiwan 開發者社團