在 Mac 上使用 C++ 为 Android 编写游戏 - 设置






4.80/5 (5投票s)
一份循序渐进的初学者指南,介绍如何在 Mac 上使用 Cocos2d-X 3.2 为 Android 设置开发环境来编写游戏。
引言
如果您能编写一个程序,然后让它在 Android、Windows Phone、Windows 桌面、Mac 和 iOS 上运行,那不是很棒吗?
借助 Cocos2d-x(撰写本文时为 V3.2),现在可以开发真正的原生跨平台 C++ 游戏。
虽然代码库可以跨平台使用,但开发环境必然不同——通常 Windows 上的 Visual Studio 用于 Windows Phone,Mac 上的 XCode 用于 i-Devices,以及几乎所有平台上的 Eclipse 用于 Android。
在 Mac 上设置用于开发 iOS 的开发环境非常简单。
在 Mac 上设置用于开发 Android 的开发环境并不那么简单,而且文档也不完善。因此,本文应运而生!
背景
移动应用开发中一个常见的问题是跨平台开发。您是用 Objective-C、C++(或 C#)和 Java 编写相同的内容吗?您坚持使用 HTML 和 Javascript 吗?
我选择专门研究 Cocos2d-X,因为它允许我编写一个单一的代码库,使用 C++,可以在几乎所有平台上运行。
由于我平时使用 Mac,我首先在 Xcode 中使用了 Cocos2d-X,为 iOS 编译——整个过程很简单(创建项目,在 XCode 中打开,构建项目,部署项目)。
然而,设置用于构建 Android 的开发环境比预期的要困难得多。我的意思是,困难到我一度放弃了。
因此,当我最终弄好时,我认为有义务为其他开发者记录下这个过程。
如何使用本文
我写这篇文章是为了给像我一样不熟悉 Android 开发的人提供一个循序渐进的指南。有一些窍门对新手玩家来说很有用,也有一些陷阱需要避免,我已尽力指出。
在跟随本文进行操作时,您需要输入的一些信息将涉及 Mac 上的路径名。因为您的用户名几乎肯定不是 Maxxx,所以您无法直接复制文章中的文本。相反,我建议使用 Terminal 的一个很棒的功能:您可以将文件或文件夹从 Finder 窗口拖放到 Terminal 窗口,它会自动插入路径。
关注点
在我设置好开发环境的过程中,我经常咒骂——主要是因为可用的帮助和建议往往来自经验丰富的 Android 开发者,他们会用“只需安装驱动程序即可”来回答千言万语的问题,而不解释是哪个驱动程序,或者应该将它们安装在我的 Android 设备上还是我的 Mac 上!
事实上,您不需要在任何地方安装任何驱动程序!
希望您不会如此困惑——但如果您确实感到困惑,请随时给我发送消息,我会*尽力*克制住直接告诉您“安装驱动程序”的诱惑:)
历史
发布 1.
下载次数
要设置您的 Mac 以便为 Android 进行开发,您需要下载一些东西。
最简单的方法是将它们全部下载到一个您将为 Android 进行开发的文件夹中。我正在使用一个名为 AndroidDevelopment 的文件夹。
不包括 XCode,这里有近 1GB 的下载内容,所以您可能想先开始下载,然后去喝杯茶(伯爵红茶。不加糖,如果您问的话),然后再继续。
** 在使用的任何路径名中都不能有空格 **
Cocos2d-X 3.2
http://www.cocos2d-x.org/download
我建议下载最新的稳定版 3.x 版本(目前是 3.2)
** 确保您下载的是 cocos2d-x 而不是 cocos2d-JS **
Eclipse ADT 和 Mac 版 Android SDK
https://developer.android.com.cn/sdk/index.html
ADT 是 Android Development Tools 的缩写——所以我们这里得到的是一个配置用于 Android 开发的 Eclipse 版本(一个开源的通用 IDE)。
有些人不喜欢 Eclipse。我不敢说我了解得足够多以至于可以评论,但在我的例子中,我主要的 Cocos2dx 开发环境是 Max/iOS——所以我只需要使用 Eclipse 进行特定平台的调整。
Android NDK
https://dl.google.com/android/ndk/android-ndk-r9d-darwin-x86_64.tar.bz2
NDK 是 Native Development Kit 的缩写——即原生代码而不是 Java。
这里的链接直接指向压缩文件(更准确地说,是 tar-bz2 压缩文件),而不是页面,因为您需要下载 r9d 版本。
** 不要尝试下载最新版本(10.x),因为它无法与 cocos2d-x 一起使用 **
如果您对问题感兴趣,它们记录在 http://cocos2d-x.org/news/307,所以您在阅读本文时可能已经修复了……
Apache ANT
https://ant.apache.ac.cn/bindownload.cgi
Apache Ant 是“一个 Java 库和命令行工具,用于构建软件”,所以您现在知道了。
我使用的是 1.9.4,这是最新版本。页面上有如何验证您下载的内容的说明——如果您愿意,请遵循它们,或者就像我一样,碰碰运气:)
XCode
http://itunes.apple.com/us/app/xcode/id497799835?ls=1&mt=12
XCode 是从 Apple App Store 免费下载的,如果您是 Mac 开发者,您肯定有一份副本。如果没有,您将需要它。我目前正在运行 XCode 5.1.1。
Java
http://www.java.com/en/download/index.jsp
您需要安装 Java。我几乎忘了这个,因为我的 Mac 上一直安装着它——但如果您没有,只需获取最新版本并按照提示操作……
安装
XCode 将从 App Store 安装。
对于其他软件,只需在 Finder 中打开它们所在的文件夹,然后逐个双击。您将获得四个文件夹(每个 zip 文件一个)。现在可以安全地移动或删除 zip 文件以腾出一些磁盘空间。
现在是时候移动它们了,如果您认为可能需要——因为稍后我们将设置环境变量来指向这些路径,并且更改它们的位置将更加复杂。
** 请记住,您解压这些文件夹的文件夹的路径名中不能有任何空格 **
设置 cocos2d-x
打开一个 Terminal 窗口,然后切换到 cocos2d-x-3.2 目录。(请记住,如果您打开了 Finder 窗口,您可以输入 'CD
',然后将 cocos2d-x-3.2 文件夹拖到 Terminal 窗口)
cocos2d-x 的设置程序顾名思义就是 setup!它是一个 Python 脚本,但我们不会因此而排斥它。
输入 ./setup.py
脚本将运行并要求您“Please enter the path of NDK_ROOT”(请输入 NDK_ROOT 的路径)
这是您从 Zip 文件(android-ndk-r9d)中提取的文件夹的路径名——为了确保我获得正确的路径,我*总是*将文件夹从打开的 Finder 窗口拖到 Terminal 窗口。当您将文件名拖到 Terminal 窗口时,它会在后面添加一个空格。如果您执行此操作,**请务必删除路径末尾的任何空格**,否则将导致错误。
如果您出错了,您可以安全地终止进程(ctrl-d
)并使用 setup.py 重新开始。
接下来它会问您“Please enter the path of ANDROID_SDK_ROOT”(请输入 ANDROID_SDK_ROOT 的路径)。这个 SDK 文件夹位于您解压的 ADT Bundle 文件夹内。
所以您可以将该文件夹拖到您的 Terminal 窗口。
** 请务必删除路径末尾的任何空格 **
现在将要求您“Please enter the path of ANT_ROOT”(请输入 ANT_ROOT 的路径)。
这是 apache-ant 的 'bin' 文件夹。
因此,再次将 bin 文件夹拖到终端窗口,删除任何尾随空格,然后按 Enter。
** 请务必删除路径末尾的任何空格 **
设置告诉您做的最后一件事是“执行命令:‘source /Users/maxxx/.bash_profile’ 使添加的系统变量生效。”
如果您在设置运行时阅读了屏幕,您会看到它只是设置了一些环境变量,以便知道如何查找文件。它更新了 bash_profile,它在您登录时运行——所以现在运行它就省去了注销和重新登录的麻烦!
输入(或复制/粘贴)终端中显示的命令(例如,source /Users/maxxx/.bash_profile)。除非您的用户名是 maxxx,否则它将与我的不同。
这是我的整个会话,我输入的那些部分用粗体显示。
Maxxxs-iMac:~ maxxx$ cd /Users/maxxx/Documents/AndroidDevelopment/cocos2d-x-3.2 Maxxxs-iMac:cocos2d-x-3.2 maxxx$ ./setup.py Setting up cocos2d-x... ->Check environment variable COCOS_CONSOLE_ROOT ->Search for environment variable COCOS_CONSOLE_ROOT... ->COCOS_CONSOLE_ROOT is found : /Users/maxxx/Desktop/Android ->Update variable COCOS_CONSOLE_ROOT in files ['.bash_profile', '.bash_login', '.profile'] ->File /Users/maxxx/.bash_profile updated! ->Configuration for Android platform only, you can also skip and manually edit "/Users/maxxx/.bash_profile" ->Check environment variable NDK_ROOT ->Search for environment variable NDK_ROOT... ->NDK_ROOT not found ->Search for command ndk-build in system... ->Command ndk-build not found ->Please enter the path of NDK_ROOT (or press Enter to skip):/Users/maxxx/Documents/AndroidDevelopment/android-ndk-r9d -> Add NDK_ROOT environment variable... ->Added NDK_ROOT=/Users/maxxx/Documents/AndroidDevelopment/android-ndk-r9d ->Check environment variable ANDROID_SDK_ROOT ->Search for environment variable ANDROID_SDK_ROOT... ->ANDROID_SDK_ROOT not found ->Search for command android in system... ->Command android not found ->Please enter the path of ANDROID_SDK_ROOT (or press Enter to skip):/Users/maxxx/Documents/AndroidDevelopment/adt-bundle-mac-x86_64-20140702/sdk -> Add ANDROID_SDK_ROOT environment variable... ->Added ANDROID_SDK_ROOT=/Users/maxxx/Documents/AndroidDevelopment/adt-bundle-mac-x86_64-20140702/sdk ->Check environment variable ANT_ROOT ->Search for environment variable ANT_ROOT... ->ANT_ROOT not found ->Search for command ant in system... ->Command ant not found ->Please enter the path of ANT_ROOT (or press Enter to skip):/Users/maxxx/Documents/AndroidDevelopment/apache-ant-1.9.4/bin -> Add ANT_ROOT environment variable... ->Added ANT_ROOT=/Users/maxxx/Documents/AndroidDevelopment/apache-ant-1.9.4/bin A backup file "/Users/maxxx/.bash_profile.backup" is created for "/Users/maxxx/.bash_profile". Please execute command: "source /Users/maxxx/.bash_profile" to make added system variables take effect Maxxxs-iMac:cocos2d-x-3.2 maxxx$ source /Users/maxxx/.bash_profile Maxxxs-iMac:cocos2d-x-3.2 maxxx$
检查设置
setup.py 检查环境变量,如果找不到它们才会要求输入。所以重新运行设置不应该会提示您再次输入路径。如果提示,只需再次输入即可!
创建新的 Cocos2d-x 项目
Cocos2d-x 有一个用于创建新项目的命令行选项。所有项目在创建时都是跨平台的(也就是说,它为 Windows、iOS、Mac、Android 创建了一个空项目,然后共享文件位于自己的文件夹中,供您随意使用。)
我们将游戏命名为 'Bounce',我们将创建的包命名为 'com.codeproject.bounce'。语言将是 'cpp'(cocos2d-x 也支持 JavaScript 和 Lua),我们将把源代码放在 AndroidDevelopment 文件夹内的某个文件夹中。
所以您的命令行是
cocos new Bounce -p com.codeproject.bounce -l cpp -d /Users/maxxx/Documents/AndroidDevelopment
如果不够明显,-p 参数定义了包名,-l 参数(注意是小写 L)定义了语言,-d 定义了存放项目的目录。
复制需要几秒钟,然后显示一堆关于更改项目名称的内容——暂时不用担心。
Cocos2d-x 项目结构
为了本文的目的,了解这个不是必须的,但我认为这是一个讨论 Cocos2d-x 项目如何构建的好时机。
在 Bounce 文件夹中有以下文件夹:
类
此文件夹是您为该项目开发的所有跨平台代码将驻留的地方。
cocos2d
此文件夹包含 cocos2d-x 库的源文件。
proj.android
此文件夹包含您的 Android 项目的项目文件。
proj.ios_mac
此文件夹包含 iOS 和 Mac 项目的项目文件。
proj.linux
目前这个文件夹会大致为空,因为 cocos2d-x 4.x 目前不支持 Linux 作为目标。
proj.win32
此文件夹包含 Windows 项目的项目文件。
proj.wp8-xaml
此文件夹包含 Windows Phone 8 项目的项目文件。
Resources
此文件夹包含所有项目的通用资源。
所以,想法是您在开发环境中打开项目,只更改 Classes 文件夹中的代码,并将资源添加到 Resources 文件夹。
然后,您在合适的开发环境中打开特定项目(可能是 Android 的 Eclipse、Windows 的 Visual Studio,以及 Mac 或 iOS 的 XCode),然后构建项目。
对 Classes 中的代码进行更改,然后重新构建每个项目——并部署到每个设备!
对我来说,最棒的是我可以使用我最喜欢的 IDE 进行大部分开发,然后只需切换到特定平台的 IDE 来构建该平台。
构建项目
在创建了 Bounce 项目并设置了各种环境变量之后,您现在需要首次构建它。
在终端中,`cd` 到 `Bounce` 目录中的 `proj.android` 目录。
** 请务必删除路径末尾的任何空格 **
这是为 Android 构建项目的命令。
输入 ./build_native.py
这会编译我们刚刚创建的项目(实际上是整个 cocos2d 库!)。
第一次运行时会花费相当长的时间——但不足以喝一杯茶。
在 Eclipse 中打开项目
要找到 Eclipse 可执行文件,请查看您解压的 adt-bundle 文件夹内的 eclipse 文件夹。
运行 Eclipse 并选择默认工作区选项。
您需要将项目导入 Eclipse。
从菜单中选择 File..Import
。
展开树中的 Android 项,然后选择 Existing Android Code into Workspace
(现有 Android 代码导入工作区)。
浏览到您创建项目的文件夹(在我的例子中是 'Bounce' 文件夹)。选择该文件夹,然后单击 'Open'(打开)。
“导入项目”窗口将显示要导入的项目列表。目前,您只想导入 libcocos2dx 和 Bounce 项目,所以取消选择所有其他项目,然后单击 'Finish'(完成)。
收尾工作
您快完成了!
我们需要告诉 Eclipse NDK 的位置。请记住,cocos 已经为它设置了一个环境变量,但 Eclipse 并不知道这一点,所以您需要亲自告诉它。
在 Terminal 中输入 Echo $NDK_ROOT
来查找 NDK_ROOT 的路径。
我得到
/Users/maxxx/Documents/AndroidDevelopment/android-ndk-r9d
将其复制到剪贴板以节省输入时间。
在 Eclipse 中,右键单击 Package Explorer 中的 Bounce 项目,然后选择 **properties**(属性)。
展开 C/C++ Build 并选择 **Environment**(环境)。
单击 **Add**(添加)按钮添加一个新的环境变量。
将变量命名为 **NDK_ROOT**,并将上面的路径粘贴到 **Value**(值)中。
单击 OK 关闭对话框,然后单击 OK 关闭属性。
设备
我们需要一个设备来运行。虽然有模拟器,但在真实设备上开发和测试以获得对性能的现实认识要好得多;虚拟设备非常适合尝试不同的屏幕尺寸和不同的操作系统版本,因此我将指导您设置真实设备和虚拟设备。
设置设备进行测试
此过程在 4.2 版本左右发生了变化,因此我在下面记录了不同的过程。
请注意,您可能需要重新启动设备才能使此设置生效(我需要,其他人报告说不需要),所以如果是我,我会谨慎起见并重新启动。
Android 4.2+
在您的设备上转到 Settings(设置)。
滚动到底部,然后选择 **About tablet**(关于平板电脑)(或 **About phone**(关于手机))
滚动到底部,然后点击 **Build number**(版本号)七次。是的,没错,7 次(它会在您到达时显示一条消息!)如果您已经有开发者选项,您会看到一条不同的消息,如图所示。
点击“返回”,您将在 Settings(设置)中看到一个新选项—— **{} Developer Options**(开发者选项)。
选择此选项,然后选择 **USB Debugging**(USB 调试)以及您可能喜欢的任何其他设置。
Android < 4.2
我没有合适的设备来尝试这个,但据可靠消息,以下步骤将打开 USB 调试。
在您的设备上转到 Settings(设置)。
选择 **Applications**(应用程序)。
选择 **Development**(开发)。
选择 **USB Debugging**(USB 调试)。
检查您的设备
在设备上设置 USB 调试的原因是让您的 Mac 可以看到它。确保您的设备已插入连接到 Mac 的 USB。
有两种方法可以快速检查它是否正常工作……
1. 如果您在 Mac 上安装了 Google Chrome
转到 chrome://inspect/#devices
在上图截图中,您将看到我连接了一台 Nexus 7,并且正在运行一个模拟器。
2. 转到 Terminal
输入 adb devices
这将运行 sdk\platform-tools 文件夹中 adb 可执行文件,该文件夹位于您之前解压的 ADT 文件夹内。
您应该能够直接运行该命令(而无需指定其路径),因为 cocos2d 设置已添加到您的环境变量中。如果您收到“command not found”(命令未找到)错误,您可能需要输入完整命令文件的路径——只需从 Finder 将其拖到 Terminal 窗口。
Maxxxs-iMac:~ maxxx$ adb devices List of devices attached emulator-5554 device 0a1c2fba device
也许不如 Chrome 友好,但这只是一个快速检查,以确保一切正常——希望您知道哪些设备已连接到您的 Mac!
设置虚拟设备进行测试
无论您是否拥有物理 Android 设备,在某个时候您都会想创建一个虚拟设备来测试您的程序。(事实上,曾经有一次,在我创建了虚拟设备之前,我的 Eclipse 拒绝检测到我的真实设备!)
以下是创建虚拟设备的方法。
在 Eclipse 中,选择 **Window**...**Android SDK Manager**(窗口...Android SDK管理器)。
在 SDK 管理器中,您将看到所有工具的所有修订版本的列表——以及显示它们是否已安装的状态列。
选择您想测试的版本,然后相应地选择 SDK Platform 和 System Image(系统映像)。
除非您的互联网连接速度非常快且带宽无限,否则我建议只选择一两个——因为它们需要下载,而且它们并不小!
选择好您想要的之后,单击 **Install x packages**(安装 x 个软件包)按钮。
勾选所有 Accept(接受)和 Accept License(接受许可)单选按钮(IMHO 表单定义得很糟糕,所以只需点击周围直到您看到一堆绿色的勾),然后单击 **Install**(安装)。
这些映像可能相当大——所以有足够的时间喝杯茶。
下载完成后,回到 Eclipse,然后选择 **Window**...**Android Virtual Device Manager**(窗口...Android 虚拟设备管理器)。
单击 **Device Definitions**(设备定义)选项卡。
从列表中选择一个预定义的设备,然后单击 **Create AVD...**(创建 AVD...)。
这将预先填写“Create new Android Virtual Device”(创建新的 Android 虚拟设备)表单中的一些字段。填写剩余的值(特别是,从您下载的选项中选择一个 target(目标)和 CPU,并**勾选 Use Host GPU(使用主机 GPU)复选框**),然后单击 **OK**(确定)。
完成后,单击 **OK**(确定),然后,回到 AVF 管理器,选择您新创建的虚拟设备,然后单击 **Start**(启动)。
启动虚拟设备可能需要很长时间。请耐心等待!
运行您的程序
这需要大量的设置,但您已经准备好开始工作了!
在 Eclipse 中,右键单击项目,然后选择 **Run As**...**Android Application**(运行为...Android 应用程序)。
假设您的项目构建成功(应该如此),您可能会看到 Android Device Chooser(Android 设备选择器)。
这将列出 Eclipse 可以看到的所有设备,无论是真实的还是虚拟的。上面的网格显示当前正在运行的设备,下面的网格显示当前未运行的虚拟设备。
如果您没有看到它,这意味着只有一个设备可用,所以 Eclipse 将使用它。如果您想在物理设备连接时使用虚拟设备,最简单的方法是启动您的虚拟设备(从 Eclipse 通过 **Windows**...**Android Virtual Device Manager**(窗口...Android 虚拟设备管理器)访问)。
如果您确实看到了它,请选择您喜欢的设备,单击 OK,然后等待奇迹发生!
这就是它!算不上什么大游戏,但这才是真正的、用 C++ 编写的、跨平台的游戏开发。
跨平台
我在本文开头谈到了跨平台开发——那么让我们在最后展示一下如何将同一个应用程序运行到您的 iPhone 上。
在您的 Mac 上,转到您创建项目的文件夹(在我的例子中是 AndroidDevelopment/Bounce),然后浏览到 proj.ios_mac
。
在那里您会找到 Bounce.xcodeproj。双击以在 XCode 中打开。
您会发现,在 Classes 文件夹中,就是我们在 Eclipse 中看到的相同源代码。
在您的 iOS 设备上构建并运行项目 。
甚至可以作为 Mac 应用……
……您将看到与在 Android 设备上看到相同的应用程序。
(您看到的 cocos2d-x 图像没有根据各个设备尺寸缩放——这本身就是一项技能——因此,不同的应用程序看起来确实有些不同。)
所以现在,即使您讨厌 Eclipse,您也可以使用 XCode 编写 C++ 代码,然后只使用 Eclipse 来构建和运行 Android 项目。
注意事项、说明和其他事宜。
虽然拥有运行模拟器的能力很棒,但默认模拟器速度很慢。当我说“慢”时,我不是说只是有点慢,甚至慢到不够喝一杯茶,我是说非常、非常慢。老实说,在某些情况下启动时间可能需要几分钟。
有办法可以改善这一点——但最好的方法(使用快照)无法使用,因为我们需要使用主机 GPU——这两种选项是互斥的。
如果您对速度感到绝望,请尝试搜索一下。但不要抱太大希望!
如果您想更进一步,开始使用 Cocos2d-x 开发游戏,那么有很多资源可以帮助您,但我警告您,在从 cocos2d-iPhone(仍然活跃)切换到 cocos2d-x 2.x(仍然活跃)再到 cocos2d-x 3.x(相当新)的过程中,可能很难弄清楚如何最好地做事。
如果您有关于 cocos2d-x 的问题,我建议查看 cocos2d-x.org 网站上的论坛。
要尝试一下,只需打开应用程序 Classes 文件夹中的 HelloWorldScene.cpp,然后进行一些更改。