[Android篇]Back鍵無法關閉cocos2d-x遊戲

文章撰寫日期︰2013/03/20 17:30
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

按下Android的返回鍵,
有時候關的掉遊戲,
有時候關不掉。

二、解決辦法

查文後得知Cocos2dxActivity.java裡的onKeyDown是假的,
觸控權早已交到了Cocos2dxGLSurfaceView.java的onKeyDown手上...

再追下去,
發現backKey交給了Native,
也就是cpp那邊會呼叫backKey按下去後的實作。

後來,
知道要實作init函式,
並將setKeypadEnabled(true);
然後再寫一個
void DoorAnimationScene::keyBackClicked(){
    CCLog("into DoorAnimationScene::keyBackClicked()");
    CCDirector::sharedDirector()->end();
}

結束。

[Git篇]在Dropbox上使用Git版本控制

文章攢寫時間︰2013/03/20 14:37

本篇文章完全取自MRMU STUDIO部落格

一、前言

專案如果是一人開發還好,
要是多人開發,
那要怎麼一起搞下去呢?

如果要跟其他人一起開發專案,
就需要架Git server,
讓多位開發者可以透過存取遠端Server的Repo來進行協同開發,
共同維護同一個專案。
順帶一提,
每位老手大大都建議先去Github.com開一個免費帳號練習一下。

Github提供Git server,
也就是遠端的Repo,
但是免費的限制是你的Repo都是開放的,
如果不想讓他人看到你的程式碼,
就必須付費。

你也許會因為工作的關係,
所以不能公開專案的程式碼,
若是一個人開發那還好,
多人開發的情況下也許又覺得要自架Git server有點麻煩,
有沒有經濟簡單的解決方案呢?
在此提供一個簡單的方式,
就是使用Dropbox作為Git server。

二、本文

什麼是Dropbox?

先在此大致簡介一下:
Dropbox是一個非常棒的雲端檔案儲存服務,
把它安裝好後,
你就可以指定本機端的任一目錄 (預設名叫My Dropbox)成為有雲端儲存功能的目錄,
從此就可以在任何有安裝Dropbox的電腦存取該目錄內的檔案 (當然你要先登入自己的帳密),
所以如果你有一台以上的電腦,
或有iphone、android手機等(皆有dropbox app可下載),
共享檔案就變得非常方便。

除此之外,
你還可以在dropbox的目錄裡開設公開分享的目錄,
邀請其他朋友共同使用該目錄,
如此該目錄也就成為了一個公用槽。

因為dropbox可以開公用目錄,
因此我們可以開一個共用的目錄並邀請開發團隊所有成員一起共用此目錄,
然後把git server放在這個目錄。

在此假設這個共用的目錄叫OurProject。
說是git server,
其實就只是一個共用的Repo存在這裡。
為OurPeoject目錄建立一個repo,
請注意,記得使用加上bare參數:
git init --bare

備註︰
在不加--bare所init完的結果,會是在目前的working目錄下建立.git目錄,並把上述的git相關檔案放在.git目錄裡。
加了--bare的話,則是不建.git目錄,而把裡面的檔案直接放在目前目錄下。
適合在沒有修改檔案或開發的機器上,ex GIT server。
好處是只要maintain git repository,project的資料只存在repository中,不需要再複製一份最新的版本出來,會省點空間。


如此這個目錄就會變成Repo了,
而因為加了bare,
這個目錄不會有.git目錄,
而是把原先.git目錄中的東西都放進來,
而且你日後在這個目錄中不會看到你的程式檔案。

對,不會看到你專案的程式檔案哦,
就是大家把最新進度從遠端Repo拿下來、更新、放回去,
這個目錄裡都看不到專案的程式檔案。
但是其實它已經記錄了最新進度,
只是需要你「拿回家」才看得到。

