跟着石頭哥哥學cocos2d-x(一)---2dx環境搭建 (win7)

以前一直忙於遊戲後臺的開發,也沒有時間整理,本人熱衷遊戲開發,現工做之餘準備整理2dx引擎方面的東西,方便你們學習以及本身備忘吧,廢話少說直接上菜: html

環境搭建分如下步走: java

1.開發環境搭建:java環境 +android環境 這個就不說了,這裏順帶說起下,這裏ide直接上idea,自行下載:http://www.jetbrains.com/idea/;好處你懂得;能夠自動導入2dx交叉編譯後須要的java lib文件,eclipse還得本身添加,後面一篇會講到跨平臺編譯到android中說起,順便分享下idea的使用心得; android

2.下載cygwin,我 下載的版本是1.7.2 :http://www.cygwin.com/,鏡像就用吧,http://mirrors.163.com/.help/cygwin.html,搭建交叉編譯環境,慢慢等吧,下載完畢了嗎? ok 配置下,進入安裝的目錄,切換到home下 有個bash_profile, 填寫你的ndk路徑 想這個: web


# base-files version 4.0-6
# ~/.bash_profile: executed by bash(1) for login shells.

# The latest version as installed by the Cygwin Setup program can
# always be found at /etc/defaults/etc/skel/.bash_profile

# Modifying /etc/skel/.bash_profile directly will prevent
# setup from updating it.

# The copy in your home directory (~/.bash_profile) is yours, please
# feel free to customise it to create a shell
# environment to your liking.  If you feel a change
# would be benifitial to all, please feel free to send
# a patch to the cygwin mailing list.

# User dependent .bash_profile file

# source the users bashrc if it exists
if [ -f "${HOME}/.bashrc" ] ; then
  source "${HOME}/.bashrc"
fi

# Set PATH so it includes user's private bin if it exists
# if [ -d "${HOME}/bin" ] ; then
#   PATH="${HOME}/bin:${PATH}"
# fi

# Set MANPATH so it includes users' private man if it exists
# if [ -d "${HOME}/man" ]; then
#   MANPATH="${HOME}/man:${MANPATH}"
# fi

# Set INFOPATH so it includes users' private info if it exists
# if [ -d "${HOME}/info" ]; then
#   INFOPATH="${HOME}/info:${INFOPATH}"
# fi
#ndk-root
NDK_ROOT=/cygdrive/d/commons/android_sdk/android-ndk-r8e
export NDK_ROOT
這裏要注意 個人ndk是放在d盤的哈,若是編譯的時候出現ndk找不到,別擔憂,將這個玩家放到你登陸電腦的賬號文件夾下面,譬如個人C:\Users\CHENLEI\。用戶文件夾下面;


3.下載coocs2d-x引擎源代碼,我是2.1.4版本,打開目錄,\cocos2d-x-    2.1.4\template\msvc\CCAppWiz.win32\Scripts\1033\找到腳本修改以下注意文件路徑: sql

function LogInfo(strInfo) {
    var FileSys = new ActiveXObject("Scripting.FileSystemObject");
    var strLogPath = "\\CCApplicationWizardLog.txt"
    var file = FileSys.OpenTextFile(strLogPath, 8, true);
    file.WriteLine(strInfo);   
    file.Close();        
}

function OnFinish(selProj, selObj) {
    try {
        // Create symbols based on the project name
        var strProjectPath = wizard.FindSymbol('PROJECT_PATH');
        var strProjectName = wizard.FindSymbol('PROJECT_NAME');

        //         var WizardVersion = wizard.FindSymbol('WIZARD_VERSION');
        //         if(WizardVersion >= 8.0)
        //         {
        //         }

        // Create symbols based on the project name
        var strSafeProjectName = CreateSafeName(strProjectName);
        wizard.AddSymbol("SAFE_PROJECT_NAME", strSafeProjectName);
        wizard.AddSymbol("NICE_SAFE_PROJECT_NAME", strSafeProjectName.substr(0, 1).toUpperCase() + strSafeProjectName.substr(1))
        wizard.AddSymbol("UPPERCASE_SAFE_PROJECT_NAME", strSafeProjectName.toUpperCase());

        // Set current year symbol
        var d = new Date();
        var nYear = 0;
        nYear = d.getFullYear();
        wizard.AddSymbol("CC_CURRENT_YEAR", nYear);
        wizard.AddSymbol("CC_CURRENT_DATE", d.toString());

        // Create project and configurations
        selProj = CreateCustomProject(strProjectName, strProjectPath);
        AddConfigurations(selProj, strProjectName);
        AddFilters(selProj);

        var InfFile = CreateCustomInfFile();
        AddFilesToCustomProj(selProj, strProjectName, strProjectPath, InfFile);
        AddPchSettings(selProj);
        InfFile.Delete();

        selProj.Object.Save();
    }
    catch (e) {
        if (e.description.length != 0)
            SetErrorInfo(e);
        return e.number;
    }
}

