Archive for June, 2015

[Tutorial] build cocos2d-x as a static library in Mac Xcode

Saturday, June 27th, 2015

————————————-[English, 要看中文版請往下捲]—————————————-
[the story]
Recently, I create a new game project by using the latest cocos2d-x framework. I download the latest cocos2d-x 3.6. And I follow the tutorial to create a cocos2d-x project. I build & run the project successfully. But I notice a thing, if I clean the project or modify partial of my codes / resources. When building project, Xcode will compile whole source codes of cocos2d library again! It spends very very much time. It will compile 621 source files of cocos2d library. If I must wait so long every time when I just modify a piece of my code, how can I continue to write my fucking code!!?

So, I spent two days to search an available solution in the internet. I also ask a question in StackOverflow. There are still no answers. Finally, I find a post in a Japanese developer’s blog site. I follow his steps and build a cocos2d-x static library successfully. I import the static library into my game project, and it did works! okay, let me show you the screenshot first. it’s truely working!

Okay, let’s enter the main tutorial. The content is mainly translated from this Japanese developers’s post.

[Tutorial Begin]

Create a new cocos2d-x project

First, create a new project. Go to the root directory of the cocos2d-x library (i.e. /Users/YourName/Library/cocos2d-x-3.6).
Execute the following command in Mac command line.

cocos new HelloWorld -p com.CompanyName.HelloWorld -l cpp

open Xcode project file.

open HelloWorld/proj.ios_mac/HelloWorld.xcodeproj
Modify Build Settings

choose cocos2d_libs.xcodeproj and select the Target: libcocos2d iOS. modify its Build Settings.
The default values should be the same as the following, if not, modify them.

Architectures => Standard architectures
Build Active Architecture Only => No

In the “Valid Architectures” field, add two additional value: i386 and x86_64. This is for the Xcode simulator, to make the library runnable .

The final values should have five: arm64, armv7, armv7s, i386, x86_64. as the screenshot:
Using Rakefile to build Static Library
cd HelloWorld/cocos2d/build
vi Rakefile

input the following content:

PROJECT_PATH = "./cocos2d_libs.xcodeproj"
TARGET_NAME="'libcocos2d iOS'"
OUTPUT_DEBUG="tmp/iphonesimulator"
OUTPUT_RELEASE="tmp/iphoneos"
OUTPUT_LIB="./lib"
directory OUTPUT_LIB

desc "using lib command to build a static library"
task "lib" do
    sh "xcodebuild -project #{PROJECT_PATH} -configuration Release -sdk iphonesimulator8.3 -target #{TARGET_NAME} -arch i386 -arch x86_64 TARGET_BUILD_DIR=#{OUTPUT_DEBUG} BUILT_PRODUCTS_DIR=#{OUTPUT_DEBUG} clean build"

    sh "xcodebuild -project #{PROJECT_PATH} -configuration Release -sdk iphoneos8.3 -target #{TARGET_NAME} -arch armv7 -arch armv7s -arch arm64 TARGET_BUILD_DIR=#{OUTPUT_RELEASE} BUILT_PRODUCTS_DIR=#{OUTPUT_RELEASE} clean build"
end

desc "using lipo command to link static libraries for each device to one combined library file"
task "lipo" => OUTPUT_LIB do

    Dir.glob("#{OUTPUT_RELEASE}/*"){|path|
        p path
        file = File.basename(path)

        sh "lipo '#{OUTPUT_DEBUG}/#{file}' '#{OUTPUT_RELEASE}/#{file}' -create -output '#{OUTPUT_LIB}/#{file}'"
    }
end
begin building static library, execute the following command.

rake lib

The whole process will spend about 10 ~ 20 minutes, depends on your working machine. If the procedure stops within a minute, it might be error occurring. For me, I meet a error that process can’t find the correct iphonesimulator8.2 and iphoneos8.2 directory, so I must modify them to the correct value in my environment.

After building static library successfully, you will see two libcocos2d iOS.a files in the “tmp” directory. One is for real device, the other is for simulator. So, we must do one more step to pack these two files to one merged .a file. Execute the following command.

rake lipo

This will take couple of seconds. After done, you will see a “lib” directory which contains a libcocos2d iOS.a file, its size is about 117.9 MB. This is the static library file we want.

Import Static Library to Your Project

choose .xcodeproj file -> Build Phases -> Link Binary With Libraries. Delete all red-font libraries, and re-add them.

Add the static library which we just built to the library list.
Delete “libcocos2d Mac” and “libcocos2d iOS” target in the project setting (It’s the reason why building project so fucking slow). Keep the cocos2d source code files alive for that we can view the code in the future.
Congratulations! Enjoy the jet building speed!