好,所以現在你的狀況應該是:
專案的程式碼已經先放在一個Repo了(內有程式檔案),
而dropbox也有一個Repo,
但是用bare的方式建立的
(只有git相關檔案,沒有你的程式檔案),
dropbox的Repo我們就先稱之為「遠端Repo」。
在dropbox目錄建好遠端Repo後
(說是遠端,
但其實位在我們本機的dropbox目錄,
但也能說是遠端,
因為跟其他人同步共用中),
進入你專案所在的Repo目錄,
並執行:
git remote add origin Dropbox的目錄/OurProject

如此就會在你專案Repo中建立一個遠端Repo的位址,
然後把這個位址取名為origin,
日後就可以把你的進度放進遠端Repo了。
(通常本地端的Repo預設名是master,而遠端的Repo預設名就是origin)

接著要把你專案Repo的進度放進遠端Repo中,
供其他人取用,
所以要在專案Repo目錄執行Push的指令:
git push origin master

如果push有成功,
你在遠端Repo (dropbox目錄裡的OurProject目錄) 看不到你的程式檔案(剛剛有提過),
要確定是不是真的有push進最新進度,
我們需要再Pull回來看看,
看現在遠端Repo裡是不是最新進度:
git pull origin master 

一下本機一下遠端,操作很複雜?

簡單來說,
 add、commit、branch、checkout等這些都是你自己在本機跟自己玩,
都是操作本機的Repo,
當你要跟其他人一起玩時,
你就要用push、pull,
把別人的成果從遠端Repo拿下來(pull),
自己玩一玩(先commit進自己的Repo,再修改、再commit…),
再丟上遠端Repo(push),
讓其他人也能抓最新進度去玩。

通常我們從遠端Repo拿東西下來,
可以用Clone、Pull、Fetch等方法,
其差異 (就我的理解) 說明如下:

Clone:
會把遠端的repo整個專案抓下來,
放在目前路徑下的新目錄中。
(所以不需要先把新目錄建立成Repo,
就可以整包抓下來,
隨包附上.git目錄)

Pull:
會把遠端的repo整個專案抓下來,
跟你目前所在的Repo及所用的Branch作合併(Merge),
此指令等同Fetch+Merge。

Fetch:
會把遠端的repo整個專案抓下來,
但不跟你目前所用的branch合併,
而是放在本地中的另一個Brance(remoteBranch)。
別人的code跟我寫的衝突了!!!!!!!!!

槽了!專案全亂了!

在teamwork中一「推」一「拉」很有趣,
尤其第一次在Pull別人的成果回來跟自己的成果merge時,
有點怕怕的,
但當你發現它自動merge作得很棒時,
心情也跟著很興奮。
但衝突就這麼發生了!

故事是這樣的… 假設程式檔案Sample.php本來的code是:AA
小明加上BB後,
Pull server的code下來,
跟自己的code完美的合併了(AA+BB沒衝突) 小明commit到自己本地端Repo後,
再Push回Server,
目前Server最新版是:AABB

你現在的code是之前Pull的,
也就是:AA,
現在你刪一個A,
加一個C,
成為了:
AC 接著你先commit到本地端,
然後執行Pull,
要合併別人的進度,
但挫屎了,產生衝突!!
衝突的原因是,
Git不曉得第二個A是否要刪除 (有人要刪,有人要留),
所以它會把這個衝突反應在Sample.php這個檔案中。
開啟Sample.php,
你會看到類似這樣的標記:

第一個A的內容
<<<<<<<
你加的C內容
=======
第二個A的內容
後面BB的內容
 >>>>>>>

<<<<<<< 跟 >>>>>>>標記描述了產生衝突的程式碼,
其間以=======作為區隔,
第一個部份就是你新加的內容,
第二個是遠端的內容,
你一看就會知道這邊有衝突,
於是你要決定怎麼合併它們,
手動更改檔案,
處理好衝突,
先Commit接著Pull再看看有沒有衝突發生,
若還有衝突發生,
就要再手動去檢查產生衝突的檔案,
再Commit,
然後再Pull看看。

直到Pull成功後,
就可以Push回Server,
享受整併最新進度的快感。

相關文章

