Cocos2D-HTML5 MoonWarriors游戏Android编译指南(另附iOS编译指南和游戏源码)

作者:Wwashington AT newsmth、cocos2d-x、chinaunix、pcbeta
日期:2013/02/28
官网:https://code.google.com/p/mkisofs-md5/downloads
说明:欢迎转载,前提是完整地保留所有的作者、日期、官网、说明、正文等信息。

1)准备编译环境。

首先要有 Eclipse 和 ADT、CDT、Android SDK、Android NDK,建议大家使用
统一开发环境(UDE)开发工具。它是中国移动提供的跨平台开发、调试、编译工具,即将支持游戏开发。
Cygwin是Redhat公司提供的一个在Win32下的Linux POSIX仿真环境,建议大家安装。

ADT ,http://developer.android.com/tools/sdk/eclipse-adt.html
CDT ,http://www.eclipse.org/cdt/
SDK ,http://developer.android.com/sdk/index.html
NDK ,http://developer.android.com/tools/sdk/ndk/index.html
UDE ,http://dev.10086.cn/app/local/
Cygwin,http://www.cygwin.com/

解压 cocos2d-2.1beta3-x-2.1.1.zip 到 D:\Game\SDK\,我们会用到 JS Binding。
解压 android-ndk-r8.zip 到 D:\Game\NDK,解压后可以在系统设置变量,也可以
在Cygwin里设置变量。系统设置在:计算机、属性、高级系统设置、环境变量里面
新建一个系统变量,变量名:NDK_ROOT,变量值:D:\Game\NDK\android-ndk-r8。

Hybrid 的原理是用解析器执行 JS 脚本,一般用 JavaScriptCore、SpiderMonkey。
由于JIT(Just-In-Time) JavaScript效率极大提高,使得HTML5开发游戏成为可能。

http://www.cocos2d-x.org/boards/20/topics/9696
Why we moved from JavaScriptCore to SpiderMonkey?

My name is Rolando and I've been working on the cocos2d-x-javascript bindings for a
while. We (Zynga) released as open source the branch old-js-bindings, that was using
JavaScriptCore last week and right now we're openly working on a new, better, improved,
faster, javascript bindings using SpiderMonkey.

Apparently everyone is using JavaScriptCore, but although that seems to be true, they
are all infringing the LGPL license (actually Apple is infringing the License), so we
searched for other JavaScript VMs and decided that SpiderMonkey was a good candidate.

https://developer.mozilla.org/en/docs/SpiderMonkey
SpiderMonkey is Mozilla's JavaScript engine written in C/C++.

2)自动复制文件 OR 用Cygwin编译。


两者二选一就足够了,没有必要两个步骤都做。使用Cygwin的好处是可以对C++的
源码进行修改完善,通过 build_native.sh 编译。直接调用 NDK 则相对简单些,
但是这么一来,对于基于Linux内核的 Android 底层开发,功能不如Cygwin强大。

2.A)自动复制文件

考虑到手工操作比较复杂,这里我们可以用批处理自动执行,节省时间、避免出错。
如果要编译其他项目,只要修改EngineHome、SamplesApp的值就可以了,简单方便。

D:\Game\Home\Readme\MoonWar>type MoonWar_Apk.cmd

set EngineHome=D:\Game\SDK\cocos2d-2.1beta3-x-2.1.1
set SamplesApp=MoonWarriors
set AndroidDir=%EngineHome%\samples\Javascript\%SamplesApp%\proj.android
set SamplesDir=%EngineHome%\samples\Javascript\Shared\games\%SamplesApp%
set BindingDir=%EngineHome%\scripting\javascript\bindings\js

echo %EngineHome%
echo %SamplesApp%
echo %AndroidDir%
echo %SamplesDir%
echo %BindingDir%

cd /d %AndroidDir%
if exist assets rmdir /s /q assets
mkdir assets
cd assets
mkdir res
mkdir src

xcopy /s /y %SamplesDir%\res res
xcopy /s /y %SamplesDir%\src src
copy /y %SamplesDir%\*.js .
copy /y %BindingDir%\*.js .

