文档: http://www.cocos2d-x.org/wiki/Reference
在多个平台创建2dx项目:
<英文> http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Chapter_1_-_How_to_Create_a_New_cocos2d-x_project_on_multi-platforms
<中文> http://cocos2d.cocoachina.com/resource/show?nid=60
《cocos2d-x手机游戏开发(偏移12).pdf》很有参考价值,可以了解一些基本的概念,也有参考的例子,只是版本比较老,好多API都被新的替代了
2dx 2.1.4的版本居然不支持vs2008? 而且build-win32.bat运行失败...
1.把ndk-r9换成r8e就行了, http://dl.google.com/android/ndk/android-ndk-r8e-linux-x86_64.tar.bz2
[dongsong@localhost proj.android]$ ./build_native.sh
NDK_ROOT = /data/android/android-ndk-r9
COCOS2DX_ROOT = /data/android/cocos2d-x-2.1.4/HelloWorld/proj.android/../..
APP_ROOT = /data/android/cocos2d-x-2.1.4/HelloWorld/proj.android/..
APP_ANDROID_ROOT = /data/android/cocos2d-x-2.1.4/HelloWorld/proj.android
Using prebuilt externals
Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml
Android NDK: WARNING:/data/android/cocos2d-x-2.1.4/HelloWorld/proj.android/../../cocos2dx/Android.mk:cocos2dx_static: LOCAL_LDLIBS is always ignored for static libraries
make: Entering directory `/data/android/cocos2d-x-2.1.4/HelloWorld/proj.android'
Compile++ thumb : game_shared <= main.cpp
Compile++ thumb : game_shared <= AppDelegate.cpp
Compile++ thumb : game_shared <= HelloWorldScene.cpp
...
Compile++ thumb : cocos2dx_static <= CCCommon.cpp
/data/android/cocos2d-x-2.1.4/HelloWorld/proj.android/../../cocos2dx/platform/android/CCCommon.cpp: In function 'void cocos2d::CCLog(char const*, ...)':
/data/android/cocos2d-x-2.1.4/HelloWorld/proj.android/../../cocos2dx/platform/android/CCCommon.cpp:44:72: error: format not a string literal and no format arguments [-Werror=format-security]
/data/android/cocos2d-x-2.1.4/HelloWorld/proj.android/../../cocos2dx/platform/android/CCCommon.cpp: In function 'void cocos2d::CCLuaLog(char const*)':
/data/android/cocos2d-x-2.1.4/HelloWorld/proj.android/../../cocos2dx/platform/android/CCCommon.cpp:54:77: error: format not a string literal and no format arguments [-Werror=format-security]
cc1plus: some warnings being treated as errors
make: *** [obj/local/armeabi/objs/cocos2dx_static/platform/android/CCCommon.o] Error 1
make: Leaving directory `/data/android/cocos2d-x-2.1.4/HelloWorld/proj.android'
2.In Eclipse right click the project. Click on BuildPath/Linksource.In the linked folder location put in the directory of the cocos2d java src.http://stackoverflow.com/questions/11355347/cocos2dxglsurfaceview-cannot-be-resolved-to-a-type/13354226#13354226
Cocos2dxActivity cannot be resolved to a type ApplicationDemo.java
Cocos2dxEditText cannot be resolved to a type ApplicationDemo.java
Cocos2dxGLSurfaceView cannot be resolved to a type ApplicationDemo.java
3.服务端如何即时广播消息给2dx客户端?这种场景http就不好做了吧?
可以用libcurl来做2dx关于libcurl的说明 http://www.cocos2d-x.org/projects/cocos2d-x/wiki/How_to_compile_libcurl
licurl官方手册的中文翻译 http://blog.csdn.net/jgood/article/details/4787670
libcurl用来写普通socket通信程序(自定义协议)的例子, http://curl.haxx.se/libcurl/c/sendrecv.html
4.链接(Linker-->Input)的时候加上Ws2_32.lib这个库!
error LNK2001: unresolved external symbol _select@20
1>F:\cocos2d-x\cocos2d-2.0-x-2.0.3\Debug.win32\bomb.win32.exe : fatal error LNK1120: 1 unresolved externals
5.pthread使用#include "pthread/pthread.h", 报错: fatal error C1083: Cannot open include file: 'sched.h': No such file or directory
需要在VS工程中加入pthread.h的头文件目录,并链上pthreadVCE2.lib库。
Under"C/C++ > General > Additional Include Directories":$(SolutionDir)cocos2dx\platform\third_party\win32\pthread
Under "Linker > Input > Additional Dependancies":
pthreadVCE2.lib
Then in my program I include pthread with:
#include "pthread.h"
参考 http://cocos2d-x.org/boards/6/topics/15774
PS: 其他平台还没尝试,总感觉这样挺麻烦的,都没有跨平台的设置么!!
6.no resource found that matches the given name (at 'icon' with value '@ldrawable/icon')
在res/drawable-hdpi或res/drawable-ldpi或res/drawable-mdpi目录下,加下你要显示的图片,最好后缀是为.png的,然后修改AndroidManifest.xml文件,里面有这样一行代码<application android:icon="@drawable/icon" android:label="@string/app_name">,把它改为<application android:icon="@drawable/***" android:label="@string/app_name">(“***”表示你放入的图片的名,比如你放入app.png,那么就是android:icon="@drawable/app")最标准的应该是用android:icon="@android:drawable/XXXX",而不是android:icon="@android/drawable/XXXX",参见 http://stackoverflow.com/questions/8384278/cant-access-android-drawable-icon-resource
7.can not connect to server. 用libcurl建立socket长连接,windows下正常,编译成android放手机上总是报这个错
需要在AndroidMainfest.xml这个文件中添加网络访问的权限:
<manifest xlmns:android...>
...
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>
参见:
http://stackoverflow.com/questions/2169294/how-to-add-manifest-permission-to-android-application8.菜单/菜单项
TestCpp中TestController.cpp里面的那个大菜单是典型的学习案例!以下主要摘自这位朋友的博文( http://blog.csdn.net/lamp_zy/article/details/7922168)
1>CCMenu是由菜单项CCMenuItem (或其子类如CCMenuItemImage)组成的,通常先创建菜单项,然后使用1个或多个菜单项生成菜单
2> 菜单项的位置是相对于菜单的偏移位置,默认情况下菜单的位置在屏幕中点,方向为x向右,y向上(跟主窗口方向一样),菜单项默认偏移为(0,0),即不偏移
pMenu->setPosition( CCPointZero );pCloseItem->setPosition(CCPointMake( s.width - 30, s.height - 30));
上述代码把菜单原点设置在(0,0),即屏幕原点,菜单项相对菜单偏移到屏幕右上角向下30,向左30
3>CCMenuItem子类:
CCMenuItemImage:图片按钮菜单项,通过指定图片资源来创建菜单项CCMenuItemLabel:文本菜按钮单项,通过指定文本标签( 实现CCLabelProtocol接口的类,如CCLabelTTF)来创建菜单项CCMenuItemToggle :开关按钮菜单项,这种类型的按钮一次只有一个菜单项显示出来,当你单击它的时候,它就会切换到另外一个菜单项,它的create函数:
CCMenuItemToggle * CCMenuItemToggle::create(CCObject* target, SEL_MenuHandler selector, CCMenuItem* item, ...)可见它是可以加入多个菜单项的,这些菜单项按顺序在上一个菜单项点击后出现下一个菜单项典型的应用场景是播放器的播放/暂停按钮它跟CCMenuItemImage不一样,CCMenuItemImage只能指定两者图片,并且不是点击后变成另一张,而是按下的时候变一下而已
CCMenuItemFontCCMenuItemSprite...
4>CCMenuItem的点击响应回调函数一般是一个CCMenu的所有菜单项共用的,在回调函数里面可以得到点击的是哪个菜单项( 可以把每个菜单项的ZOrder设成不一样,然后在回调函数里判断当前点击菜单项的ZOrder值)
5>示例
9.tmx地图左上角是原点(0,0),OpenGL地图左下角是原点(0,0)//创建一个菜单栏目CCMenuItemFont *startNew =CCMenuItemFont::itemFromString("新游戏");startNew->setTarget(this,menu_selector(MenuLayer::onNewGame));//创建一个菜单栏目CCMenuItemFont *credits=CCMenuItemFont::itemFromString("个人设置");credits->setTarget(this,menu_selector(MenuLayer::onNewGame));//创建一个菜单容器 把菜单栏目放上去CCMenu *menu=CCMenu::menuWithItems(startNew,credits,NULL);//显示菜单this->addChild(menu);//菜单的显示位置menu->setPosition(ccp(160,200));//设置栏目间的宽度距离menu->alignItemsVerticallyWithPadding(40.0);
10.最近做的小游戏(炸弹人)在windows下一切OK,编译成APK运行就闪退,纠结了好久,今天(2013.1.15)终于用蛮力法找到了问题。
把有嫌疑的代码全部删除,然后加一点运行一次直到出错,这样才锁定闪退原因:根据平台宏定义做编码转换的宏定义不知何故居然没找到。
logCat:
11-14 17:41:47.396: A/libc(21430): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 21458 (Thread-5802)
11-14 17:42:30.656: W/dalvikvm(21557): threadid=11: thread exiting with uncaught exception (group=0x41920438)
FROM:
string newStr = "新建房间";
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
GBKToUTF8(newStr,"gb2312","utf-8");
#endif
TO:
#ifdef CC_TARGET_PLATFORM
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
GBKToUTF8(newStr,"gb2312","utf-8");
#endif
#endif
好像还有个小错误ABORTING: INVALID HEAP ADDRESS IN dlfree addr=xxxx;这个是貌似是因为class的某个成员(指针)没有赋初值(那么它的值就是随机的了),在析构的时候用if(ptr)检测到非NULL就delete。