(原創,轉載注明出處:http://www.cnblogs.com/binxindoudou/p/4017975.html )
一、實驗背景
cocos2d-x已經發展的相對完善了,從項目的創建、編譯、運行到最后的打包都有相應的便捷工具,開發者只需要關注自己的游戲邏輯代碼即可,這一點很贊,可是傻瓜式的編程,讓我至今還只停留在使用vs建個空項目做個小demo的階段,我根本不知道cocos2d-x項目究竟是如何組織的,那些項目與項目之間的關系,那些庫文件的引用,那些屬性的配置,那些路徑設置,那些宏定義究竟是在哪里,為什么會出現兩個窗口,一大片屬性究竟是什么意思,,所以很有必要研究一下。現在把實驗過程同大家交流一下,有什么說的片面或不對的地方,歡迎大家提出,一同進步。
二、實驗目標
1.使用vs從一個空項目配置成為一個可以運行cocos2d-x官方lua demo的項目。
2.學習vs項目屬性配置相關知識。
三、實驗條件
Virtual Studio 2013 Update3 、 cocos2d-x-3.2 Jul.17 2014(將其解壓在桌面上,安裝配置好cocos2d-x)
四、實驗步驟與注意事項
1.使用vs在桌面上創建一個win32控制台應用程序的空項目,我這就叫test,按照下圖二的目錄結構進行創建,其中文件( 包括資源文件)都是從引擎根目錄下找到並復制到項目中的,這里的cpps就是所謂的“自己編寫的cpp代碼”。
(1)默認vs的空項目的解決方案和項目名稱相同,一個解決方案可以包含多個項目,一個解決方案對應一個程序,test項目默認為核心,其他項目為其服務,生成lib和dll。頭文件、源文件、資源文件三個是文件篩選器,相當於邏輯目錄,只是便於管理文件,與文件的物理路徑無關,我習慣將其對應起來。外部依賴項不由自己控制,包含外部庫的頭文件。上圖三四是我配置完成后的項目,包含cpps(自定義cpp邏輯代碼),luas(自定義的lua邏輯代碼),res(程序的資源文件)。
(2).sdf是一個數據庫文件,編譯時自動生成,存放工程信息,與代碼提示相關。.sln文件是解決方案文件,保存的是解決方案信息,是一個解決方案中不同項目之間的關系文件。
2.項目-》屬性管理器,右鍵Debug|win32,添加現有屬性表,從cocos2d-x引擎根目錄(以下稱$(EngineRoot))下找到 $(EngineRoot)\cocos\2d\
cocos2d_headers.props和cocos2dx.props兩個文件添加。
3.回到解決方案管理器,右鍵test->屬性,c/c++->常規->附加包含目錄,添加上如下目錄
$(EngineRoot)cocos\scripting\lua-bindings\auto $(EngineRoot)cocos\scripting\lua-bindings\manual $(EngineRoot)cocos\audio\include $(EngineRoot)external\lua\lua $(EngineRoot)external\lua\tolua $(EngineRoot)external\chipmunk\include\chipmunk
(1)附加包含目錄:其實就是“自己編寫的cpp代碼”需要查找頭文件和原文件的位置。
(2)$(EngineRoot)是在cocos2d_headers.props和cocos2dx.props中定義的
4.預處理器,這一步是定義cocos2dx中類似平台_WINDOWS這樣的代碼(我說我為什么有的時候不明白這個究竟是從哪定義到的,這里恍然大悟)
懶死,復制吧,嘿嘿
WIN32 _WINDOWS STRICT _CRT_SECURE_NO_WARNINGS _SCL_SECURE_NO_WARNINGS_DEBUG COCOS2D_DEBUG=1
5.附件庫目錄
$(EngineRoot)external\lua\luajit\include\;$(EngineRoot)external\lua\luasocket\;$(EngineRoot)external\lua\tolua\;$(EngineRoot)external\xxtea\;$(EngineRoot)cocos\scripting\lua-bindings\;$(EngineRoot)external\ConvertUTF\;$(EngineRoot)external\edtaa3func\;$(EngineRoot)external\tinyxml2\;$(EngineRoot)external\unzip\;$(EngineRoot)external\xxhash\;$(EngineRoot)3d\;$(EngineRoot)base\;$(EngineRoot);$(EngineRoot)deprecated\;$(EngineRoot)math\;$(EngineRoot)physics\;$(EngineRoot)platform\;$(EngineRoot)renderer\;$(EngineRoot)2d\;$(EngineRoot)cocos\audio\include\;$(EngineRoot)cocos\audio\win32\;$(EngineRoot)cocos\editor-support\cocosbuilder\;$(EngineRoot)external\json\;$(EngineRoot)external\json\internal\;$(EngineRoot)cocos\editor-support\cocostudioActionTimeline\;$(EngineRoot)cocos\editor-support\;$(EngineRoot)cocos\editor-support\spine\;$(EngineRoot)cocos;etwork\;$(EngineRoot)cocos\storage\local-storage\;$(EngineRoot)cocos\ui\;$(OutDir);%(AdditionalLibraryDirectories)
(1)這個是我從$(EngineRoot)中復制的。
(2)附加庫目錄->添加第三方庫需要查找的目錄,這一步之后, 外部依賴項就自動添加了,打開來看會發現里邊有好多.h,以后使用#include "*****.h"就無憂了。
6.附加依賴項
(1)附加依賴項,就是所謂的庫文件了lib,靜態庫文件,其實有了他們,就相當於是有了第五步中的.h們對應的.cpp們(我是這么理解的),到時候“寫入”(我這不懂,姑且這么叫吧)到exe中。
(2).dll是動態鏈接庫,是在運行時才能加載的,不會被寫入最終文件.exe中。所以經常見到綠色軟件.exe外部有他們。
7.兩個小窗口(這里還在研究中,不知道這里對應那塊代碼,這樣設置就對了)
8.預生成事件
(1)生成事件分為三種,預先生成事件=》編譯之前執行的事件;預連接事件=》鏈接之前的事件;后期生成事件=》編譯之后的事件
(2)這里用到的是命令行代碼,我主要是復制了一些文件
//預先生成事件
if not exist $(PorjectDir) mkdir $(ProjectDir) xcopy "$(EngineRoot)cocos\scripting\lua-bindings\script\*.lua" "$(ProjectDir)" /e /y
//預連接事件
if not exist $(OutDir) mkdir $(OutDir) xcopy "$(EngineRoot)build\$(Configuration).win32\*.lib" "$(OutDir)" /e /y xcopy "$(EngineRoot)build\$(Configuration).win32\*.dll" "$(OutDir)" /e /y
//后期生成事件
if not exist $(OutDir) mkdir $(OutDir)
if not exist $(OutDir)res\ mkdir $(OutDir)res\
if not exist $(OutDir)luas\ mkdir $(OutDir)luas\
xcopy "$(ProjectDir)*.lua" "$(OutDir)" /e /y
xcopy "$(ProjectDir)*.dll" "$(OutDir)" /e /y
xcopy "$(ProjectDir)res\*" "$(OutDir)\res" /e /y
xcopy "$(ProjectDir)luas\*" "$(OutDir)\luas\" /e /y
從根目錄復制已經編譯好的動態和靜態庫到這個空項目工程中
(3)$(OutDir) ===》C:\Users\username\Desktop\test1\Debug,最后的生成目錄,完成后可以單獨拷貝出來運行。
(4)$(Configuration),因Debug版本和Release版本而異
(5)$(PorjectDir),Debug工程目錄,調試目錄,工作目錄
9.可以先編譯一次,然后將
在生成中使用設置為否,以免每次都復制這么多文件(如果沒有什么變化的話,這一步可以手動進行復制)。
10.看看效果吧
11.完成了。
(原創,轉載注明出處:http://www.cnblogs.com/binxindoudou/p/4017975.html )