function CreateCustomProject(strProjectName, strProjectPath) {
    try {
        var strProjTemplatePath = wizard.FindSymbol('PROJECT_TEMPLATE_PATH');
        var strProjTemplate = '';
        var WizardVersion = wizard.FindSymbol('WIZARD_VERSION'); 
        if(WizardVersion >= 10.0)
            strProjTemplate = strProjTemplatePath + '\\default.vcxproj';
        else
            strProjTemplate = strProjTemplatePath + '\\default.vcproj';

        var Solution = dte.Solution;
        var strSolutionName = "";
        if (wizard.FindSymbol("CLOSE_SOLUTION")) {
            Solution.Close();
            strSolutionName = wizard.FindSymbol("VS_SOLUTION_NAME");
            if (strSolutionName.length) {
                var strSolutionPath = strProjectPath.substr(0, strProjectPath.length - strProjectName.length);
                Solution.Create(strSolutionPath, strSolutionName);
            }
        }

        // Create vcproj.user file
        var FileSys = new ActiveXObject("Scripting.FileSystemObject");
        var strUserTarget = "";
        if(WizardVersion >= 10.0)
            strUserTarget = strProjectName + ".win32.vcxproj.user";
        else
            strUserTarget = strProjectName + ".win32.vcproj.user";

        var strUserPath = FileSys.BuildPath(strProjectPath+"\\proj.win32", strUserTarget);

        var astrParentPath = new Array();
        astrParentPath[0] = strProjectPath;
        while (astrParentPath.length) {
            var strPath = astrParentPath.pop();
            var strParentPath = FileSys.GetParentFolderName(strPath);

            if (!FileSys.FolderExists(strParentPath)) {
                astrParentPath.push(strPath);
                astrParentPath.push(strParentPath);
                continue;
            }
            else {
                if (!FileSys.FolderExists(strPath)) {
                    FileSys.CreateFolder(strPath);
                }
                var strWin32ProjectPath = strPath + "\\proj.win32";

                if (!FileSys.FolderExists(strWin32ProjectPath)) {
                    FileSys.CreateFolder(strWin32ProjectPath);
                }
            }
        }

        var file = FileSys.OpenTextFile(strUserPath, 2, true);
        var strUserValue = "";
        if(WizardVersion >= 10.0)
            strUserValue = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"
                 + "<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n"
                 + "  <PropertyGroup>\r\n"
                 + "    <ShowAllFiles>false</ShowAllFiles>\r\n"
                 + "    <LocalDebuggerWorkingDirectory Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\Resources</LocalDebuggerWorkingDirectory>\r\n"
                 + "    <LocalDebuggerWorkingDirectory Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\Resources</LocalDebuggerWorkingDirectory>\r\n"
                 + "    <DebuggerFlavor Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">WindowsLocalDebugger</DebuggerFlavor>\r\n"
                 + "    <DebuggerFlavor Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">WindowsLocalDebugger</DebuggerFlavor>\r\n"
                 + "  </PropertyGroup>\r\n"
                 + "</Project>";
        else
            strUserValue = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"
                 + "<VisualStudioUserFile\r\n"
                 + "	ProjectType=\"Visual C++\"\r\n"
                 + "	Version=\"9.00\"\r\n"
                 + "	ShowAllFiles=\"false\"\r\n"
                 + "	>\r\n"
                 + "	<Configurations>\r\n"
                 + "		<Configuration\r\n"
			     + "			Name=\"Debug|Win32\"\r\n"
			     + "			>\r\n"
			     + "			<DebugSettings\r\n"
			     + "				WorkingDirectory=\"$(ProjectDir)..\\Resources\\\"\r\n"
			     + "			/>\r\n"
		         + "		</Configuration>\r\n"
		         + "		<Configuration\r\n"
			     + "			Name=\"Release|Win32\"\r\n"
			     + "			>\r\n"
			     + "			<DebugSettings\r\n"
			     + "				WorkingDirectory=\"$(ProjectDir)..\\Resources\\\"\r\n"
			     + "			/>\r\n"
		         + "		</Configuration>\r\n"
			     + "    </Configurations>\r\n"
                 + "</VisualStudioUserFile>";
        file.WriteLine(strUserValue);
        file.Close(); 

        // Create project file
        var strProjectNameWithExt = '';
        if(WizardVersion >= 10.0)
            strProjectNameWithExt = strProjectName + '.win32.vcxproj';
        else
            strProjectNameWithExt = strProjectName + '.win32.vcproj';

        var oTarget = wizard.FindSymbol("TARGET");
        var prj;
        if (wizard.FindSymbol("WIZARD_TYPE") == vsWizardAddSubProject)  // vsWizardAddSubProject
        {
            var prjItem = oTarget.AddFromTemplate(strProjTemplate, strProjectNameWithExt);
            prj = prjItem.SubProject;
        }
        else {
            prj = oTarget.AddFromTemplate(strProjTemplate, strProjectPath+"\\proj.win32\\", strProjectNameWithExt);
        }
        return prj;
    }
    catch (e) {
        throw e;
    }
}

