更改日志:
2014-8-13
升级之前可以先看看官网的新特性,以及编译工具链版本变更
官方推荐编译工具版本:
NDK r9d or newer version is required for Android building
gcc 4.9 is required for linux building
Xcode 5.1 or newer is required on iOS
gcc 4.9 is required for linux building
Xcode 5.1 or newer is required on iOS
-----------------------------------------------------------------------
getChildByName() 返回类型变更: Widget* -> Node*
Widget* img_t = dynamic_cast<Widget*>(_ui->getChildByName("img_t"));
【解决方法】
在所有调用
getChildByName 新增dynamic_cast<Widget*>( ) 函数包裹
-----------------------------------------------------------------------
Sprite / Node中
virtual void draw(Renderer *renderer, const kmMat4 &transform, bool transformUpdated) override;
->
virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override;
【解决方法】
变更函数接口
-----------------------------------------------------------------------
Error597error C2838: 'UI_TEX_TYPE_PLIST' : illegal qualified name in member declaratione: ...
【解决方案】
枚举类型变更:
TextureResType::UI_TEX_TYPE_PLIST -> TextureResType::PLIST
TextureResType::UI_TEX_TYPE_LOCAL -> TextureResType::LOCAL
-----------------------------------------------------------------------
文件路径变更:
#include "CCVector.h"
->
#include "base/CCVector.h"
-----------------------------------------------------------------------
这是一个低级错误:
const char* btnName = btn_item_bg->getName();
->
const char* btnName = btn_item_bg->getName().c_str();
-----------------------------------------------------------------------
LNK2019 错误
【解决方案】
进入该文件 CCLuaStack.cpp
scripting/lua-bindings/manual/CCLuaStack.cpp
注释掉
line:168
//register_all_cocos2dx_extension(_state);
//register_cocos2dx_extension_CCBProxy(_state);
//register_all_cocos2dx_extension_manual(_state);
//register_all_cocos2dx_spine(_state);
//register_all_cocos2dx_spine_manual(_state);
-----------------------------------------------------------------------
半透明发黑问题解决
Blend默认值错误导致
http://www.cocoachina.com/bbs/read.php?tid=216460
涉及文件:
cocos\editor-support\cocostudio\CCArmature.cpp
cocos\editor-support\cocostudio\CCBone.cpp
cocos\editor-support\cocostudio\CCDatas.cpp
extensions\CocoStudio\Armature\utils\CCDataReaderHelper.cpp
更新cocos2d-x 3.2官方的Armature补丁
1. 修正Armature半透明变黑问题
2. 修正Cocostudio v1.5.0.1以上,导出带有Blend效果的特效,blend src dst默认值不正常的Bug
-----------------------------------------------------------------------
2014-8-13 16:53:33
测试了Armature对blend效果的支持
需要cocostudio版本为 v1.5.0.1 或以上
-----------------------------------------------------------------------
GAME_ROOT\proj.android>build_native.py
The Selected NDK toolchain version was 4.7 !
Android NDK: Invalid APP_STL value: c++_static
Android NDK: Please use one of the following instead: system stlport_static stl
port_shared gnustl_static gnustl_shared gabi++_static gabi++_shared none
make: Entering directory `GAME_ROOT/proj.android'
E:/dev/sdk/android-ndk-r8e/build/core/add-application.mk:243: *** Android NDK: A
borting . Stop.
【问题分析】可能是嫌弃我的NDK版本太老
Windows 64-bit
android-ndk32-r10-windows-x86_64.zip
529850429
b11f9239344f7c377ed5b627f0
于是到这里下载新版本:
https://developer.android.com/tools/sdk/ndk/index.html
下载后解压缩
重新配置环境变量 NDK_ROOT
E:\dev\sdk\android-ndk-r8e
->
E:\dev\sdk\android-ndk-r10
更换了NDK后再次编译:
GAME_ROOT\proj.android>build_native.py
The Selected NDK toolchain version was 4.8 !
Android NDK: jni/Android.mk: Cannot find module with tag '2d' in import path
Android NDK: Are you sure your NDK_MODULE_PATH variable is properly defined ?
解决:
$(call import-module,2d)
->
$(call import-module,.) 不行
$(call import-module,cocos) 行
GAME_ROOT\cocos2d\cocos\Android.mk
LOCAL_MODULE := cocos2dx_static
LOCAL_MODULE_FILENAME := libcocos2d
--------------------------------------------------
The Selected NDK toolchain version was 4.8 !
Android NDK: jni/../../cocos2d/cocos/Android.mk: Cannot find module with tag 'feetype2/prebuilt/android' in import path
Android NDK: Are you sure your NDK_MODULE_PATH variable is properly defined ?
解决:
GAME_ROOT\cocos2d\external\freetype2\prebuilt\android\Android.mk
--------------------------------------------------
LOCAL_MODULE := cocos_freetype2_static
LOCAL_MODULE_FILENAME := freetype2
Android.mk中加入
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_freetype2_static
$(call import-module,external/freetype2/prebuilt/android)
再补充加入:
$(call import-add-path, $(LOCAL_PATH)/../../cocos2d/external)
配置.a工程方法:
GAME_ROOT\cocos2d\external\freetype2\prebuilt\android\Android.mk
--------------------------------------------------
The Selected NDK toolchain version was 4.8 !
Android NDK: jni/../../cocos2d/external/chipmunk/Android.mk: Cannot find module
with tag 'platform/android' in import path
Android NDK: Are you sure your NDK_MODULE_PATH variable is properly defined ?
解决:
补充加入:
$(call import-add-path, $(LOCAL_PATH)/../../cocos2d/cocos)
--------------------------------------------------
The Selected NDK toolchain version was 4.8 !
Android NDK: Trying to define local module 'cocos2dx_static' in jni/../../cocos2d/cocos/./Android.mk.
Android NDK: But this module was already defined by jni/../../cocos2d/cocos/Android.mk.
一定要先设置
# 添加引用路径作为模块的搜索路径
$(call import-add-path, $(LOCAL_PATH)/../../cocos2d)
$(call import-add-path, $(LOCAL_PATH)/../../cocos2d/cocos)
$(call import-add-path, $(LOCAL_PATH)/../../cocos2d/external)
【注意↓】
# cocos/
$(call import-module,.)
$(call import-module,editor-support/cocostudio)
# 引入lua模块 2014-7-11 16:50:45
$(call import-module,scripting/lua-bindings)
【注意↓】
# external/
$(call import-module,iconv)
# 更新cocos2d-x 3.2引擎 依赖 2014-8-13 18:00:59
$(call import-module,freetype2/prebuilt/android)
$(call import-module,audio/android)
$(call import-module,Box2D)
$(call import-module,extensions)
$(call import-module,ui)
$(call import-module,curl/prebuilt/android)
-----------------------------------------------------------------------
2014-8-13 18:20:25 @sonikk
[armeabi] Compile++ thumb: cocos2dx_static <= CCObjLoader.cpp jni/../../cocos2d/cocos/./3d/CCBundleReader.cpp:94:23: error: return type of out-of-line definition of 'cocos2d::BundleReader::tell' differs from that in the declaration ssize_t BundleReader::tell()
^
jni/../../cocos2d/cocos/./3d/CCBundleReader.h:90:14: note: previous declaration
is here
long int tell();
^
1 error generated.
【解决办法】
GAME_ROOT\cocos2d\cocos\3d\CCBundleReader.h
line:90
long int tell();
GAME_ROOT\cocos2d\cocos\3d\CCBundleReader.cpp
line:94
ssize_t BundleReader::tell();
不匹配
调整.cpp文件的类型 ssize_t -> long int (不推荐)
调整.h文件的类型 long int -> ssize_t (推荐)
-----------------------------------------------------------------------
E:/dev/sdk/android-ndk-r10/toolchains/arm-linux-androideabi-4.8/prebuilt/windows
-x86_64/lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin\
ld.exe: error: E:/dev/sdk/android-ndk-r10/toolchains/arm-linux-androideabi-4.8/p
rebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.8/libgcc.a(pr-support.o):
multiple definition of '_Unwind_GetRegionStart'
E:/dev/sdk/android-ndk-r10/toolchains/arm-linux-androideabi-4.8/prebuilt/windows
-x86_64/lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin\
ld.exe: E:/dev/sdk/android-ndk-r10/sources/cxx-stl/llvm-libc++/libs/armeabi/thum
b/libc++_static.a(Unwind-EHABI.o): previous definition here
E:/dev/sdk/android-ndk-r10/toolchains/arm-linux-androideabi-4.8/prebuilt/windows
-x86_64/lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin\
ld.exe: error: E:/dev/sdk/android-ndk-r10/toolchains/arm-linux-androideabi-4.8/p
rebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.8/libgcc.a(pr-support.o):
multiple definition of '_Unwind_GetLanguageSpecificData'
E:/dev/sdk/android-ndk-r10/toolchains/arm-linux-androideabi-4.8/prebuilt/windows
-x86_64/lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin\
ld.exe: E:/dev/sdk/android-ndk-r10/sources/cxx-stl/llvm-libc++/libs/armeabi/thum
b/libc++_static.a(Unwind-EHABI.o): previous definition here
clang++.exe: error: linker command failed with exit code 1 (use -v to see invoca
tion)
查询文章:
Compiling and linking error when using NDK r10 to build cocos2d-x v3.2
http://www.cocos2d-x.org/news/307
https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=73907
解决方案:更改使用 ndk_r9d
-----------------------------------------------------------------------
2014-8-13 20:15:14
使用r9d编译遇到的问题:
make.exe: *** No rule to make target `E:/dev/sdk/android-ndk-r10/sources/android
/cpufeatures/cpu-features.c', needed by `obj/local/armeabi/objs-debug/cpufeature
s/cpu-features.o'. Stop.
重新打开cmd,重新编译就ok了,暴汗
-----------------------------------------------------------------------
2014-8-13 20:15:10
Caused by: java.lang.ClassNotFoundException: Didn't find class "PACKAGE_NAME.MyApplication" on path: DexPathList[[zip file "/data/app/
PACKAGE_NAME-1.apk"],nativeLibraryDirectories=[/data/app-lib/
PACKAGE_NAME-1, /vendor/lib, /system/lib]]
解决方法:
拷贝:
OLD_GAME_ROOT\proj.android\src\
PACKAGE_NAME
->
GAME_ROOT\proj.android\src\
PACKAGE_NAME
-----------------------------------------------------------------------
Fatal signal 11 (SIGSEGV) at 0xf5725692 (code=1), thread 29878 (Thread-971)
解决途径:
1. 先放了一个Sprite进去,一切正常
2. 在一进去之前设置return,缩小问题范围
3. 打 ID Log
4. 最终定位到:
sonikk [3]
Fatal signal 11 (SIGSEGV) at 0xf5725692 (code=1), thread 9623 (Thread-1136)
CCLOG("sonikk [3]");
char buf[64];
sprintf(buf, "%d%", 100);
LabelBMFont* label = LabelBMFont::create(buf, "fonts/fnt002.fnt", 36);
label->setTag(kTagLoadingLabel);
label->setAnchorPoint(ccp(0.5, 0.5));
label->setScale(0.98f);
label->setPosition(Point(41.0f, -68.0f - 218.0f)); // new pic
//label->setColor(Color3B(255, 96, 96));
node->addChild(label);
CCLOG("sonikk [4]");
char buf[64];
CCLOG("sonikk [3.1]");
//sprintf(buf, "%d%", 100);
sprintf(buf, "%d", 100); // %% 表示一个%
CCLOG("sonikk [3.2]");
LabelBMFont* label = LabelBMFont::create(buf, "fonts/fnt002.fnt", 36);
CCLOG("sonikk [3.3]");
label->setTag(kTagLoadingLabel);
CCLOG("sonikk [3.4]");
label->setAnchorPoint(ccp(0.5, 0.5));
CCLOG("sonikk [3.5]");
label->setScale(0.98f);
CCLOG("sonikk [3.6]");
label->setPosition(Point(41.0f, -68.0f - 218.0f)); // new pic
CCLOG("sonikk [3.7]");
//label->setColor(Color3B(255, 96, 96));
node->addChild(label);
CCLOG("sonikk [4]");
sonikk [3]
sonikk [3.1]
Fatal signal 11 (SIGSEGV) at 0xf5726692 (code=1), thread 10534 (Thread-1139)
问题元凶:
sprintf(buf, "%d%", 100);
正确的写法:
sprintf(buf, "%d%%", 100);
%%是转义字符,其实是表示%,奇怪之前用ndk_r8e编译,并没有出现这个错误
-----------------------------------------------------------------------
2014-8-13 21:06:26
加载骨骼动画出错:
Get data from file(RESOURCE_ROOT/arma/effect/hit01.ExportJson) failed!
GetParseError Text only contains white space(s)
Assert failed: AnimationData not exist!
jni/../../cocos2d/cocos/editor-support/cocostudio/CCArmature.cpp function:init line:134
jni/../../cocos2d/cocos/editor-support/cocostudio/CCArmature.cpp function:init line:140
Fatal signal 11 (SIGSEGV) at 0x00000028 (code=1), thread 24368 (Thread-1283)
经过对比:
发现CCArmatureDataManager.cpp 和cocos2d-x 3.0版本并没有什么区别
【解决方法】
重载CCFileUtil当中的函数参数类型有变动,最好就是加入override关键字(c++11的新特性),这样一旦接口有了变动,就能够快速获知导致问题的原因
.h文件:
virtual unsigned char* getFileData( const char* pszFileName, const char* pszMode, unsigned long * pSize );
->
virtual unsigned char* getFileData(const std::string& pszFileName, const char* pszMode, ssize_t* pSize) override;
.cpp文件:
unsigned char* CCFileUtilsPack::getFileData( const char* pszFileName, const char* pszMode, unsigned long * pSize )
->
unsigned char* CCFileUtilsPack::getFileData(const std::string& pszFileName, const char* pszMode, ssize_t* pSize)
-----------------------------------------------------------------------
偶尔会出现:
jni/../../cocos2d/cocos/platform/android/CCApplication.cpp function:getInstance line:79
Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 23420 (Thread-1226)
-----------------------------------------------------------------------
编译工程的时候发生:Compute Launch Button Tooltip error in Eclipse
【解决】
(一开始以为重装eclipse就能搞定,于是重装了Android SDK + eclipse,发现打开工程还不行)
(于是又尝试了参考这篇文章,尝试删除CDT插件
http://jingyan.baidu.com/album/54b6b9c02dcd5a2d583b4704.html
结果发现无法删除CDT,只能一次性删除整个ADT(包含CDT) )
Android Developer Tools
ADT Package
Android Native Development Tools
C/C++ Development Tools
Uninstall...
ADT Package
Android Native Development Tools
C/C++ Development Tools
Uninstall...
【解决方法】
进入到proj.android工程目录下面,删除.cproject文件,重新打开eclipse,进行编译
-----------------------------------------------------------------------
2014-8-14 14:36:51
iOS编译xcode工程的过程中遇到的问题:
.a文件由于svn自动把文件列表过滤掉了,结果造成prebuild当中的.a文件没有上传
以后上传引擎的时候一定要注意这个小问题,否则xcode工程在配置的时候会无法找到这些.a文件
【解决方法】
重新查找出引擎目录下面的所有.a文件,并提交svn上传
-----------------------------------------------------------------------
2014-8-14 14:42:26
编译过程中,发现LNK错误:
引入
MediaPlayer.framework
-----------------------------------------------------------------------
2014-8-14 15:07:24
在Android运行的时候,发现没有找到文件造成了崩溃,这在之前cocos2d-x 3.0版本中是没有出现的
定位问题:
【解决方法】
bool isExist = FileUtils::getInstance()->isFileExist( file_relative_path );
if (isExist)
{
ArmatureDataManager::getInstance()->addArmatureFileInfo( file_relative_path );
}
if (isExist)
{
ArmatureDataManager::getInstance()->addArmatureFileInfo( file_relative_path );
}
-----------------------------------------------------------------------
2014-8-14 15:13:55
运行过程中出现:
Android 真机
频繁输出日志:
cocos2d-x debug info
OpenGL error 0x0500 in jni/../../cocos2d/cocos/ui/UILayout.cpp onBeforeVisitStencil 337
相关文章:
http://blog.itpub.net/14466241/viewspace-761160/
【暂时未解决】
-----------------------------------------------------------------------
之前3.0版本的自定义ShaderSprite 错误
【解决方法】
使用EffectSprite + Effect 重写了一个版本
并修改了Shader文件,使其支持了半透明的设置
效果拔群~
-----------------------------------------------------------------------
visible 与 touch事件的关系
【解决方法】
cocos2d-x 3.0之前的Widget,为了使其消失后同时无法响应事件,则需要这样写
setVisible(false);
setEnabled(false);
cocos2d-x 3.2以后,发现只用写
setVisible(false)
即可
-----------------------------------------------------------------------
SpriteBatchNode 研究
auto BatchNode = SpriteBatchNode::create("Images/grossini_dance_atlas.png", 50);
addChild(BatchNode, 0, kTagSpriteBatchNode);
auto sprite = Sprite::createWithTexture(BatchNode->getTexture(), Rect(x,y,85,121));
BatchNode->addChild(sprite);
addChild(BatchNode, 0, kTagSpriteBatchNode);
auto sprite = Sprite::createWithTexture(BatchNode->getTexture(), Rect(x,y,85,121));
BatchNode->addChild(sprite);
-----------------------------------------------------------------------
2014-8-28 14:26:47
发现了在cocostudio 1.5.0.1里导出的骨骼动画*.ExportJson
frame_data:[
{
"bd_src":770,
"bd_dst":771
},
]
这样的话,放在升级过补丁的cocos2d-x 3.2当中就会出现,setOpacity(128) 导致半透明会变暗的问题。
后来发现重新用
cocostudio 1.5.0.1导出了骨骼动画*.ExportJson
frame_data:[
{
"bd_src":1,
"bd_dst":771
},
]
问题得到了解决。
【解决方法】
把
"bd_src":770, 替换为 "bd_src":1,
后来测试了
cocostudio 1.6.0.0导出骨骼动画,该值也是 bd_src : 770,
但是
cocostudio 1.6.0.0会出一个问题,就是导出时 plist可能会缺少某几张使用过的图片
所以1.6.0.0在导出时一定要设置【导出全部图片】,而不能设置为【导出使用图片】
所以,推荐使用
cocostudio 1.5.0.1版本导出。