1. 在Xcode底下使用Git版本控制
2. Git版本控制的進階觀念

[Git篇]Git進階觀念說明

文章攢寫時間︰2013/03/20 13:56

一、前言

繼前一篇簡單扼要的提到如何使用Git版本控制,
這一篇會對Git裡所有我們應該知道的術語做了解。

二、本文


(以下文章取自MRMU STUDIO部落格)

每個人的程式倉庫Repo

Repo是repository的簡稱,
指的是倉庫、程式庫、版本庫…,
簡單來說,
Repo就是一個受Git版本控制的目錄。

你可以先找一個空資料夾執行git init來建立新的Repo,
若你有裝TortoiseGit(俗稱小烏龜)
就可在空資料夾按右鍵,
選擇Git create repository here,
意思一樣。

當然若你有現成的程式專案目錄,
也可以直接把它建成Repo,
操作跟上述相同。

執行git init後這個資料夾就變成一個Repo了,
裡頭會多一個名叫.git的目錄,
而Repo在日後進行版本控制時所需的相關資訊都會存放在這個.git資料夾中。
(.git目錄若砍掉了,這個目錄就不再是一個Repo了) 

使用版本控制的第1步︰將檔案加入版本控制器

現在Repo目錄裡啥都沒有,
所以可以先隨便新增一個README來試玩看看,
執行:
touch README

執行後就會多一個空白的檔案叫README,
如果要你放進其他的檔案試試看也行,
就直接copy放進來吧。

這時我們的repo已經有新檔案了,
但都還沒受到版本控制(untracked),
不在版本控制清單中的檔案,
就不會受到git控制,
也就是你要把程式碼提交變更(commit)至repo時,
這些untracked的檔案都不會被放進去。
所以要執行add,
讓檔案們進入所謂的staged狀態,
才能接著把它們commit進Repo中。

要把所有檔案都加入staged狀態,
執行:
git add -A

git add .

要把個別的檔案加入staged,
執行:
git add 主檔名.副檔名

如果有些檔案你不想要再讓它受到版本控制了,
也就是要把它unstage,
那可以執行:
git reset 主檔名.副檔名

使用版本控制的第2步︰遞交你的程式

好的,
現在確定好要commit第一版程式碼了,
所以可以執行:
git commit -m "Initial commit"

也就是把所有檔案commit進repo,
並且附上’Initial commit’的說明註解。
而日後,
如果commit過的檔案有再修改過,
也需要再add一次成為staged狀態,
然後再commit它們。

出事了,我要還原程式碼

現在我們可以自己寫code自己commit了,
天天記錄新進度,
感覺很踏實。

但有一天發現某功能挫屎了。
也許你確定上禮拜這邊還沒問題的,
或某一版一定沒問題,
這時我們可以利用Checkout來回溯之前的版本:
git checkout xxxx

xxxx指的是版本編號的前四碼。

相關文章

1. 在Xcode底下使用Git版本控制
2. 在Dropbox上使用Git版本控制

[Git篇]在Xcode底下使用Git版本控制

文章攢寫時間︰2013/03/20 12:18
章修改時間︰2013/03/23 18:24
文章修改次數︰3

一、前言

(以下文章取自MRMU STUDIO的部落格)
開發專案時,
開發者會一直寫入新的程式碼,
或放進新檔案。

如果有天出事了,
某個功能以前明明可以跑,
但突然掛點了,
通常我們會回頭去看相關的程式碼,
試著找出問題並修復。
但如果專案規模不小或者是由很多人一起開發的專案,
就會大大增加debug的難度。

版本控制軟體讓我們可以儲存專案不同時期的版本,
如果每次有修改就存下一個版本(有些叫check-in,有些叫commit),
出事時就可以回溯到之前還能正常執行的版本,
並且比較兩個版本間有何不同,
找出引起問題的程式碼。

另外有一些情況是:
如果你想開發新功能,
我們可以利用版本控制軟體,
在專案中開一個分支(branch)來發展看看或實驗看看,
如果成功了,
又能合併(merge)回原來的開發主線。

