From: http://cn.cocos2d-x.org/tutorial/show?id=1438
1. Q:如何在安卓上给应用程序设置透明背景?
(1) NativeActivity,以Cocos2d-x 3.0 rc0为例
链接:http://www.cocoachina.com/bbs/read.php?tid=196780
(2) JavaActivity,以Cocos2d-x 3.2 release为例
链接:http://www.cocoachina.com/bbs/read.php?tid=224544
2. Q:SimpleAudioEngine在Windows平台上卡顿严重,无法调节音量?
SimpleAudioEngine是分平台实现的,Windows平台上部分API是空实现(比如preloadBackgroundMusic等等),所以在Windows平台上并不提供预加载,调节音量等功能(参见cocos/audio/win32/SimpleAudioEngine.cpp),移植到Android/iOS/Mac上就正常了。Windows上调节音量有网友提供了解决方案。
参考链接:http://www.cocoachina.com/bbs/read.php?tid=213345
3. Q:Cocos2d-x 3.x无法重写Node::draw()方法?
Cocos2d-x 从v3.0开始将Node::draw()方法标记为final(参见cocos2d/2d/CCNode.h),引擎另外提供了draw函数
1
|
virtual
void
draw(Renderer*renderer,
const
Mat4&transform,uint32_tflags);
|
可以通过重写这个函数来绘制你自己的节点,需注意的是如果更改了任何的GL状态,在使用完后必须还原。
参考链接:http://www.cocoachina.com/bbs/read.php?tid=200176
4. Q:使用ClippingNode,为什么在Android/iOS裁剪显示错误,或者背景变为绿色?
未开启OpenGL深度缓存,解决方法如下:
(1)iOS:在AppController.mm修改(iOS修改深度缓存)
EAGLView*__glView=[EAGLViewviewWithFrame:[windowbounds]
pixelFormat:kEAGLColorFormatRGBA8
depthFormat:GL_DEPTH24_STENCIL8_OES
preserveBackbuffer:NO
sharegroup:nil
multiSampling:NO
numberOfSamples:0];
|
(2)Android:在AppActivity.java修改(Android修改深度缓存)
public
class
AppActivityextendsCocos2dxActivity{
public
Cocos2dxGLSurfaceViewonCreateView(){
Cocos2dxGLSurfaceViewglSurfaceView=
new
Cocos2dxGLSurfaceView(
this
);
//TestCppshouldcreatestencilbuffer
glSurfaceView.setEGLConfigChooser(5,6,5,16,8);
return
glSurfaceView;
}
}
|
5.Q:如何在Cocos2d-x实现C++调用Java?
C++调用Java代码主要是通过JNI实现,这里以Cocos2d-x 3.2为例。
(1)C++部分:在HelloWorld.cpp增加如下函数,用于调用java代码。
#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
#include<jni.h>
#include"platform/android/jni/JniHelper.h"
#include<cocos2d.h>
#endif
HelloWorld::testJNI()
{
#
if
(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
JniMethodInfominfo;
bool
isHave=JniHelper::getStaticMethodInfo(minfo,
"org/cocos2dx/cpp/AppActivity"
,monospace!important; font-size:1em!important; min-height:inherit!important; color:blue!important">"testjni"
"()V"
);
(!isHave){
log
(
"jni:testjniisnull"
);
}
else
{
minfo.env->CallStaticVoidMethod(minfo.classID,minfo.methodID);
}
#endif
}
|
(2)Java部分:
在org.cocos2dx.cpp.Activity中增加如下函数,供C++调用。
static
testjni(){
System.out.println(
"FromJava"
);
}
|
更详细的使用说明,请参考:Java Native Interface Specification
6.Q:如何在Cocos2d-x实现Java调用C++?
Java调C++代码也是通过JNI实现,当然Android给我们提供了更方便的工具NDK。由于这里是以Cocos2d-x为例,所以不再去赘述NDK使用。同样以Cocos2d-x 3.2为例。
(1)C++部分:在HelloWorld.cpp增加如下函数,供java调用。
#include<jni.h>
#ifdef__cplusplus
@H_659_403@extern
"C"
{
#endif
JNIEXPORTjstringJNICALLJava_org_cocos2dx_cpp_AppActivity_testjni
(JNIEnv*env,jclass)
{
env->NewStringUTF(
"FromC++"
);
}
#ifdef__cplusplus
}
#endif
|
(2)Java部分:在org.cocos2dx.cpp.Activity中增加如下函数,用于调用C++代码。
@Override
protected
onCreate(BundlesavedInstanceState){
//TODOAuto-generatedmethodstub
super.onCreate(savedInstanceState);
System.out.println(testjni());
static
nativeStringtestjni();
}
|
参考地址:Java Programming Tutorial Java Native Interface
7.Q:如何在Cocos2d-x实现截图功能?
(1)Cocos2d-x 2.x
Cocos2d-x 2.x没有提供截图功能,但是可以用CCRenderTexture来实现这个功能
CTestLayer::SaveScreenShot()
{
//获取屏幕尺寸
CCSizesize=CCDirector::sharedDirector()->getWinSize();
//使用屏幕尺寸初始化一个空的渲染纹理对象
CCRenderTexture*texture=CCRenderTexture::create((
int
)size.width,(
)size.height);
//设置位置
texture->setPosition(ccp(size.width/2,size.height/2));
//开始获取
texture->begin();
//遍历场景节点对象,填充纹理到texure中
CCDirector::sharedDirector()->getRunningScene()->visit();
//结束获取
texture->end();
//保存为PNG图,Win32/Debug目录下
texture->saveToFile(
"screenshot.png"
}
|
(2)Cocos2d-x 3.x
在Cocos2d-x 3.2之前,引擎也没有提供截图功能,同样可以使用RenderTexture实现
Director::saveScreenshot(
std::string&fileName,monospace!important; font-size:1em!important; min-height:inherit!important; color:black!important">std::function<
(
std::string&)>&callback)
Image::Formatformat;
//进行后缀判断
(std::string::npos!=fileName.find_last_of(
"."
)){
autoextension=fileName.substr(fileName.find_last_of(
),fileName.length());
(!extension.compare(
".png"
)){
format=Image::Format::PNG;
else
".jpg"
)){
format=Image::Format::JPG;
{
"cocos2d:theimagecanonlybesavedasJPGorPNGformat"
;
}
{
);
;
//获取屏幕尺寸,初始化一个空的渲染纹理对象
autorenderTexture=RenderTexture::create(getWinSize().width,getWinSize().height,Texture2D::PixelFormat::RGBA8888);
//清空并开始获取
renderTexture->beginWithClear(0.0f,0.0f,0.0f);
//遍历场景节点对象,填充纹理到RenderTexture中
getRunningScene()->visit();
//结束获取
renderTexture->end();
//保存文件
renderTexture->saveToFile(fileName,format);
autofullPath=FileUtils::getInstance()->getWritablePath()+fileName;
autoscheduleCallback=[&,fullPath,callback](
float
dt){
callback(fullPath);
};
auto_schedule=getRunningScene()->getScheduler();
_schedule->schedule(scheduleCallback,153)!important">false
"screenshot"
);
}
|
从Cocos2d-x 3.2之后开始,引擎提供了captureScreen函数来实现截图功能
Util::captureScreen(
(
std::string&)>&afterCaptured,monospace!important; font-size:1em!important; min-height:inherit!important; color:black!important">std::string&filename);
|
首先计算机是无法产生真正的随机数的,都是伪随机。获取随机数的方式和算法多种多样,这里只给出一种方法,基于最新的C++11。
#include<random>
std::uniform_int_distribution<unsigned>u(1,1000);
std::default_random_enginee;
e.seed((unsigned)
time
(NULL));
random_number=u(e);
|
这个例子产生了一个范围在1~1000的随机数(这里采用的标准分布是离散型均匀分布)。
参考:C++11:Random number generation
9.Q:为什么直接点击Windows平台生成的exe可执行文件,提示程序已停止工作?
这里以Cocos2d-x 3.2为例。
(1)如果直接在Visual Studio编译生成目标文件,那么目标文件会被生成到项目/proj.win32/Debug.win32目录下(debug模式)或者项目/proj.win32/release.win32目录下(release模式)。由于资源文件没有拷贝到目标文件目录的关系,此时点击xxx.exe,程序会停止工作。
(2)如果采用的是命令行
cocosrun-pwin32 |
那目标文件会被生成到项目/bin/debug/win32目录下,同时资源文件也会被拷贝到这个文件夹,此时直接点击xxx.exe就可以运行。项目/proj.win32/Debug.win32目录也会有xxx.exe,点击也会提示停止工作,解决方法同上。