function AddFilters(proj) {
    try {
        // Add the folders to your project
        var strSrcFilter = wizard.FindSymbol('SOURCE_FILTER');
        var group = proj.Object.AddFilter('source');
        group.Filter = strSrcFilter;

        strSrcFilter = wizard.FindSymbol('INCLUDE_FILTER');
        group = proj.Object.AddFilter('include');
        group.Filter = strSrcFilter;

        strSrcFilter = wizard.FindSymbol('RESOURCE_FILTER');
        group = proj.Object.AddFilter('resource');
        group.Filter = strSrcFilter;
    }
    catch (e) {
        throw e;
    }
}

// Configurations data
var nNumConfigs = 2;

var astrConfigName = new Array();
astrConfigName[0] = "Debug";
astrConfigName[1] = "Release";

function AddConfigurations(proj, strProjectName) {
    try {
        var nCntr;
        for (nCntr = 0; nCntr < nNumConfigs; nCntr++) {
            // Check if it's Debug configuration
            var bDebug = false;
            if (astrConfigName[nCntr].search("Debug") != -1)
                bDebug = true;

            // General settings
            var config = proj.Object.Configurations(astrConfigName[nCntr]);

            //             if(wizard.FindSymbol("CC_USE_UNICODE"))
            config.CharacterSet = charSetUnicode;
            //             else
            //                config.CharacterSet = charSetMBCS;

            var WizardVersion = wizard.FindSymbol('WIZARD_VERSION'); 
            if(WizardVersion >= 10.0) {
                config.OutputDirectory = '$(SolutionDir)$(Configuration).win32\\'
                config.IntermediateDirectory = '$(Configuration).win32\\';
            } else {
                config.OutputDirectory = '$(SolutionDir)$(ConfigurationName).win32'
                config.IntermediateDirectory = '$(ConfigurationName).win32';
            }

            // Compiler settings
            var CLTool = config.Tools('VCCLCompilerTool');

            //包含目錄
            var strAddIncludeDir = '.;..\\Classes';
			//這裏把全部的「cocos2dx安裝目錄」字樣替換成安裝路徑例如:C:\\cocos2dx
			strAddIncludeDir += ';D:\\commons\\cocos2d-x\\cocos2d-x-2.1.4\\extensions';
            strAddIncludeDir += ';D:\\commons\\cocos2d-x\\cocos2d-x-2.1.4\\cocos2dx';
            strAddIncludeDir += ';D:\\commons\\cocos2d-x\\cocos2d-x-2.1.4\\cocos2dx\\include';
            strAddIncludeDir += ';D:\\commons\\cocos2d-x\\cocos2d-x-2.1.4\\cocos2dx\\kazmath\\include';
            strAddIncludeDir += ';D:\\commons\\cocos2d-x\\cocos2d-x-2.1.4\\cocos2dx\\platform\\win32';
            strAddIncludeDir += ';D:\\commons\\cocos2d-x\\cocos2d-x-2.1.4\\cocos2dx\\platform\\third_party\\win32';
            strAddIncludeDir += ';D:\\commons\\cocos2d-x\\cocos2d-x-2.1.4\\cocos2dx\\platform\\third_party\\win32\\OGLES';
  
            if (wizard.FindSymbol('CC_USE_BOX2D')) {
                strAddIncludeDir += ';D:\\commons\\cocos2d-x\\cocos2d-x-2.1.4\\external';
            }
            if (wizard.FindSymbol('CC_USE_CHIPMUNK')) {
                strAddIncludeDir += ';D:\\commons\\cocos2d-x\\cocos2d-x-2.1.4\\external\\chipmunk\\include\\chipmunk';
            }
            if (wizard.FindSymbol('CC_USE_COCOS_DENSHION_SIMPLE_AUDIO_ENGINE')) {
                strAddIncludeDir += ';D:\\commons\\cocos2d-x\\cocos2d-x-2.1.4\\CocosDenshion\\include';
            }
            if (wizard.FindSymbol('CC_USE_LUA')) {
                strAddIncludeDir += ';D:\\commons\\cocos2d-x\\cocos2d-x-2.1.4\\scripting\\lua\\cocos2dx_support';
                strAddIncludeDir += ';D:\\commons\\cocos2d-x\\cocos2d-x-2.1.4\\scripting\\lua\\tolua';
                strAddIncludeDir += ';D:\\commons\\cocos2d-x\\cocos2d-x-2.1.4\\scripting\\lua\\lua';
            }
            CLTool.AdditionalIncludeDirectories = strAddIncludeDir;

            CLTool.UsePrecompiledHeader = pchNone;  // pchUseUsingSpecific;
            CLTool.WarningLevel = warningLevel_3;
            if (bDebug) {
                CLTool.RuntimeLibrary = rtMultiThreadedDebugDLL;
                CLTool.MinimalRebuild = true;
                CLTool.DebugInformationFormat = debugEditAndContinue;
                CLTool.BasicRuntimeChecks = runtimeBasicCheckAll;
                CLTool.Optimization = optimizeDisabled;
            }
            else {
                CLTool.RuntimeLibrary = rtMultiThreadedDLL;
                CLTool.ExceptionHandling = false;
                CLTool.DebugInformationFormat = debugDisabled;
            }

            var strDefines = GetPlatformDefine(config);
            strDefines += "_WINDOWS;STRICT;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS";
            if (bDebug)
                strDefines += "_DEBUG;COCOS2D_DEBUG=1;";
            else
                strDefines += "NDEBUG";
            CLTool.PreprocessorDefinitions = strDefines;

            // Disable special warning
            CLTool.DisableSpecificWarnings = "4267;4251;4244";

            // Linker settings
            var LinkTool = config.Tools('VCLinkerTool');
            LinkTool.SubSystem = subSystemWindows;
            LinkTool.TargetMachine = machineX86;
            if (bDebug) {
                LinkTool.LinkIncremental = linkIncrementalYes;
                LinkTool.GenerateDebugInformation = true;
            }
            else {
                LinkTool.LinkIncremental = linkIncrementalNo;
            }

            // 連接文件,默認所有連接(若是缺乏無關文件,能夠刪除鏈接)
            var strAddDepends = 'libExtensions.lib libcocos2d.lib  glew32.lib libJSBinding.lib libcurl_imp.lib libiconv.lib libjpeg.lib libpng.lib libwebp.lib sqlite3.lib pthreadVCE2.lib libtiff.lib lua51.lib';
            if (wizard.FindSymbol('CC_USE_BOX2D')) {
                strAddDepends += ' libBox2d.lib';
            }
            if (wizard.FindSymbol('CC_USE_CHIPMUNK')) {
                strAddDepends += ' libchipmunk.lib';
            }
            if (wizard.FindSymbol('CC_USE_COCOS_DENSHION_SIMPLE_AUDIO_ENGINE')) {
                strAddDepends += ' libCocosDenshion.lib';
            }
            if (wizard.FindSymbol('CC_USE_LUA')) {
                strAddDepends += ' liblua.lib';
            }
            LinkTool.AdditionalLibraryDirectories = '$(OutDir)';
            LinkTool.AdditionalDependencies = strAddDepends;

            // Resource settings
            var RCTool = config.Tools("VCResourceCompilerTool");
            RCTool.Culture = rcEnglishUS;
            RCTool.AdditionalIncludeDirectories = "$(IntDir)";
            if (bDebug)
                RCTool.PreprocessorDefinitions = "_DEBUG";
            else
                RCTool.PreprocessorDefinitions = "NDEBUG";

            // MIDL settings
            var MidlTool = config.Tools("VCMidlTool");
            MidlTool.MkTypLibCompatible = false;
            if (IsPlatformWin32(config))
                MidlTool.TargetEnvironment = midlTargetWin32;
            if (bDebug)
                MidlTool.PreprocessorDefinitions = "_DEBUG";
            else
                MidlTool.PreprocessorDefinitions = "NDEBUG";
            MidlTool.HeaderFileName = strProjectName + ".h";
            MidlTool.InterfaceIdentifierFileName = strProjectName + "_i.c";
            MidlTool.ProxyFileName = strProjectName + "_p.c";
            MidlTool.GenerateStublessProxies = true;
            MidlTool.TypeLibraryName = "$(IntDir)/" + strProjectName + ".tlb";
            MidlTool.DLLDataFileName = "";

            // Post-build settings
//            var PostBuildTool = config.Tools("VCPostBuildEventTool");
//            PostBuildTool.Description = "Performing copy resource from Resource to OutDir...";
//            PostBuildTool.CommandLine = "xcopy /E /Q /Y \"$(ProjectDir)Resource\\*.*\" \"$(OutDir)\"";
        }
    }
    catch (e) {
        throw e;
    }
}