2.B)用Cygwin编译

$ cd "D:\Game\SDK\cocos2d-2.1beta3-x-2.1.1"
$ chmod -R 755 *
说明:上述操作是为了提早消除由于权限引发的潜在问题,如果不做后面可能遇到权限问题。

$ cd "D:\Game\SDK\cocos2d-2.1beta3-x-2.1.1\samples\Javascript\MoonWarriors\proj.android"
$ ./build_native.sh
please define NDK_ROOT

$ vi ~/.bashrc
export NDK_ROOT='D:\Game\NDK\android-ndk-r8'
:q!

$ . ~/.bashrc
$ env | grep NDK
NDK_ROOT=D:\Game\NDK\android-ndk-r8

$ ./build_native.sh
"Compile++ thumb : moonwarriors_shared <= main.cpp
"Compile++ thumb : moonwarriors_shared <= AppDelegate.cpp
......

ld.exe: ./obj/local/armeabi/js_static.a: No such file: Permission denied
collect2: ld returned 1 exit status

$ ls -la ./obj/local/armeabi
$ chmod -R 755 ./obj/local/armeabi/*.a

$ ./build_native.sh

$ chmod -R 755 assets
说明:上述操作是为了提早消除由于权限引发的潜在问题,如果不做后面可能遇到权限问题。

3)创建游戏项目、编译类库项目并且引用类库。


其中3.A是必须做的第一步;3.B和3.C是二选一的第二步,两者作用是完全一样的。

3.A)文件、新建、项目、Android、Android Project from Exsiting Code、Browse
D:\Game\SDK\cocos2d-2.1beta3-x-2.1.1\samples\Javascript\MoonWarriors\proj.android

项目、清理、清理下面所选项目,MoonWarriors。发现src目录出现了红叉,查看Problems:

无法解析导入 org.cocos2dx.lib 第26行
Cocos2dxActivity 无法解析为类型 第30行
Cocos2dxActivity 无法解析为类型 第33行

3.B)右键点击项目、属性、Android、Library,看到 Reference 引用的是 java Project。
这是其中一种引入外部运行库的方法,另一种方法是拷贝java Project里的src,两者等效。
要想编辑、编译的时候可以使用外部引用的库,我们现在需要编译cocos2dx的java开发库。

引入外部库,文件、新建、项目、Android、Android Project from Exsiting Code、Browse
D:\Game\SDK\cocos2d-2.1beta3-x-2.1.1\cocos2dx\platform\android\java

(附图 MoonWar_01.jpg)



3.C)直接添加源文件或者库文件。不采用3.B方案,它在属性里引用外部运行库,这里则拷贝
到当前目录再编译。大家可以把预先编译好的./bin/java.jar文件拖到当前目录,成为依赖库
Android Dependencies,等效于3.B引用外部运行库。3.C的特点是操作时都要用鼠标拖放文件。

文件浏览器查看 D:\Game\SDK\cocos2d-2.1beta3-x-2.1.1\cocos2dx\platform\android\java
选中 src 目录拖到项目名称,出现+号,选择Copy files and folders,是否覆盖:全部为是。

引入外部库,文件、新建、项目、Android、Android Project from Exsiting Code、Browse
D:\Game\SDK\cocos2d-2.1beta3-x-2.1.1\cocos2dx\platform\android\java

3.D)现在再查看MoonWarriors项目,红叉已经消失。Android Dependencies下出现java.jar。

(附图 MoonWar_02.jpg)



4)自定义构建器。


右键选中项目、属性、构建器、新建、程序,依次输入下列信息,特别要注意工作目录别写错。
如果你的机器已经安装Cygwin,并且在步骤2.B里完成了编译,就可以直接跳过步骤4做下一步。

(附图 MoonWar_03.jpg)



名称:NDK Cocos2dxActivity
位置:D:\Game\NDK\android-ndk-r8\ndk-build.cmd
工作目录:${workspace_loc:/MoonWarriors}
自变量:NDK_MODULE_PATH="D:\Game\SDK\cocos2d-2.1beta3-x-2.1.1;D:\Game\SDK\cocos2d-2.1beta3-x-2.1.1\cocos2dx\platform\third_party\android\prebuilt"

(附图 MoonWar_04.jpg)



说明:工作目录里的路径,是在属性、资源、路径里查看的,直接复制粘贴就可以。请注意某些
版本的ADT(例如ADT-20.0.0)显示长名称,例如 /org.cocos2dx.moonwarriors.MoonWarriors。

设置:窗口、首选项、Android、NDK,NDK Location 的值设置为 D:\Game\NDK\android-ndk-r8


5)编译运行项目。


5.A)直接用NDK编译,项目、构建项目。Eclipse 会调用构建器(Builder)的内容编译库文件。
编译成功就完成类似 Cygwin build_native.sh 任务,还需要打包,运行、运行方式、Android。

"Compile++ thumb : moonwarriors_shared <= main.cpp
"Compile++ thumb : moonwarriors_shared <= AppDelegate.cpp
......

5.B)通过Cygwin编译,前面编译好了Cocos2D-X库文件,直接打包。运行、运行方式、Android。
这时候可能会出现一个错误,“No rule to make target: CCConfiguration.cpp”。这是由于
文件权限或者编译时间太久引起的。通常删掉旧的包重建就好。如果不行,改用2.A、5.A方案。

$ rm -Rf obj/*
$ rm -Rf libs/*
$ ./build_native.sh

6)相关故障修复。


如果打包成功之后无法运行,系统提示“Could not find *.apk”,这个问题通常是项目设置
成了库文件类型(Library),要重新改为应用类型(Application),只要取消Library属性。
具体步骤是:项目、属性、Android、Library、Is Library,去掉 Is Library 的打勾就好。

运行、运行方式、Android Application,如果提示“Zip add failed”,需要重新设置权限。
安装到手机后,MoonWar游戏大约每隔一两分钟就出现卡壳现象,需要优化SpiderMonkey引擎。

Unable to add 'D:\Game\SDK\cocos2d-2.1beta3-x-2.1.1\samples\Javascript\MoonWarriors\proj.android\assets\res\arial-14.GlyphProject': Zip add failed
Unable to add 'D:\Game\SDK\cocos2d-2.1beta3-x-2.1.1\samples\Javascript\MoonWarriors\proj.android\assets\res\arial-14.fnt': Zip add failed
org.cocos2dx.moonwarriors.MoonWarriors] ERROR: unable to process assets while packaging 'D:\Game\SDK\cocos2d-2.1beta3-x-2.1.1\samples\Javascript\MoonWarriors\proj.android\bin\resources.ap_'
org.cocos2dx.moonwarriors.MoonWarriors] ERROR: packaging of 'D:\Game\SDK\cocos2d-2.1beta3-x-2.1.1\samples\Javascript\MoonWarriors\proj.android\bin\resources.ap_' failed

$ cd "D:\Game\SDK\cocos2d-2.1beta3-x-2.1.1\samples\Javascript\MoonWarriors\proj.android"
$ ls -la assets
$ chmod -R 755 assets

https://code.google.com/p/mkisofs-md5/downloads 
Cocos2D-HTML5 MoonWarriors Android Dev (wwashington Wrote) -- Android 编译指南 
Cocos2D-HTML5 MoonWarriors iPhone6 Dev (wwashington Wrote) -- iOS 编译指南 
Cocos2D-HTML5 Game MoonWarriors Apk (wwashington Build) -- Android安装包 
Cocos2D-HTML5 Game MoonWarriors Src (wwashington Repack) -- 可预览的源码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cocos2dx 雷电MoonWarriors_游戏源码 #include "GameLayer.h" #include "SimpleAudioEngine.h" #include "Bullet.h" #include "Resource.h" #include "Config.h" #include "Enemy.h" #include "Effect.h" #include "GameOver.h" #include "PauseLayer.h" using namespace cocos2d; using namespace CocosDenshion; bool isPaused = false; GameLayer::GameLayer():m_state(statePlaying),m_time(0),m_ship(NULL),m_backSky(NULL),m_backSkyHeight(0),m_backSkyRe(NULL),m_backTileMap(NULL),m_backTileMapHeight(0),m_backTileMapRe(NULL),m_isBackSkyReload(false),m_isBackTileReload(false),m_lbScore(NULL),m_lifeCount(NULL), m_tempScore(0) { } GameLayer::~GameLayer() { if (m_levelManager) { delete m_levelManager; } play_bullet->release(); enemy_bullet->release(); enemy_items->release(); } bool GameLayer::init() { if (!CCLayer::init()) { return false; } // 开启触摸 this->setTouchEnabled(true); // 创建数组,需要retain一下 play_bullet = CCArray::create(); play_bullet->retain(); enemy_bullet = CCArray::create(); enemy_bullet->retain(); enemy_items = CCArray::create(); enemy_items->retain(); m_state = statePlaying; Enemy::sharedEnemy(); Effect::sharedExplosion(); Config::sharedConfig()->resetConfig(); winSize = CCDirector::sharedDirector()->getWinSize(); m_levelManager = new LevelManager(this); //初始化背景 initBackground(); m_screenRec = CCRectMake(0, 0, winSize.width, winSize.height + 10); // score m_lbScore = CCLabelBMFont::create("Score:0", s_arial14_fnt); m_lbScore->setAnchorPoint(ccp(1, 0)); m_lbScore->setAlignment(kCCTextAlignmentRight); addChild(m_lbScore, 1000); m_lbScore->setPosition(winSize.width - 5, winSize.height - 30); // ship life CCTexture2D *shipTexture = CCTextureCache::sharedTextureCache()->addImage(s_ship01); CCSprite *life = CCSprite::createWithTexture(shipTexture, CCRectMake(0, 0, 60, 38)); life->setScale(0.6); life->setPosition(ccp(30,winSize.height-23)); addChild(life, 1, 5); // ship life count char lifecount[2]; sprintf(lifecount, "%d",Config::sharedConfig()->getLifeCount()); m_lifeCount = CCLabelTTF::create(lifecount, "Arial", 20); m_lifeCount->setPosition(ccp(60, winSize.height-20)); m_lifeCount->setColor(ccc3(255,0, 0)); addChild(m_lifeCount, 1000); // ship m_ship = Ship::create(); addChild(m_ship, m_ship->getZoder(), 1001); CCMenuItemImage *pause = CCMenuItemImage::create("pause.png", "pause.png", this, menu_selector(GameLayer::doPause)); pause->setAnchorPoint(ccp(1, 0)); pause->setPosition(ccp(winSize.width, 0)); CCMenu *menu = CCMenu::create(pause, NULL); menu->setAnchorPoint(ccp(0, 0)); addChild(menu, 1, 10); menu->setPosition(CCPointZero); // 调 update函数 scheduleUpdate(); // 每秒调一次 scoreCounter函数 schedule(schedule_selector(GameLayer::scoreCounter), 1); if (Config::sharedConfig()->getAudioState()) { SimpleAudioEngine::sharedEngine()->playBackgroundMusic(s_bgMusic, true); } return true; } void GameLayer::update(float dt) { if (m_state == statePlaying) { checkIsCollide(); removeInactiveUnit(dt); checkIsReborn(); updateUI(); } } void GameLayer::scoreCounter() { if (m_state == statePlaying) { m_time++; m_levelManager->loadLevelResource(m_time); } } void GameLayer::checkIsCollide() { CCObject *units; CCObject *bullets; CCObject *enemybs; CCARRAY_FOREACH(enemy_items, units) { UnitSprite *enemy = dynamic_cast<UnitSprite*>(units); CCARRAY_FOREACH(play_bullet, bullets) { UnitSprite *bullet = dynamic_cast<UnitSprite*>(bullets); if (this->collide(enemy, bullet)) { enemy->hurt(); bullet->hurt(); } if (!(m_screenRec.intersectsRect(bullet->boundingBox()))) { bullet->destroy(); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值