這些都是版本控制的好處。

二、本文

(以下文章取自靜水深流部落格)

什麼是Git

Git就一套版本控制軟體,
相對於subversion(SVN)的中心式版本控制,
git是分散式版本控制,
幾乎什麼事都在本機進行,
設計上「只會增加資料」,
因此不要太怕出事,
東西都可輕鬆復原。

每個開發者的本機端都會有完整的程式庫,
都能獨立作業,
不受開發主線的拘束,
不需網路連線也能工作。

開始使用版本控制

內建了git 可以簡易的做Xcode的版本控制


在建立專案後有勾選使用 local Git,
只要一偵測檔案被修改,
馬上就可以在檔案名稱後 看到 "M" 的標記。


新增的檔案也會有 "A" 的標記。
選取檔案, 右鍵 選取 Souce Controll -> Commit Selected Files
填寫 Commit Message 後 送出。

之後就可以在編輯器中選 Show the Version Editor
比對兩版本的差異。


如果一開始沒有做版本控制呢?也ok~
1. 關閉Xcode
2. 開啟終端機視窗
3. 進入專案底下的根目錄資料夾
4. $ git init
5. $ git add .
6. $ git commit -a -m "Initial commit" (Possibly not necessary)
7. 再開一次Xcode,成功了!

刪除版本控制控管

那⋯怎麼刪除git控管呢?
根據stackOverflow論壇網民的回應
只要先將Xcode完整的關閉,
並在專案資料夾底下將隱藏檔.git資料夾刪除就可以了

查看所有的commit記錄

$git log --graph  --all

切換到特定版本

//建議Xcode先關閉
$git checkout commit編號前4碼
//再加上-f表示強制切換到指定版本

相關文章

1. Git版本控制的進階觀念
2. 在Dropbox上使用Git版本控制

[Android篇]使用CCLabelTTF換行會漏字(最後一個字不見)的問題

文章撰寫日期︰2013/03/20 10:35
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

針對CCLabelTTF設定setDimensions,
想要做到文字過長會自動換行的效果,
在IOS上能正常顯示,
Android上卻會被截掉每一行的最後一個字元的問題。

請參見下圖示意的題目的部份
畫面在IOS上的樣子
畫面在Android上的樣子
可以看到,
"一條尾巴"後面的"逗號"在Android上不見了

二、解決方法

與Cocos2dX開發人員詢問後,
發現此問題是2.0.x的一個bug,
已經在cocos2d-x 2.1.x獲得改善,
可參見它們的更新LOG #1610
Bug   #1610: fix a bug that CCLabelTTF will lost a character at the end of a line
 
解決方法是將cocos2d-x在Android上的一個類別
Cocos2dxBitmap.java line 298

while (pString.indexOf(i++) == ' ') {
 ;
}
改成
while (pString.indexOf(i) == ' ') {
          ++i;
}
記得,
cocos2dx/cocos2dx/platform/android/java/src/org/cocos2dx/lib/Cocos2dxBitmap.java也要改掉。

免得之後建立的新Android-Cocos2dx專案又遇到同樣的問題。

[Android篇]SQLite在Android無法讀取(返回錯誤碼14)的決解方案

文章撰寫日期︰2013/03/19 13:46
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

在Xcode中,使用
sqlite3 *pDB = NULL;//資料庫指針

string  szResPath(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("millionschool.sqlite"));
sqlite3_open(szResPath.c_str(), &pDB);
就能順利將Resources資料夾下的millionschool.sqlite打開並使用。

但是,
Android卻無法這樣子打開,
返回了錯誤碼14

二、解決方法

