Cocos2d-x常见问题汇总 第二期

Cocos2d-x常见问题汇总 第二期,第1张

概述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

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修改深度缓存)

1 2 3 4 5 6 7
EAGLVIEw*__glVIEw=[EAGLVIEwvIEwWithFrame:[windowbounds] pixelFormat:kEAGLcolorFormatRGBA8 depthFormat:GL_DEPTH24_STENCIL8_OES preserveBackbuffer:NO sharegroup:nil multiSampling:NO numberOfSamples:0];


(2)AndroID:在AppActivity.java修改(AndroID修改深度缓存)

7 8 9
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代码。

9 10 11 12 13 14 15 16 17 18 19 20
#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" ); @H_713_301@ (!isHave){ log ( "jni:testjnIISnull" ); } else { minfo.env->CallStaticVoIDMethod(minfo.classID,minfo.methodID); } #endif }

(2)Java部分:

在org.cocos2dx.cpp.Activity中增加如下函数,供C++调用。

3
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调用。

12
#include<jni.h> #ifdef__cplusplus @H_776_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++代码。

11
@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来实现这个功能

17
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实现

20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
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); //使用schedule在下一帧中调用callback函数 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函数来实现截图功能

1
Util::captureScreen( ( std::string&)>&afterCaptured,monospace!important; Font-size:1em!important; min-height:inherit!important; color:black!important">std::string&filename);


8.Q:如何在Cocos2d-x获取随机数?

首先计算机是无法产生真正的随机数的,都是伪随机。获取随机数的方式和算法多种多样,这里只给出一种方法,基于最新的C++11。

5
#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,程序会停止工作。

解决方法是:手动将资源文件拷贝到xxx.exe同级目录下。


(2)如果采用的是命令行

1
cocosrun-pwin32

那目标文件会被生成到项目/bin/deBUG/win32目录下,同时资源文件也会被拷贝到这个文件夹,此时直接点击xxx.exe就可以运行。项目/proj.win32/DeBUG.win32目录也会有xxx.exe,点击也会提示停止工作,解决方法同上。

总结

以上是内存溢出为你收集整理的Cocos2d-x常见问题汇总 第二期全部内容,希望文章能够帮你解决Cocos2d-x常见问题汇总 第二期所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1031256.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)