Now you can clean whole project and rebuild it. You will see Xcode won’t compile cocos2d source files any more. It only compile the files in your own project. The building speed will be 50 times comparing with the original, I guess.

That’s all … good luck! :mrgreen:

————————————-[中文]—————————————-
[前言]
最近我要開一個新遊戲專案,想改用最新版的cocos2d-x來做。我去下載了最新版的cocos2d-x 3.6後,照著這個教學頁面成功開了一個新的cocos2d-x project。在Xcode也build成功跑出畫面了。但我發現只要有做過clean整個project的動作,甚至只是改了一些project裡自己寫的code。在build project時,有時候Xcode會誤以為你有去動到cocos2d library的source code,因此常常重新去compile cocos2d library的source code。總共有621個files要重build,需要蠻久的一段時間(大概3~4分鐘)。如果每次只是改個小東西,就要花這麼多時間等它重build,我還要不要寫code!!?

因此這兩天,我花了很多時間不斷上網找解法,在StackOverflow上問問題。都沒有找到我要的答案。最後,終於在今天讓我找到一個日本開發者的教學文章,成功build出cocos2d-x的static library,並import到我自己的project裡跑出結果。好,先讓你們看個畫面,代表我不是在虎爛的…

以下進入正題,內容主要是翻譯自這篇日本教學文章

[教學開始]

建立新專案

首先,要開一個cocos2d的專案。到你下載並解壓好的cocos2d-x根目錄(例: /Users/YourName/Library/cocos2d-x-3.6)執行以下指令

cocos new HelloWorld -p com.CompanyName.HelloWorld -l cpp

接著打開Xcode project檔。

open HelloWorld/proj.ios_mac/HelloWorld.xcodeproj
修改Build Settings

選擇cocos2d_libs.xcodeproj,再選擇Target: libcocos2d iOS,修改其Build Settings。
應該預設值就是下面寫的值了,如果不是,請改為下面的值。

Architectures => Standard architectures
Build Active Architecture Only => No

另外在Valid Architectures 那欄追加兩個值: i386 和 x86_64。這是為了讓build出來的Library也可以在模擬器上跑。

修改後的結果應該有五個值: arm64, armv7, armv7s, i386, x86_64
完整結果如圖片所示:
使用Rakefile來建立Static Library
cd HelloWorld/cocos2d/build
vi Rakefile

內容輸入以下程式碼:

PROJECT_PATH = "./cocos2d_libs.xcodeproj"
TARGET_NAME="'libcocos2d iOS'"
OUTPUT_DEBUG="tmp/iphonesimulator"
OUTPUT_RELEASE="tmp/iphoneos"
OUTPUT_LIB="./lib"
directory OUTPUT_LIB

desc "using lib command to build a static library"
task "lib" do
    sh "xcodebuild -project #{PROJECT_PATH} -configuration Release -sdk iphonesimulator8.3 -target #{TARGET_NAME} -arch i386 -arch x86_64 TARGET_BUILD_DIR=#{OUTPUT_DEBUG} BUILT_PRODUCTS_DIR=#{OUTPUT_DEBUG} clean build"

    sh "xcodebuild -project #{PROJECT_PATH} -configuration Release -sdk iphoneos8.3 -target #{TARGET_NAME} -arch armv7 -arch armv7s -arch arm64 TARGET_BUILD_DIR=#{OUTPUT_RELEASE} BUILT_PRODUCTS_DIR=#{OUTPUT_RELEASE} clean build"
end

desc "using lipo command to link static libraries for each device to one combined library file"
task "lipo" => OUTPUT_LIB do

    Dir.glob("#{OUTPUT_RELEASE}/*"){|path|
        p path
        file = File.basename(path)

        sh "lipo '#{OUTPUT_DEBUG}/#{file}' '#{OUTPUT_RELEASE}/#{file}' -create -output '#{OUTPUT_LIB}/#{file}'"
    }
end
開始製作static library,輸入以下command。

rake lib

整個過程大概需要10~20分鐘,要看你的機器的執行速度。如果不到一分鐘就停了,那可能是有出現錯誤。像我是遇到找不到 iphonesimulator8.2 和 iphoneos8.2 這兩個資料夾,要改成你的執行環境正確的值。

完成build static library後,你會在tmp資料裡看到兩個libcocos2d iOS.a檔,一個是給實機device跑的,另一個是給模擬器跑的。因此我們還要再做最後一步,將這兩個.a檔打包成為一個merged的.a檔。執行下面的指令。

rake lipo

這大概只需要幾秒鐘就能跑完,跑完之後你會看到一個lib資料。裡面有一個libcocos2d iOS.a檔,檔案大小約 117.9 MB。這就是最終我們要的static library檔了。

Import Static Library到你的專案

