文档章节

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

piggybear
 piggybear
发布于 2015/02/16 10:32
字数 1575
阅读 6
收藏 0
点赞 0
评论 0

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_t flags);

可以通过重写这个函数来绘制你自己的节点,需注意的是如果更改了任何的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 = [EAGLView viewWithFrame: [window bounds]
                                  pixelFormat: kEAGLColorFormatRGBA8
                                  depthFormat: GL_DEPTH24_STENCIL8_OES
                           preserveBackbuffer: NO
                                   sharegroup: nil
                                multiSampling: NO
                              numberOfSamples: 0];


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

1
2
3
4
5
6
7
8
9
public  class  AppActivity extends Cocos2dxActivity {
 
     public  Cocos2dxGLSurfaceView onCreateView() {
         Cocos2dxGLSurfaceView glSurfaceView =  new  Cocos2dxGLSurfaceView( this );
         // TestCpp should create stencil buffer
         glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);
         return  glSurfaceView;
     }
}


5.Q:如何在Cocos2d-x实现C++调用Java?

C++调用Java代码主要是通过JNI实现,这里以Cocos2d-x 3.2为例。


(1)C++部分:在HelloWorld.cpp增加如下函数,用于调用java代码。

1
2
3
4
5
6
7
8
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
 
void  HelloWorld::testJNI()
{
       # if  (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
           JniMethodInfo minfo;
 
           bool  isHave = JniHelper::getStaticMethodInfo(minfo, "org/cocos2dx/cpp/AppActivity" , "testjni" "()V" );
 
           if  (!isHave) {
               log ( "jni:testjni is null" );
           } else {
               minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);
           }
       #endif
  }

(2)Java部分:

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

1
2
3
public  static  void  testjni() {
       System.out.println( "From Java" );
   }

更详细的使用说明,请参考: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调用。

1
2
3
4
5
6
7
8
9
10
11
12
#include <jni.h>
#ifdef __cplusplus
extern  "C"  {
  #endif
     JNIEXPORT jstring JNICALL Java_org_cocos2dx_cpp_AppActivity_testjni
     (JNIEnv *env, jclass)
     {
         return  env->NewStringUTF( "From C++" );
     }
   #ifdef __cplusplus
  }
#endif

(2)Java部分:在org.cocos2dx.cpp.Activity中增加如下函数,用于调用C++代码。

1
2
3
4
5
6
7
8
9
10
11
public  class  AppActivity extends Cocos2dxActivity {
 
   @Override
   protected  void  onCreate(Bundle savedInstanceState) {
       // TODO Auto-generated method stub
       super.onCreate(savedInstanceState);
       System.out.println(testjni());
   }
   
   public  static  native String testjni();
   }

参考地址:Java Programming Tutorial Java Native Interface


7.Q:如何在Cocos2d-x实现截图功能?

(1)Cocos2d-x 2.x