function AddPchSettings(proj) {
    try {
        //         var files = proj.Object.Files;
        //         var fStdafx = files("StdAfx.cpp");
        // 
        //         var nCntr;
        //         for(nCntr = 0; nCntr < nNumConfigs; nCntr++)
        //         {
        //             var config = fStdafx.FileConfigurations(astrConfigName[nCntr]);
        //             config.Tool.UsePrecompiledHeader = pchCreateUsingSpecific;
        //         }
    }
    catch (e) {
        throw e;
    }
}

function DelFile(fso, strWizTempFile) {
    try {
        if (fso.FileExists(strWizTempFile)) {
            var tmpFile = fso.GetFile(strWizTempFile);
            tmpFile.Delete();
        }
    }
    catch (e) {
        throw e;
    }
}

function CreateCustomInfFile() {
    try {
        var fso, TemplatesFolder, TemplateFiles, strTemplate;
        fso = new ActiveXObject('Scripting.FileSystemObject');

        var TemporaryFolder = 2;
        var tfolder = fso.GetSpecialFolder(TemporaryFolder);

        var strWizTempFile = tfolder.Path + "\\" + fso.GetTempName();

        var strTemplatePath = wizard.FindSymbol('TEMPLATES_PATH');
        var strInfFile = strTemplatePath + '\\Templates.inf';
        wizard.RenderTemplate(strInfFile, strWizTempFile);

        var WizTempFile = fso.GetFile(strWizTempFile);

        return WizTempFile;
    }
    catch (e) {
        throw e;
    }
}

