更改日志:
2014-8-13
升级之前可以先看看官网的新特性,以及编译工具链版本变更
http://www.cocos2d-x.org/news/305
官方推荐编译工具版本:
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
-----------------------------------------------------------------------
getChildByName() 返回类型变更: Widget* -> Node*
Widget* img_t = dynamic_cast(_ui->getChildByName("img_t"));
【解决方法】
在所有调用
getChildByName 新增dynamic_cast( ) 函数包裹
-----------------------------------------------------------------------
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...
【解决方法】
进入到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 );
}
-----------------------------------------------------------------------
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);
-----------------------------------------------------------------------
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版本导出。
n