Cocos2d-x 2.x没有提供截图功能,但是可以用CCRenderTexture来实现这个功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void  CTestLayer::SaveScreenShot()
   {
       //获取屏幕尺寸  
       CCSize size = CCDirector::sharedDirector()->getWinSize();
       //使用屏幕尺寸初始化一个空的渲染纹理对象  
       CCRenderTexture* texture = CCRenderTexture::create(( int )size.width, ( int )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" , kCCImageFormatPNG);
   }

  

(2)Cocos2d-x 3.x

在Cocos2d-x 3.2之前,引擎也没有提供截图功能,同样可以使用RenderTexture实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void  Director::saveScreenshot( const  std::string& fileName, const  std::function< void ( const  std::string&)>& callback)
   {
       Image::Format format;
       //进行后缀判断  
       if (std::string::npos != fileName.find_last_of( "." )){
         auto extension = fileName.substr(fileName.find_last_of( "." ),fileName.length());
         if  (!extension.compare( ".png" )) {
             format = Image::Format::PNG;
         else  if (!extension.compare( ".jpg" )) {
             format = Image::Format::JPG;
         else {
             log ( "cocos2d: the image can only be saved as JPG or PNG format" );
             return ;
         }
     else  {
         log ( "cocos2d: the image can only be saved as JPG or PNG format" );
         return  ;
     }
     //获取屏幕尺寸,初始化一个空的渲染纹理对象  
       auto renderTexture = RenderTexture::create(getWinSize().width, getWinSize().height, Texture2D::PixelFormat::RGBA8888);
       //清空并开始获取  
       renderTexture->beginWithClear(0.0f, 0.0f, 0.0f, 0.0f);
       //遍历场景节点对象,填充纹理到RenderTexture中  
       getRunningScene()->visit();
       //结束获取  
       renderTexture->end();
       //保存文件  
       renderTexture->saveToFile(fileName , format);
       //使用schedule在下一帧中调用callback函数  
       auto fullPath = FileUtils::getInstance()->getWritablePath() + fileName;
       auto scheduleCallback = [&,fullPath,callback]( float  dt){
           callback(fullPath);
       };
       auto _schedule = getRunningScene()->getScheduler();
       _schedule->schedule(scheduleCallback,  this , 0.0f,0,0.0f,  false "screenshot" );
   }


从Cocos2d-x 3.2之后开始,引擎提供了captureScreen函数来实现截图功能

1
void  Util::captureScreen( const  std::function< void ( bool const  std::string&)>& afterCaptured,  const  std::string& filename);


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

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

1
2
3
4
5
#include <random>
std::uniform_int_distribution<unsigned> u(1,1000);
std::default_random_engine e;
e.seed((unsigned) time (NULL));
int  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
cocos run -p win32

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


推荐阅读:

Cocosd-x经典问题汇总 第一期


来源网址:http://www.fusijie.com/blog/2014/08/26/cocos2dx-faq-1/

本文转载自:http://blog.csdn.net/aa294194253/article/details/39029041

共有 人打赏支持
piggybear
粉丝 3
博文 237
码字总数 37552
作品 0
西安
技术主管
cocos2d-x学习资料(转)

我之前一直学习c++的,第一次接触cocos2d是oc版的,虽然很好用,但是,我还是对c++情有独钟,再加之cocos2d-x由自己人主导,更应该拥抱她,热爱她,把她发扬光大。之后,我将会全面投入c...

未来十年 ⋅ 2012/07/31 ⋅ 0

《Cocos2d-x实战 C++卷》上线了-源码-样章-感谢大家的支持

《Cocos2d-x实战 C++卷》上线了 感谢大家一直以来的支持! 全面介绍Cocos开发技巧,采用Cocos2d-x3.2版本,并且详细介绍跨平台移植已经多平台发布细节。 · 各大商店均开始销售: 京东:htt...

智捷课堂 ⋅ 2014/12/01 ⋅ 0

cocos2d-x 学习

【eoeAndroid社区】特意为大家汇总了cocos2d-x知识贴,分量十足,纯正干或。从基础教程到游戏应用的开发,我们不让知识流失,我们要做知识的搬运工还有加工师。希望大家能够一起的学习,和大...

小克898 ⋅ 2012/10/30 ⋅ 0

《Cocos2d-x实战 Lua卷》上线了

感谢大家一直以来的支持! 各大商店均开始销售: 京东:http://item.jd.com/11659697.html 当当:http://product.dangdang.com/23659810.html 《Cocos2d-x实战 Lua卷》源码及样章下载地址: ...

智捷课堂 ⋅ 2015/03/26 ⋅ 1

Cocos Creator常见问题汇总

常见问题汇总: 1.本地存储数据 cc.sys.localStorage.getItem(key,value); cc.sys.localStorage.setItem(key,value); 2.读取文本文件 cc.loader.loadTxt(cc.url.raw('scripts/test.proto'), ......

flyoahc ⋅ 2016/03/01 ⋅ 0

购买李宁Cocos2d-x套餐,送最新出的《Cocos2d-x游戏实战指南》签名书一本

活动时间:2016-10-18至2016-11-30 通过本套餐,可完全了解Cocos2d-x 3.x的相关技术,以及掌握C++语言,并具有一定的项目实战经验。 Cocos2d-x游戏开发套餐:http://edu.51cto.com/pack/vie...

androidguy ⋅ 2016/10/17 ⋅ 0

JavaScript强化教程——Cocos2d-JS中JavaScript继承

本文为 H5EDU 机构官方 HTML5培训 教程,主要介绍:JavaScript强化教程 —— Cocos2d-JS中JavaScript继承 JavaScript语言本身没有提供类,没有其它语言的类继承机制,它的继承是通过对象的原...

哟猫Intry ⋅ 2016/07/08 ⋅ 0

Cocos2d-JS中JavaScript继承

JavaScript语言本身没有提供类,没有其它语言的类继承机制,它的继承是通过对象的原型实现的,但这不能满足Cocos2d-JS引擎的要求。由于Cocos2d-JS引擎是从Cocos2d-x演变而来的,在Cocos2d-J...

智捷课堂 ⋅ 2015/03/17 ⋅ 0

Cocos2d-X游戏开发:搭建Cocos2d-X开发环境

原文:Himi博客 cocos2d-x 是一个开源的,跨平台的,轻量级的2D游戏引擎。今天我们就来分享如何在Mac系统下搭建cocos2d-X引擎吧。 首先到Cocos2d-X下载地址下载最新版,下载的是cocos2d-1.0...

红薯 ⋅ 2012/01/15 ⋅ 3

Cocos2d-x 2.0 拖尾效果深入分析

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路CSDN博客地址:http://blog.csdn.net/honghaier] 红孩儿Cocos2d-X学习园地QQ群:249941957加群写:Cocos2d-x 红孩儿Cocos2d-X学习园地QQ2群:4...

长平狐 ⋅ 2013/03/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CENTOS7防火墙命令记录

安装Firewall命令: yum install firewalld firewalld-config Firewall开启常见端口命令: firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --zone=public --add-po......

cavion ⋅ 18分钟前 ⋅ 0

【C++】【STL】利用chromo来测量程序运行时间与日志时间打印精确到微秒

直接上代码吧,没啥好说的。头疼。 #include <iostream>#include <string>#include <ctime>#include <sstream>#include <iomanip>#include <thread>#include <chrono>using ......

muqiusangyang ⋅ 21分钟前 ⋅ 0

Mac环境下svn的使用

在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境。在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还需做一下简...

故久呵呵 ⋅ 31分钟前 ⋅ 0

破解公司回应苹果“USB限制模式”:已攻破

本周四,苹果发表声明称 iOS 中加入了一项名为“USB 限制模式”的功能,可以防止 iPhone 在连接其他设备的时候被破解,并且强调这一功能并不是针对 FBI 等执法部门,为的是保护用户数据安全。...

六库科技 ⋅ 32分钟前 ⋅ 0

MyBtais整合Spring Boot整合,TypeHandler对枚举类(enum)处理

概要 问题描述 我想用枚举类来表示用户当前状态,枚举类由 code 和 msg 组成,但我只想把 code 保存到数据库,查询处理,能知道用户当前状态,这应该怎么做呢?在 Spring 整合MyBatis 的时候...

Wenyi_Feng ⋅ 51分钟前 ⋅ 0

synchronized与Lock的区别

# <center>王梦龙的读书笔记第一篇</center> ## <center>-synchronized与Lock的区别</centre> ###一、从使用场景来说 + synchronized 是能够注释代码块、类、方法但是它的加锁是和解锁使用一......

我不想加班 ⋅ 今天 ⋅ 0

VConsole的使用

手机端控制台打印输出,方便bug的排查。 首先需要引入vconsole.min.js 文件,然后在文件中创造实例。就能直接使用了。 var vConsole = new VConsole(); vConsole的文件地址...

大美琴 ⋅ 今天 ⋅ 0

Java NIO之字符集

1 字符集和编解码的概念 首先,解释一下什么是字符集。顾名思义,就是字符的集合。它的初衷是把现实世界的符号映射为计算机可以理解的字节。比如我创造一个字符集,叫做sex字符集,就包含两个...

士别三日 ⋅ 今天 ⋅ 0

Spring Bean基础

1、Bean之间引用 <!--如果Bean配置在同一个XML文件中,使用local引用--><ref bean="someBean"/><!--如果Bean配置在不同的XML文件中,使用ref引用--><ref local="someBean"/> 其实两种......

霍淇滨 ⋅ 今天 ⋅ 0

05、基于Consul+Upsync+Nginx实现动态负载均衡

1、Consul环境搭建 下载consul_0.7.5_linux_amd64.zip到/usr/local/src目录 cd /usr/local/srcwget https://releases.hashicorp.com/consul/0.7.5/consul_0.7.5_linux_amd64.zip 解压consu......

北岩 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部