javacocos2dx
‘壹’ cocos2dx c++调用java时 类找不到
JNI(Java Native Interface):Java的本地调用。本文通过JNI在Cocos2d-x3.3RC0中完成Java与C++的互调。具体实现以下两个功能:(1)通过Android sdk的API得到应用程序的包名,并传递给C++层函数。(2)通过C++函数调用Android的Java层函数,显示一个对话框。点击按钮退出程序。
‘贰’ 怎样设置cocos2dx背景透明
就如果你想让你的activity透明,很简单,只需要4步。1. 打开AndroidManifest.xml文件,添加Translucent到
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
2.打开Cocos2dxActivity.java文件,添加
getWindow().setFormat(PixelFormat.TRANSLUCENT);
3.打开cocos2d/cocos/2d/CCDirector.cpp文件,找到setGLDefaultValues()函数,修改最后一个alpha值,范围从0.0f到1.0f。
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
4.打开cocos2d/cocos/2d/platform/android/nativeactivity.cpp,找到engine_init_display(struct engine* engine)函数,修改如下数组
从
const EGLint attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_BLUE_SIZE, 5,
EGL_GREEN_SIZE, 6,
EGL_RED_SIZE, 5,
EGL_DEPTH_SIZE, 16,
EGL_STENCIL_SIZE, 8,
EGL_NONE
};
到
const EGLint attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
//EGL_BLUE_SIZE, 5, -->delete
//EGL_GREEN_SIZE, 6, -->delete
//EGL_RED_SIZE, 5, -->delete
EGL_BUFFER_SIZE, 32, //-->new field
EGL_DEPTH_SIZE, 16,
EGL_STENCIL_SIZE, 8,
EGL_NONE
};
‘叁’ 如何将cocos2dx移植到eclipse上
1.准备三个工具:并解压放置在Documents目录下
a.Android开发环境包ADT 已经集成在Eclipse中,我的是adt-bundle-mac-x86_64-20130917mac下默认已经安装了JDK
b.Android NDK 即Android环境本地编译C++的包,用r8的,r9的貌似有问题 去网络空间下android-ndk-r8
c.cocos2d-x 开发包, 我的是cocos2d-x-2.1.4
2.添加全局变量vi ~/.bash_profile其中添加如下:路径不要有空格
export NDK_ROOT_LOCAL=/Users/user/Documents/android-ndk-r8
export NDK_ROOT=$NDK_ROOT_LOCAL
export ANDROID_NDK_ROOT=$NDK_ROOT
export ANDROID_SDK_ROOT=/Users/user/Documents/adt-bundle-mac-x86_64-20130917/sdk
export ANDROID_SDK_ROOT_LOCAL=$ANDROID_SDK_ROOT
export COCOS2DX_ROOT=/Users/user/Documents/cocos2d-x-2.1.4
export PATH=$ANDROID_NDK_ROOT:$PATH
export PATH=$ANDROID_SDK_ROOT:$PATH
export PATH=$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools:$PATH
这样以后就不需要在create-android-project.shbuild_native.sh这两个脚本中再重新修改添加响应的路径了
3.直接cd 到cocos2d-x-2.1.4目录下并执行“./create-android-project.sh”根据提示输入相应的包名,项目名和版本号。
生成的项目会在cocos2d-x-2.1.4目录下(这里假设项目名为PPP),然后cd到 PPP/proj.android下,执行“./build_native.sh” 如此编译生成C++的相关静态库,有时某些头文件需要include 如:/Users/user/Documents/cocos2d-x-2.1.4/cocos2dx/platform/android/CCFileUtilsAndroid.h
4.打开Eclipse 导入刚刚生成的项目PPP,并修改AndroidManifest.xml中得icon名称,另外还需在Eclipse里导入cocos2d-x的两个工程库最终如下:
libcocos2dx 位于/User/users/Documents/cocos2d-x-2.1.4/cocos2dx/platform/android/java
libPluginProtocol 位于/User/users/Documents/cocos2d-x-2.1.4/plugin/protocols/proj.android
‘肆’ 请问java转cocos2dx游戏开发的难度、学习曲线
风险肯定是有的~转过来又俩问题,一个是没做过游戏~整个游戏逻辑可能有问题~另一个是c++不熟悉,工程项目稍微大一点的话怕内存泄露~cocos2d-x肯定是用来做手机游戏的~万一有泄露可能整个程序直接崩了~主要怕这个
‘伍’ cocos2dx怎么遍历资源文件夹里的文件
第一步在:在ZipFile添加方法,因为_dataThread是个私有的,尽量不改变源码的情况下,添加一个get方法是最好的
这个getAllFile可以返回所有的文件目录
std::vector<std::string>ZipFile::getAllFile(){
std::vector<std::string> vec;
ZipFilePrivate::FileListContainer::iterator it1;
for(it1=_dataThread->fileList.begin();it1!=_dataThread->fileList.end();++it1) {
vec.push_back(it1->first.c_str());
}
return vec;
}
第二步:使用getAllFile的返回值做遍历,这里直接帖出iOS和Android的同时遍历吧,同时搜索png和jpg的图片,可以用于加载资源,记得导入头文件
#include "support/zip_support/ZipUtils.h"
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#include <dirent.h>
#include <sys/stat.h>
#else
#include "platform/CCCommon.h"
#include "support/zip_support/unzip.h"
#include "jni/Java_org_cocos2dx_lib_Cocos2dxHelper.h"
#endif
void ResourceLoadingLayer::getAllFile(std::string folderPath,int depth, std::vector<std::string> *list, std::string head){
#if CC_PLATFORM_IOS == CC_TARGET_PLATFORM
DIR *dp;
structdirent *entry;
structstat statbuf;
if((dp =opendir(folderPath.c_str())) ==NULL) {
fprintf(stderr,"cannot open directory: %s\n", folderPath.c_str());
return;
}
chdir(folderPath.c_str());
while((entry =readdir(dp)) != NULL) {
lstat(entry->d_name,&statbuf);
if(S_ISDIR(statbuf.st_mode)) {
if(strcmp(".",entry->d_name) == 0 ||
strcmp("..",entry->d_name) ==0)
continue;
getAllFile(entry->d_name,depth+4,list,head+entry->d_name);
} else {
if (head.length() ==0) {
string name = entry->d_name;
if (name.length()>3 && name.rfind(".") > 0 && (name.substr(name.rfind(".")+1,3) == "jpg" || name.substr(name.rfind(".")+1,3) == "png")) {
list->push_back(entry->d_name);
}
} else {
string filename = head+"/" +entry->d_name;
if (filename.length()>3 && filename.rfind(".") > 0 && (filename.substr(filename.rfind(".")+1,3) == "jpg" || filename.substr(filename.rfind(".")+1,3) == "png")) {
list->push_back(filename);
}
}
}
}
chdir("..");
closedir(dp);
#else
ZipFile* pFile = new ZipFile(getApkPath(),"assets/");
vector<string> vec = pFile->getAllFile();
for (int i=0; i<vec.size(); i++) {
string file = vec.at(i);
if (file.compare("assets/")) {
file = file.substr(7,file.length());
}
if(file.substr(0,folderPath.length()) == folderPath ){
string filename = file.substr(file.rfind("/")+1,file.length());
if (filename.length()>3 && filename.rfind(".") >0 && (filename.substr(filename.rfind(".")+1,3) =="jpg" || filename.substr(filename.rfind(".")+1,3) =="png") {
list->push_back(filename);
}
}
}
#endif
}
第三步,使用:
首先得拿到资源文件夹的完整路径,方法有很多,只举其一:
在HelloWorld的工程下的资源根目录有一张HelloWorld.png图片,我们可以直接获取它在程序中的完整路径,即
string fullpath = CCFileUtils::sharedFileUtils()->fullPathForFilename("HelloWorld.png");
所以 string resPath = fullpath.substr(0,fullpath.rfind("/")+1);
得到了完整的资源路径后,
vector<string> vec;
getAllFile(resPath, 0, &vec, "");
这样就大功告成了,vec会保存所有的png或jpg的资源,会带head名的哦,比如说bg/welcome.jpg
上面是遍历所有的文件夹,如果单独遍历资源文件下的某个目录,即是
getAllFile(resPath+"xxx",0,&vec,""); xxx 为资源根目录下的子目录,这样就可以分别加载某个目录了
‘陆’ Cocos2dx适不适合开发安卓单机游戏
cocos2dx适合2D或者伪3D的手机游戏。一般来说小型和中型项目都可以用。所以你说的如果是2D游戏,就可以使用。但是cocos2dx是用C++或者lua,js等编写完毕和java混编以后成为安卓游戏。理论上cocos2dx可以跨所有平台。就是说IOS,ANDROID,WP的游戏都可以使用。
‘柒’ cocos2dx android切换后台为什么要重建纹理
android系统下,切入后台,则纹理全部失效,从后台切到前台,cocos2d-x会重新加载纹理。这样有两个问题:
1、如果纹理较多的话,加载纹理会卡很长时间,就像死机一样。 变通解决方法是修改引擎代码,增加一个进度条提示。
2、文字描边等用到RenderTexture的地方会出现异常纹理,文字会花掉。 暂时不知道原因,无解。
这里提供一个解决方案,解决掉纹理失效的问题,初步测试没有发现大的问题,但是具体还要看实际运行情况,毕竟android机器太多了。
1、Cocos2dXGLSurfaceView.java代码修改
[cpp]view plain- @Override
- publicvoidonPause(){
- this.queueEvent(newRunnable(){
- @Override
- publicvoidrun(){
- Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleOnPause();
- }
- });
- //super.onPause();
- }
2、main.cpp中修改
[cpp]view plain- voidJava_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv*env,jobjectthiz,jintw,jinth)
- {
- InitCrashReport();
- if(!CCDirector::sharedDirector()->getOpenGLView())
- {
- CCEGLView*view=CCEGLView::sharedOpenGLView();
- view->setFrameSize(w,h);
- AppDelegate*pAppDelegate=newAppDelegate();
- CCApplication::sharedApplication()->run();
- }
- //else
- //{
- //ccDrawInit();
- //ccGLInvalidateStateCache();
- //CCShaderCache::sharedShaderCache()->reloadDefaultShaders();
- //CCTextureCache::reloadAllTextures();
- //CCNotificationCenter::sharedNotificationCenter()->postNotification(EVNET_COME_TO_FOREGROUND,NULL);
- //CCDirector::sharedDirector()->setGLDefaultValues();
- //}
- }
‘捌’ 游戏制作是学c语言,还是java,还是Cocos2d-x
首先你要知道你想做什么游戏。
1、PC游戏:PC端游戏就比较随意了,各种语言都可以,C/C++、Java、C#,还有Mac平台的话需要Swift、Object-C。不过除非你是开发非常小型的游戏(贪吃蛇、俄罗斯方块之类),否则你不可能直接使用这些语言完全自己开发出一个完整的游戏,你需要学习一个游戏引擎,比如你说的Cocos2dx或是Unity。借助游戏引擎你就可以开发中型、大型游戏了。
2、手机游戏:手机端限制就比较多了,安卓的话是Java优先、C/C++也行,苹果ios的话就是Swift、Object-C。不过与PC同理,你要开发游戏建议还是学游戏引擎Cocos2dx、Unity都可以开发手机游戏。
3、Web游戏:以往开发Web游戏都是清一色Flash,但是现在Flash已经不推荐使用了,所以开发Web游戏还是以HTML5+JavaScript为主。同样小型游戏可以直接去写JavaScript,稍大的游戏还是要游戏引擎,Cocos2djs和Unity也都可以发布Web版本。
总之,开发语言是基础,要真打算开发游戏,还是要有游戏引擎。
‘玖’ 如何在eclipse下调试cocos2dx
cocos2dx程序移植到eclipse
必要组件:
1.macos gcc编译器,若没有,在xcode->preference->downloads中下载command line tools(在命令行下输入g++,若显示command not found 则没有)
2. android sdk :本机目录为 /Users/zhangyao/IDE/android-sdk-macosx
3.cocos2d-x:本机目录为 /Users/zhangyao/Desktop/cocos2d-x-2.1.1
4.ndk 本机目录为 /Users/zhangyao/Desktop/android-ndk-re8
地址:http://developer.android.com/tools/sdk/ndk/index.html
选择macos 64bit
5.cdt 若没有 则在help->install new software中下载
Programming Languages->C/C++ Development Tools.
1.配置环境变量
终端中 输入 sudo vi ~/.bash_profile
输入i进入编辑环境 输入以下内容:
export COCOS2DX_ROOT=~/Desktop/cocos2d-x-2.1.1/
export NDK_ROOT=~/Desktop/android-ndk-r8e/
export ANDROID_SDK_ROOT=~/IDE/android-sdk-macosx/
export PATH=$PATH:$ANDROID_SDK_ROOT/tools
按下esc键退出编辑
输入:wq保存退出
2.在eclipse中创建项目(设项目名称为test)
cd Desktop/cocos2d-x-2.1.1
./create-android-project.sh
输入工程标志符com.cwa.test
选择android版本号:6
输入工程名:test
cd test/proj.android/
./build_native.sh
打开eclipse,选择file->new->other->Android->Android Project from Existing code->next->Browse->选择目录至cocos2d-x-2.1.4/test/project.android->finish
选择file->new->other->c/c++->convert to a c/c++ Project->next->选择上面建好的工程->finish
至此工程test创建完成
3.配置工程属性
右键工程名->properties
3.1 c/c++ Build 把use default build command的勾去掉,在build command中写(其中test为工程名):
bash ${workspace_loc:/test}/build_native.sh NDK_DEBUG=1 V=1
3.2 点开c/c++ Build 选择Environment->add
name:NDK_ROOT
value:/Users/zhangyao/Desktop/android-ndk-r8e
3.3 c/c++ General->Path and Symbols->add
/Users/zhangyao/Desktop/android-ndk-r8e/sources/cxx-stl/system/include
全部修改完,点OK
在GUN C++中加入
/Users/zhangyao/Desktop/cocos2d-x-2.1.1/cocos2dx/include
/Users/zhangyao/Desktop/android-ndk-r8e/platforms/android-14/arch-arm/usr/include
在Android中 最好选择最新的Android4.2.2(确保Andorid模拟机中已经下载好了4.2.2的API)
4.打开项目的AndroidMainfest.xml
把android:icon="@drawable/icon">一行改为android:icon="@drawable/ic_launcher">
android:minSdkVersion="8"
把8改成14
android:minSdkVersion="14"
关闭AndroidMainfest.xml save changes选yes
在src/org.cocos2dx.lib/Cocos2dxActivity.java中
在// ...add to FrameLayout
framelayout.addView(this.mGLSurfaceView);
这句后面加上一句(如果没有):
this.mGLSurfaceView.setEGLConfigChooser(8 , 8, 8, 8, 16, 0);
打开工程jni目录下的Android.mk
MY_CPP_PATH := $(LOCAL_PATH)/ \
$(LOCAL_PATH)/../../Classes/
MY_FILES_SUFFIX := %.cpp
My_All_Files := $(foreach src_path,$(MY_CPP_PATH),$(shell find $(src_path)/.))
My_All_Files := $(My_All_Files:$(MY_CPP_PATH)/./%=$(MY_CPP_PATH)%)
MY_CPP_LIST := $(filter $(MY_FILES_SUFFIX),$(My_All_Files))
MY_CPP_LIST := $(MY_CPP_LIST:$(LOCAL_PATH)/%=%)
LOCAL_SRC_FILES := $(MY_CPP_LIST)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
LOCAL_C_INCLUDES += $(shell ls -FR $(LOCAL_C_INCLUDES) | grep $(LOCAL_PATH)/$)
LOCAL_C_INCLUDES := $(LOCAL_C_INCLUDES:$(LOCAL_PATH)/%:=$(LOCAL_PATH)/%)
把cocos2d-x引擎的根目录的cocos2dx/platform/android/java/src文件夹下org文件夹 复制到项目的src包(test/proj.android/src)下替换org文件夹
5.把xcode中所有的自建的类文件(包括.h和.cpp)复制到cocos2d-x-2.1.1/test/Classes
所有的资源文件复制到cocos2d-x-2.1.1/test/Resources
工程的图标文件放在cocos2d-x-2.1.1/test/res下的文件夹中
至此工程配置完毕。
在对工程作出修改,比如加入/替换新的资源文件,class后,最好对工程clean一下,如果clean后还出现问题,可以重新执行一下build_native命令。
Test 的 模拟器配置
最后,执行以下步骤可以把xcode和eclipse相关联,让在xcode中做的更改,eclipse可以自动做出更改。
1.打开Xcode中的test项目(项目名和eclipse中的相同)
选择classes分组,点删除,选择Move to Trash
2.在工程中添加新group,还命名为classes,右键classes->addFIles
然后把cocos2dx/test/classes中的类都添加回来,这样eclipse和xcode就公用了这些文件,在一个中做出更改,另一个里就会自动更改,如下图:
另:1. Android联网
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2.android中的R文件 ,是伴随着加入资源等自动更新的
Android 在开发中会自动生成一个 R.java 文件 ,这个文件是自动生成的,最好不要去改。不过有时候这个 java 文件会跟我们捉迷藏,在程序中 R.xx.xxx 会出现经常报错现象。
1 对着工程点击鼠标右键 选择 Build Project,R.java 文件又回来。这样R.xx.xxx 就能 X 的出来了。
如果不行 试用第二种 方法
2 选择eclipse/myeclipse 的 clean 这样R文件也会出现
如果还不行 试用第三种
3 经过上面两种方法都不行 使用绝招 从别的工程中拷贝一份R文件过来 然后string.xml里随便改动一下 即可更新R文件
如果还不行 试用第四种
4 经过上面的3种方法都不行 说明我们的工程有问题 好好检查吧
比如resoure资源中的文件 命名,例result_main.xml,如果写成Result_main.xml是错误的 需要全部小写