function GetTargetName(strName, strProjectName) {
    try {
        var strTarget = strName;

        var nIndex = strName.indexOf("root");

        if (nIndex >= 0) {
            strTarget = strName.substring(0, nIndex) + strProjectName + strName.substring(nIndex + 4, strName.length);
        }

        var strTemp = "../../../../../scripting/lua";
        nIndex = strTarget.indexOf(strTemp);
        if (nIndex >= 0) {
            strTarget = "Classes" + strTarget.substring(nIndex + strTemp.length, strTarget.length);
        }

        return strTarget;
    }
    catch (e) {
        throw e;
    }
}

function AddFilesToCustomProj(proj, strProjectName, strProjectPath, InfFile) {
    try {
        var strTemplatePath = wizard.FindSymbol('TEMPLATES_PATH');

        var strTpl = '';
        var strName = '';

        var strTextStream = InfFile.OpenAsTextStream(1, -2);
        while (!strTextStream.AtEndOfStream) {
            strTpl = strTextStream.ReadLine();
            if (strTpl != '') {
                strName = strTpl;
                var strTarget = GetTargetName(strName, strProjectName);
                var strTemplate = strTemplatePath + '\\' + strTpl;
                var strFile = strProjectPath + '\\' + strTarget;

                var bCopyOnly = true;  //"true" will only copy the file from strTemplate to strTarget without rendering/adding to the project
                var strExt = strName.substr(strName.lastIndexOf("."));
                if (strExt == ".h" || strExt == ".cpp" || strExt == ".c" || strExt == ".rc")
                    bCopyOnly = false;
                wizard.RenderTemplate(strTemplate, strFile, bCopyOnly);

                // don't add these files to the project
                if (strTarget == strProjectName + ".h" ||
                   strTarget == strProjectName + "ps.mk" ||
                   strTarget == strProjectName + "ps.def")
                    continue;

                proj.Object.AddFile(strFile);
            }
        }
        strTextStream.Close();
    }
    catch (e) {
        throw e;
    }
}

ok,回到目錄install-templates-msvc.bat安裝模版;切換到目錄xxx\cocos2d-x-2.1.4\template\msvc;安裝cocos2d-x新建項目插件; shell

3步很重要,這樣主要是避免拷貝引擎源碼,畢竟有點大不方便; bash

4.打開.sln開始編譯引擎,會生成相應的靜態和動態連接庫; less

5.建立新項目,將文件生成的靜態和動態連接庫(Debug.win32文件夾)拷貝到新建先項目中,ok,debug; eclipse

固然靜態和動態連接庫有的是必須的有的不是必須的,這個熟悉後就會明白了; curl

6.一下是運行效果:


打完收工;

本系列文章會持續更新... ...

相關文章
相關標籤/搜索