cocos2d-x学习笔记

官网: http://www.cocos2d-x.org/
文档: 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-application

8.菜单/菜单项

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只能指定两者图片,并且不是点击后变成另一张,而是按下的时候变一下而已
CCMenuItemFont
CCMenuItemSprite
...
4>CCMenuItem的点击响应回调函数一般是一个CCMenu的所有菜单项共用的,在回调函数里面可以得到点击的是哪个菜单项( 可以把每个菜单项的ZOrder设成不一样,然后在回调函数里判断当前点击菜单项的ZOrder值
5>示例
//创建一个菜单栏目
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);

9.tmx地图左上角是原点(0,0),OpenGL地图左下角是原点(0,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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值