android调用cocos2dx
‘壹’ 如何使用友盟 Cocos2d-x 分享组件实现 Android/iOS 分享功能
集成准备:
首先我简单介绍一下组件压缩包的组成
Cocos2dx
实现Cocos2d-x中跨平台分享功能,需拷贝到您项目的Classes文件夹中;
Platforms
原生的Android和iOS社会化组件SDK,需要您将库和资源拷贝到对应平台的项目中;
doc
组件的集成文档;
Umeng_Cocos2dx_Demo_V1.0
Android部分的demo文件,可以安装在手机上看一下简单的分享效果和样式
Cocos2d-x虽然是一个跨平台的引擎,但是对于Android和IOS平台来说,具体的集成方式还是有一定的区别,这里分别介绍Android和IOS平台集成中不同的地方,然后再集中介绍跨平台通用的部分。
Android平台集成步骤:
步骤一:
下载Cocos2d-x组件(下载地址) 并且将jar包添加到build path 路径下,将res资源文件夹加入到你工程对应资源文件下。将Platforms/Android/controller目录下的com文件夹拷贝到您的Cocos2d-x项目Android平台的src目录下,并且在jni/Android.mk中的LOCAL_SRC_FILES下添加如下配置 (注意格式,否则会编译出错) :
../../Classes/Cocos2dx/Android/CCUMSocialController.cpp \
../../Classes/Cocos2dx/ShareButton/UMShareButton.cpp \
../../Classes/Cocos2dx/Common/CCUMSocialSDK.cpp
步骤二:
在Cocos2dxActivity子类的onCreate方法下添加如下代码,用来完成初始化步骤
// this为Cocos2dxActivity类型, 参数2为描述符,可随意修改.
CCUMSocialController.initSocialSDK(this, "com.umeng.social.share");
步骤三:
在代码中覆写Cocos2dxActivity子类的onActivityResult方法,用来实现回调方法。在onActivityResult添加如下代码 :
// 授权回调
CCUMSocialController.onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
转载,仅供参考。
‘贰’ cocos2d-x 3.8 编译 android 问题,版主能帮忙解决下吗
一 无法替换cocos2d-x本身自带的libxml2
为什么需要自己编译libxml2:
由于我以前解析xml使用的是Tree的方式,在Win32以及GMO上能够正常运行,但是在ndk下编译的时候遇到问题了,原来cocos2d-x使用的libxml2把Tree的解析方式关闭了。于是乎摆在我面前的是两条路,第一条是重新编译一版libxml2,打开Tree的解析方式;第二条是修改以前的代码,采用SAX的解析方式。由于修改代码的工作量比较大,所以决定先采用第一个方案。(PS:推荐大家在以后的程序中解析xml使用SAX的方式,省很多内存)
编译时遇到的问题:
先将libxml2源代码(从Android 2.2的源代码中拷贝出来的,稍作修改)拷贝到cocos2d-x根目录,然后修改yourgame/android/厅猜闭jni/Android.mk, 修改如下
subdirs := $(addprefix $(LOCAL_PATH)/../../../,$(addsuffix /Android.mk, \
libxml2 \ # this is the new add content
cocos2dx \
CocosDenshion/android \
))
subdirs := $(addprefix $(LOCAL_PATH)/../../../,$(addsuffix /Android.mk, \
libxml2 \
cocos2dx \
CocosDenshion/android \ ))
然后将cocos2dx\platform\third_party\android\libraries\libxml2.a删除,再修改yourgame和cocos2d-x使用的新的libxml2的头文件目录,最后编译。然后果断的悲剧了,libxml2的代码不会被编译,然后在链接cocos2d-x so的时候会提示link error (libxml2的接口找不到实现)。
解决办法:
修改cocos2d-x的Makefile文件,修改如下:
LOCAL_LDLIBS := -L$(call host-path, $(LOCAL_PATH)/platform/third_party/android/libraries) \
-lGLESv1_CM -llog -lz \
-lpng \
-ljpeg \
# -lxml2 #delete the old style of link libxml2
LOCAL_STATIC_LIBRARIES := libxml2 # add to enable auto build of libxml2
yourgame 的makefile 的修改参考cocos2d-x。 哈哈,终于能正常编译了。
二 编译命令始终是compile++ thumb 或者 compilethumb
为什么不要使用thumb:
thumb指令集是为了满足一些低端的设备而加上的,使用的是16位的指令集,能压缩扮裂代码密度,但是指令比普通的32位arm指令弱很多,所以建议关闭掉。
解决办法:
在每个Android.mk 中每个Mole加上LOCAL_ARM_MODE := arm ,这样就能看到compile++ arm 和compile arm 了。
三 无法载入资源
问题描述:
在Android 程序编译完打包之后,安装上设备,提示"Get data from file **** failed", 但是发现文件路径是对的,只是中间有"."或者".."。
问题产生的原因:
在请教高人之后知道android程序中使用的资源是打包在压缩文件里面的,程序中只能通兆团过在压缩包的全路径名去获取文件,并且不能有相对路径(如"." , "..")。而且,不能通过fopen去打开,因为文件目录根本就没有这个文件。
解决办法:
1. 将plist文件和png,动画配置xml和png放在相同的目录,plist和xml中包含的文件名和plist以及xml在相同的目录下。
2. 在解析xml的时候不能使用xmlReadFile,而使用如下方式:
const char* xmlConfFullPath = CCFileUtils::fullPathFromRelativePath(yourfilename);
CCFileData data(xmlConfFullPath, "rt");
unsigned long size = data.getSize();
char *pBuffer = (char*) data.getBuffer();
doc = xmlReadMemory(pBuffer, size, NULL, "UTF-8", XML_PARSE_RECOVER);
四 dynamic_cast不能使用
问题描述:
dynamic_cast返回NULL,但是在Win32上是能正常工作的。
原因:
不详,反正搞不定,试过以下各种办法,均以失败告终:
1. 修改Application.mk,添加如下:
APP_STL := gnustl_static
APP_CPPFLAGS += -frtti
2. 修改编译器,使用gcc编译C+代码,且在链接时将-lsupc+ 换成-lstdc++
最后只能放大招:
将dynamic_cast 改为static_cast, 哎,先将就着用吧。
‘叁’ android cocos2d x 怎么创建地图
对于这一教程,你需要安装最新的Cocos2D-X版本(游戏邦注:在写本篇教程的时候更新到2.1.4)。如果你还未拥有最新版本的Cocos2D-X,先下载它并在终端运行如下命令去安装模版:
cd ~/Downloads/cocos2d-x-2.1.4 ./install-templates-xcode.sh -f -u 然后使用iOScocos2d-xcocos2dx模版在Xcode创造一个新项目。点击Next,将项目命名为TileGame,将项目设置为Universal,点击Next然后点击Create。
你将在这一项目中使用ARC,所以如果这是你第一次听到ARC,我会鼓励你先了解下它。模版并不是默认使用ARC,但幸运的是,我们能够轻松地进行 修改。前往EditRefactorConvert to Objective-C ARC。往下拉并只选择文件main.m, AppDelegate.cpp, HelloWorldScene.cpp,然后点击Check并完成向导的步骤。
select targets(from raywenderlich)
创建并运行,然后确保一切都还正常运行—-你应该能够看到标准的“你好世界”屏幕。
接下来下载游戏资源的压缩文件。压缩文件包含如下内容:
你将面向玩家对象使用的精灵。
一些伴随着cfxr效用所创造的音效(你将会在教程中用到)。
一些伴随着Garage Band所创造的背景音乐。
你将用到的一些砖块设置—-这将伴随着你将使用的地图编辑器,但我认为我们能够更轻松地将其与其它内容包含在一起。
一些额外的“特别”砖块,将在之后进行详细解释。
当你下载了资源后,打开它并将TileGameResources文件夹拖到项目的Resources群组中。在项目菜单里,右击 Resources群组,并选择Add Files to “TileGame”…选择Resources/TileGameResources文件夹,核实选中了Copy items into destination group’s folder (if needed)以及Create groups for any added folders,然后点击完成。
如果一切顺利的画,所有的文件都将出现在你的项目中。
tile game(from raywenderlich)
现在我们将开始创造地图!
创造地图
Cocos2D-X支持基于开放源Tiled Map Editor去创造地图并将其以TMX格式进行保存。
下载Tiled Map Editor。在编写本篇教程的时候,其最新版本是0.9.0。
然后运行Tiled,前往FileNew,并如下填写对话内容:
new tileset(from raywenderlich)
为了获得图像,点击Browse并导航至你自己的TileGame/Resources/TileGameResources文件夹,然后选择你之前从资源压缩中下载的tmw_desert_spacing.png文件,并将其添加到项目中。它将自动根据文件名填写名字。
你可以将宽度和高度设置为32×32,因为这也是砖块的大小。对于边缘和间隔:
边缘是关于在Tiled开始寻找真正的砖块像素前应该为当前的砖块略过多少多少像素(包括宽度和高度)。
间隔是关于Tiled在明确了实际砖块像素并转向下一个砖块数据之后应该前进多少像素(包括宽度和高度)。
如果你着眼于tmw_desert_spacing.png,你将发现每个砖块都围绕着一个1像素的黑色边缘,这也解释了边缘和间隔为1的设置。
tile(from raywenderlich)
当你点击OK时,你将看到砖块呈现在Tilesets窗口中。现在你可以开始绘制了。点击工具栏的Stamp
Brush图标,然后点击地图上的任何一个位置去放置一个砖块。
tileset(from raywenderlich)
所以继续绘制地图—-尽可能发挥创造性!确保添加至少一些建筑到地图上,因为你在之后将需要一些碰撞内容。
tileset(from raywenderlich)
为了更轻松地绘制内容,你可以着眼于一些快捷方法。以下是最常用到的一些方法:
你可以在Tileset选择器中围绕着一系列砖块拖曳一个盒子,并同时放下多个相邻的砖块。
你可以通过Viewoom In和Viewoom Out进行放大和缩小。
z键将在基于Stamp Brush工具编辑地图时进行旋转。
在一些新功能中你可能会注意到Mini-map。这是一个很棒的功能,它让你能够看到一个迷你地图!着眼于我在Mini-map最下方的迷宫中的糟糕尝试。红色盒子代表你在主要编辑窗口中看到的区域。
tileset(from raywenderlich)
当你在阅读下一个区域中的滚动时牢牢记住这一Mini-map视图。
需要注意的是这一教程的资源是出现在地图前的——所以如果你很懒的话便可以直接利用它。如果你这么做,你应该在Tiled打开地图并明确它是如何设置的。
当你完成地图的绘制时,在Layers视图中双击Tile
Layer,将名字改为Background。然后点击FileSave,并将文件保存到TileGame项目中的TileGame
ResourcesTileGameResources,将文件命名为TileMap.tmx,并覆盖现有的文件。
你将在之后使用Tiled做其它事,但是现在让我们将这一地图带进游戏中!
添加Tiled地图到Cocos2D-X场景中
打开HelloWorldScene.h,在#include “cocos2d.h”之后添加如下内容:
usingnamespacecocos2d;
这能指导编辑器去使用cocos2d命名空间,所以你不需要为所有内容加上cocos2d的前缀。
然后添加以下内容到类定义中,即在花括号之后:
private:CCTMXTiledMap*_tileMap;CCTMXLayer*_background;
这创造了一个实例变量去追踪砖块地图本身,并创造了另一个实例变量去追踪地图的背景层。你将在之后学到更多有关砖块地图层面的内容。
接下来,用如下内容换掉HelloWorldScene.cpp:
CCTMXObjectGroup*objectGroup=_tileMap->objectGroupNamed(“Objects”);if(objectGroup==NULL){CCLog(“”);returnfalse;}CCDictionary*spawnPoint=objectGroup->objectNamed(“SpawnPoint”);intx=((CCString)*spawnPoint->valueForKey(“x”)).intValue();inty=((CCString)*spawnPoint->valueForKey(“y”)).intValue();_player=newCCSprite();_player->initWithFile(“Player.png”);_player->setPosition(ccp(x,y));this->addChild(_player);this->setViewPointCenter(_player->getPosition());
最后一行有个预兆——但不要担心,你很快就能到达那里。
让我们暂停一会并解释对象层面和对象群组。首先注意你是通过在CCTMXTiledMap对象中(而不是layerNamed)通过objectGroupNamed方法检索对象层面。它返回了一个特殊的CCTMXObjectGroup对象。
然后objectGroup调用了objectNamed方法去获得一个CCDictionary,并包含了一些有关对象的有用信息,如x和y轴,宽度和高度。在教程的这一部分,你需要关心的便是x和y轴,将其设置为玩家精灵的位置。
在代码块的最后你设置了视图去明确玩家的位置。所以现在添加如下内容到HelloWorldScene.h中:
//(CCPointposition);
并添加一个新方法到HelloWorldScene.cpp(在文件的最下方最好):
voidHelloWorld::setViewPointCenter(CCPointposition){CCSizewinSize=CCDirector::sharedDirector()->getWinSize();intx=MAX(position.x,winSize.width/2);inty=MAX(position.y,winSize.height/2);x=MIN(x,(_tileMap->getMapSize().width*this->_tileMap->getTileSize().width)–winSize.width/2);y=MIN(y,(_tileMap->getMapSize().height*_tileMap->getTileSize().height)–winSize.height/2);CCPointactualPosition=ccp(x,y);CCPointcenterOfView=ccp(winSize.width/2,winSize.height/2);CCPointviewPoint=ccpSub(centerOfView,actualPosition);this->setPosition(viewPoint);}
这是关于砖块的解释。想象这一函数设置了摄像机的中心位置。它让用户能够进入地图中x,y轴的任何位置—-但是你有可能不想呈现出某些点,如你可能不想要屏幕超过地图的边缘(那么它便只会呈现出黑边!)。
‘肆’ cocos2dx移植Android平台
如果你用的是windows系统作为开发环境,使用的是cocos2d-x3.2最新版的,你在一开始安装cocos2d-x的时候,会要求输入
NDK_ROOT
ANDROID_SDK_ROOT
ANT_ROOT
最新版的cocos2d-x使用了python来进行安装和编译程序的,所以你要先在你的windows系统上安装上python.安装好之后,下载最新版的cocos2d-x,然后,cd到这个目录下,你会看到一个有一个setup.py的文件,.py后缀的文件就是python的脚本文件了。是要用python来运行的。如果你安装好python之后设置好了python的环境变量,这个时候,你只要在命令行里运行:
python setup.py就可以了。
然后你就可以看到要求你输入的这三个路径了。
这三个工具的所在路径,这几个路径输入对了之后,你的cocos2d-x就安装好了,这个时候,在cmd里创建一个新项目,创建的方法是在命令行里输入:
cocos new youprojectname -p com.youcom,youprojectname -l cpp -d 你的新建项目所在路径
然后回车,你就可以看你的的项目会在你的新建项目路径下有一个youprojectname的文件夹,打开,你就可以看到里边有各个系统的project文件夹了,还有一个Class和Resources的文件夹。这个时候,你在命令行里cd到你的proj.android文件夹下,使用命令:
python bulid_native.py
就可以对你的安卓新建的helloworld项目进行编译了。不出意外,要不然一分钟就编译好了。会生成一个libcocos2dcpp.so在你的pro.android/libs/armabi的路径下。然后打开你的ADT,也就是eclipse,进入pro.android目录,导入android项目到eclipse。这个时候可能会报一个cocos2d-x的lib库错误,只要把cocos2d-x的
cocos2d/cocos/platform/android/java/src
目录下的文件夹复制到pro.android/src下就可以解决这个问题了。
然后,接上你的android手机,并且在手机中打开开发者模式。点击程序远行设置,选择使用设备运行。在弹出的一个选择手机设备的框时选择run,不一会,你的helloworld项目就可以在手机上看到了。
如果要调试,你可以在eclipse中打开logcat,看到cocos2d-x的log输出信息。
总的来说,android最好的开发环境还是mac系统。因为在mac系统下很多linux命令都可以使用。不像windows系统比较蹩脚。