選擇.xcodeproj檔 -> Build Phases -> Link Binary With Libraries。將紅字的library全都砍掉,重新加。

將剛剛做出來的static library加進Library清單裡。
然後將你的project裡的cocos2d_libs.xcodeproj裡的 libcocos2d Mac 和 libcocos2d iOS 這兩個Target都刪除掉(就是這兩個Target才導致build project速度變慢!)。cocos2d library裡的source code則留著,以方便日後寫code時可以回頭查看。
完成了! 享受飛快的build project速度吧!

現在你可以Clean整個Project,再重build。你會發現Xcode不會再去compile cocos2d原本的source files了。只會去compile你自己project裡的files。速度大概是原本的50倍以上,我猜~

That’s all … good luck! :mrgreen:

人類,活著的目的是什麼?

Wednesday, June 24th, 2015

最近看到的影片 – MAN (人類)

這影片做的真好~ 很諷刺….

我必須要誠實說出我內心的心聲,這真的是我不想生小孩的原因之一。記得駭客任務第一集的agent smith就有說過一句話: 「人類,表現出來的行為很接近另一種生物 – 病毒。病毒會不斷得繁殖直到把資源用盡。」。而最近的電影「金牌特務」裡的大魔頭也說過一樣的話: 「對地球而言,人類就像是病毒一樣,而這個星球是宿主。這種情況最後只會導致兩種結果: 一.病毒殺死宿主。二.宿主殺死病毒。」。這兩個電影裡的魔頭對人類做出的事不見得是對的,但我覺得他們講的話在邏輯上是對的。如果人類不斷得繁殖,現在人口60億,過五十年後人口變100億,再過100年後變200億。你覺得以現在地球的資源,可以撐多久呢? 如果人類沒辦法像植物一樣,只要靠水和陽光就能活的話,難道你覺得地球上的石油和金屬永遠挖不完嗎? 到時候唯一的解決方法,兩條路 – 要碼就減少人口,要碼就只能移民到其他星球。問題是,你確定150年後,人類就有辦法移民到其他星球嗎? 人類有這個技術嗎? 如果這兩條路都做不到,那所有使用過的東西起碼要能100%完全回收再利用才有可能撐久一點。

幾年前剛結婚時,我爸媽還有岳父母有次一起吃飯,就問我:「你為什麼不想生小孩?」。我當時腦中只想到一個答案: 「因為地球的人口已經太多了,不差我再多生一個小孩。」。當時四個長輩聽到,都以為我是在說玩笑話,不當一回事。我想,很多人聽到我這樣回答,應該也會覺得我是在說笑吧。接著我爸又說: 「如果每個人都像你一樣不生小孩,那中國人不就絕種了?」。我說: 「絕種就絕種,有什麼差嗎? 這個世界上又不是只有中國人。整個宇宙裡也不是只有地球人。」。我真的覺得就算人類全都絕種了也沒差啊。

有時夜深寂靜時我常常會想: 「一個人為什麼要活在這世界上?」(別誤會,我沒有想要自殺… XD)。如果人類只能存活短短的幾十年,那這幾十年間,我們要做什麼? 做什麼才是真的有意義的呢? 其實到現在我還是沒有真正找到答案。目前的人生目標也許是做出好玩的遊戲,讓很多人因為玩了我的遊戲而獲得快樂。然後可以藉此賺一些小錢,讓自己也活得快樂。但其實過了一百年後,我現在所做的這些事,根本就灰飛湮滅了,有沒有做過這些事,有差嗎? 我現在所做的事,充其量只是一個生物的基本求生本能而已: 賺錢、活下去。

電影「露西」裡的教授講過一句話: 「如果你問我生命的本質是什麼,我會說: 把學到的知識傳播下去。這是這個世界上所有的生物都在做的事。」。也許,人類就只是這個宇宙中的一個”物質”而已。就像所有的物質一樣,有他們自己的行為表現,水遇到熱就會蒸發,電遇到金屬就會傳導,不必做什麼解釋。雖然我覺得人類就算絕種了也沒差,也覺得現在不管做什麼事,過了一百年後好像也沒差(我沒有偉大到像愛因斯坦那樣發明個什麼定律,可以影響一百年後的人們。)。但我又覺得,一個人如果還活著,那就不應該浪費自己的時間。雖然不會影響到一百年後的人們,但會影響到你現在周遭的每一個人。與其漫無目的虛度人生,還不如像 Ryan(搶救雷恩大兵) 一樣,好好活好自己的人生。有點矛盾,嗯,我自己也這樣覺得。也許,這就是人蔘吧~ ╮(╯_╰)╭

人生就是充滿了各種矛盾的一條路… 你無法回頭,你只能不斷的勇敢往前走…