經爬文後發現,
sqlite3 *pDB = NULL;//資料庫指針CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("millionschool.sqlite"));
這個取到的路徑在Android下會被壓縮,
無法正常存取。
解決方法只有將sqlite檔案複製至可存取的Android資料夾方可使用。
CCFileUtils::sharedFileUtils()->getWriteablePath();
此方法在Android底下會取到本機裡data\data\package_name\這個目錄,
於是我們將assets底下的sqlite複製到這邊來。
        sqlite3 *pDB = NULL;//資料庫指針
        char * errMsg = NULL;//錯誤訊息
        std::string sqlstr;//SQL指令
        int result;//sqlite3_exec返回值
        
        string  szResPath(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("millionschool.sqlite"));//IOS可以這樣用,但Android卻不行

        //取得Android可以使用的data\data\package_name資料夾
        string dbPath = CCFileUtils::sharedFileUtils()->getWriteablePath();
        dbPath.append("millionschool.sqlite");

        //將資料寫入串流
        unsigned long tmpSize;
        unsigned char* dbData = CCFileUtils::sharedFileUtils()->getFileData(szResPath.c_str(), "rb", &tmpSize);
        FILE *fp = fopen(dbPath.c_str(), "wb");
        fwrite(dbData, tmpSize, 1, fp);
        fclose(fp);

        //將資料庫打開來看看
        result = sqlite3_open(dbPath.c_str(), &pDB);
        
        if( result != SQLITE_OK ){
            CCLog( "打開資料庫失敗,錯誤碼:%d ,錯誤原因:%s\n" , result, errMsg );
        }else{
            CCLog( "打開資料庫成功!" );
        }
成功了! 讀到資料庫了!

[LevelHelper篇]存Level檔時遇到Unknow error訊息視窗

文章撰寫日期︰2013/03/19 01:45
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

今天在輸出LevelHelper檔時,
遇到了一個訊息視窗,
上面寫著
Unknow error
Level file could not be saved, Please try again!

而且在LevelHelper裡的pshs檔,
底下的圖檔預覽全都變成了紅色大XX!

二、解決方案

後來查到原因是我將圖片資源路徑取名為中文,
且含有中括弧符號" [ "
改成全英文的路徑,
問題即解決。

[Android篇]cannot allocate an object of abstract type 'xxxxx' 錯誤

文章撰寫日期︰2013/03/19 00:02
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

沒有將父類的pure virtual method實作完成的NDK編譯錯誤畫面
今天在使用Android NDK編譯程式時,
終端機顯示cannot allocate an object of abstract type 'xxxxx' 的錯誤,
導致編譯動作停止。












二、解決方法

此問題主要是程式裡使用了pure virtual method。
在C++中,
父類別的標頭檔(.h)裡一旦有下列宣告
class A{
     public:
        virtual void some_method_of_A() = 0;
};

那麼這就是一個pure virtual method。
目的是向跟他繼承的子類別說︰
嘿!小子,來我們家要拜個碼頭!否則休想來我門下!

子類別一定要將其函式實作,
實作方式要先在該子類別的標頭檔(.h)底下,
跟C++表示你會實作父類別的pure virtual method︰
class SubA : public A{
     public:
        virtual void some_method_of_A();
}
而body(.cpp)檔實作如下︰
#include "SubA.h"

void SubA::some_method_of_A(){
     //implements something...
}

實作完成, 才能解決NDK的編譯問題。

[cocosbuilder篇]onAssignCCBMemberVariable綁定後取值遇到EXC_BAD_ACCESS

文章撰寫日期︰2013/03/18 15:00
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

使用cocos2d::extension::CCBMemberVariableAssigner的callback:
virtual bool onAssignCCBMemberVariable(cocos2d::CCObject * pTarget, cocos2d::CCString * pMemberVariableName, cocos2d::CCNode * pNode);
來將CocosBuilder和Cocos2d-X源碼綁定時,
取出來的CCLabelTTF*無法setString,
產生EXC_BAD_ACCESS的問題

我的原始碼是這樣子寫的︰
bool GameScene::onAssignCCBMemberVariable(cocos2d::CCObject * pTarget, cocos2d::CCString * pMemberVariableName, cocos2d::CCNode * pNode){
    //Bind variables
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "label_question", CCLabelTTF *,GameScene::label_question);
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "label_choice1", CCLabelTTF *,GameScene::label_choice1);
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "label_choice2", CCLabelTTF *,GameScene::label_choice2);
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "label_choice3", CCLabelTTF *,GameScene::label_choice3);

    label_question->setString("六隻眼睛、八條腿、四隻手、一條尾巴,請問這是什麼?");
    label_choice1->setString("兩個人騎在馬上");
    label_choice2->setString("妖怪");
    label_choice3->setString("不知道");

    return false;
}
label_choice3發生crash,報EXC_BAD_ACCESS錯誤。












二、解決方法

爬文後得知,
label_choice3還未完成初始化,
就使用setString產生了EXC_BAD_ACCESS。

解決方案建議再使用CocosBuilder的另一個callback回調函式︰
CCNodeLoaderListener的
virtual void onNodeLoaded(cocos2d::CCNode * pNode, cocos2d::extension::CCNodeLoader * pNodeLoader);


setString的方法,
也等到onNodeLoaded的callback回來了才攢寫
void GameScene::onNodeLoaded(cocos2d::CCNode * pNode, cocos2d::extension::CCNodeLoader * pNodeLoader){
    CCLog("into onNodeLoaded");

    //如果在onAssignCCBMemberVariable()就setString可能會遇到物件還沒創立完成的BAD_ACCESS
    label_question->setString(GameScene::question.c_str());
    label_choice1->setString(GameScene::choice1.c_str());
    label_choice2->setString(GameScene::choice2.c_str());
    label_choice3->setString(GameScene::choice3.c_str());
  
}
問題解決。

原來是太快使用這個綁定的變數了。

[cocos2d-x篇]static member EXC_BAD_ACCESS

文章撰寫日期︰2013/03/18 10:46
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

在Cocos2d-X裡希望將某個特定物件存放於static member裡,
以供日後實體成員使用,
但卻發生該static member EXC_BAD_ACCESS的問題。

二、解決方法

使用static member有幾個需要注意的新手事項︰

1.標頭檔(.h)裡要宣告靜態成員變數

static std::string question;
//宣告要使用一個string型別的question靜態成員變數

2.Body(.cpp)裡要初始化該成員變數

string GameScene::question;
/*如果沒有初始化,
會遇到
Undefined symbols for architecture armv7
的錯誤。*/

3.注意static member靜態成員變數的使用時機

有時候會發生在將某物件指針給static member,
卻造成static member為EXC_BAD_ACCESS的程式錯誤,
主要是欲被指派的指針物件可能都尚未初始化完成,
就將指針給了static member並做static member的存取,
如果注意程式建構的順序和時間,
掌握程式的呼吸方式,
基本上是不會有static member成為EXC_BAD_ACCESS的狀況的。

[cocos2d-x篇]CCLog的使用

cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

印出記憶體位置
CCSprite* sprite; 
CCLog("記憶體位址: %p",sprite);

//===顯示結果===
記憶體位址: 0x1ea2f000

印出布林值
bool flag; 
CCLog("布林結果: %d",flag);

//===顯示結果===
布林結果: 0

印出文字
CCLog("st: %s","我是文字");

//===顯示結果===
st: 我是文字

印出int值
int int_value = 5;
CCLog("int值: %d",int_value);

//===顯示結果===
int值: 5

[Android篇]NDK編譯Cocos2Dx時遇到error: undefined reference to 'xxxx'

文章撰寫日期︰2013/03/01 18:20
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

NDK編譯cocos2d-x時,
遇到了error: undefined reference to 'xxxScene::xxxSceneLayer()'的問題,
造成無法編譯。

二、解決辦法

請在Android.mk加入xxxScene的腳本即可解決。

[Android篇]NDK編譯Cocos2dx時遇到lhConfig.h : No such file or directory

文章撰寫日期︰2013/03/01 18:11
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

使用Android NDK編譯Cocos2d-X時,
遇到
jni/../../Classes/LevelHelper/Nodes/LHSprite.cpp:27:22: fatal error: lhConfig.h: No such file or directory
的問題。

二、解決辦法

在LHSprite.cpp 第27行,

#include "lhConfig.h"
改成
#include "../lhConfig.h"
其它還需要修改的地方為 LHBezier.cpp line 30

[SpriteHelper篇]SpriteHelper Physic Body Editor介紹(更新中)

文章撰寫日期︰2013/03/01 14:56
文章修改次數︰1
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

SpriteHelper Physic Body Editor介紹

is Bullet子彈屬性

在物理碰撞中,
子彈算是很特別的一個物理屬性,
除了擁有基本"和其它物件碰撞偵測"的功能以外,
還包括了"穿越其它物件"的性質。

Density物件密度

在物理引裡,
物件的重量是用Density來計算的,
密度越大,
這個物件也將越不容易被移動。

Friction摩擦係數

當物件跟其它物件發生碰撞後的摩擦反應,
0代表沒有摩擦(很咕溜),而1代表會產生很大的摩擦。

Resitution彈性係數

0代表以無彈性的方式產生碰撞,
1則是以完全彈性的方式產生物理碰撞。

[cocos2d-x篇]啟動多點觸控

文章撰寫日期︰2013/03/01:31
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

想要在虛擬手把(SneakyInput)同時擁有左右移動+發射子彈功能。
但卻發現cocos2d-x只有單點觸控。

二、解決辦法

此問題為cocos2d-x預設遊戲為單點觸控所致,
需要在AppController.mm裡didFinishLaunchingWithOptions函式中,
添加下列程式碼
// enable multi-touch!!
[__glView setMultipleTouchEnabled:YES]; 



耶!可以將主角做左右移動+同時發射子彈了!

[SpriteHelper篇]物件的三種物理屬性

文章撰寫日期︰2013/03/01 12:52
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1


一般來說物理引擎中物件分成3種屬性分別為

dynamic

對物件進行動態物體完全模擬。
它們可以被用戶手動移動,但是通常情況下會根據受力進行移動。動態物體可以和任何物體發生碰撞。動態物體總是擁有有限的非零質量。如果你嘗試設置動態物體的質量為零,它會自動設置一個1千克質量的物體。

kinematic

通過設置速度移動,對於力或者摩擦不作響應。
運動學物體在模擬環境中根據自身的速度進行移動。運動學物體自身不受力的作用。雖然用戶可以手動移動它,但是通常情況下我們會設置它的速度來進行移動。運動學物體的行為就像是有無限大的質量,儘管如此,在Box2D內部還是會對運動學物體的質量至反設置為零。運動學物體不能和其它靜態或運動學物體進行碰撞。

static

不會移動的物體,地板通常都是這個屬性。
在模擬環境下靜態物體是不會移動的,就好像有無限大的質量。在Box2D的內部會將質量至反,存儲為零。靜態物體可以被用戶手動移動。靜態物體有零速度。靜態物體不能和其它靜態或運動學物體進行碰撞。

文章出處︰ SoftWare MyZone

[LevelHelper篇]讓Sprite掉落時不會跌倒

文章撰寫日期︰2013/03/01 12:29
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

有時候我們希望物理引擎讓我們主角從天而降時,
不要產生物件rotation角度的改變,
(你總不會希望你的超級英雄從空而降時摔了個大根斗吧)

如果您使用了SpriteHelper,
那麼這個需求很快就能達成。
那就是在Physics裡將物件設為Fixed Rotation。
這樣子就能完成主角掉落時,
不會摔個頭破血流囉!

[LevelHelper篇]載入plhs檔時遇到CCArray.cpp報data->num為EXC_BAD_ACCESS的錯誤

文章撰寫日期︰2013/03/02 12:13
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

在cocos2d-x欲載入LevelHelper的輸出檔xxx.plhs時,
遇到了CCArray::count()函式中回報data->num為EXC_BAD_ACCESS的錯誤。

二、解決辦法

忘了將SpriteHelper的輸出檔xxx.pshs放入Xcode的Resource資料夾,
拖曳置入即可解決此問題。