最进对android上的游戏有了点兴趣。于是非常热情的自学了一个多月。
先是学了AndEngine. 这是一款2D的游戏引擎.引擎很犀利,是通过标准的JAVA框架思想设计的. 不过AndEngine只能在Android OS上运行. 个人觉得,只会一种平台开发,前景不是很好.于是呼~ 又花了一个星期学习cocos2d-x引擎. cocos2d-x的效率很好,毕竟人家是用C++开发的游戏引擎.并且,cocos2d-x支持多种平台,从上面的宏定义就可以看出.基本的支持支持WIN32 , ANDROID, IOS 等等.用途是很广泛的. 不过cocos2d-x 是用C++写的.对宏和对象的运用很犀利.
下面, 主要讲一下我自学cocos2d-x, 通过windows visual 2010 开发一个 cocos2d-x 版的 HelloWorld. 然后,通过使用eclipse 工具 加NDK插件,开发一个Android上的游戏的过程.
首先, 下载几个必须的工具:
1、windows visual 2010
2、eclipse indigo
3、android-ndk-r7c-windows
4、cocos2d-1.0.1-x-0.13.0-beta
具体思路是:
在Windows visual 2010 上编写游戏,并测试
在Eclipse indigo上通过NDK编译,最后安装到Android OS中
具体步骤是:
首先安装 visual 2010 ,并运行一个例子:
然后打开cocos2d-1.0.1-x-0.13.0-beta包, 里面有一个cocos2d-win32.vc2010.sln , 双击运行.
同时,你也可以通过手动点击cocos2d-x目录下的 template\msvc\InstallWizardForVS2010.js 文件安装cocos2d-x模板
经过以上步骤,如果没有错误,你就可以看到你的visual 2010中有一个cocos2d-win32.vc2010 解决方案了 如图1:
同时你也可以新建一个项目,并且可以看到如下情形:
此时,你已经可以运行一个cocos2d-x的win32版本的test了.
也许你可以自己写一个HelloWorld试跑一下.此处不在冗余.
假定你已经写了一个HelloWorld.像我一样.
通过生成 -> 调式 -> 生成新的实例 得到一下结果:
接下来,我们进行Android上的移植: (我做的是最简单的, 有什么错误,还望大家指出来)
打开Eclipse indigo : 新建一个Android工程. 命名为 MyCocos2DHelloWorld: Android API LEVEL 7,
包名: org.hello.activity, 这样就得到了一个Android下的项目.
接下来的动作很简单,由于目前没用到什么复杂的功能:
1、 将cocos2d目录下的tests\test.android\src 中的类,连同包名一起拷贝到MyCocos2DHelloWorld 项目中,
2、 将cocos2d目录下的tests\test.android\res\layout 中的布局内容考到MyCocos2DHelloWorld项目里的布局上:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<org.cocos2dx.lib.Cocos2dxEditText
android:id="@+id/textField"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:background="@null"/>
<org.cocos2dx.lib.Cocos2dxGLSurfaceView
android:id="@+id/test_demo_gl_surfaceview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</FrameLayout>
将原来的覆盖掉.
在 AndroidManifest.xml 配置文件中添加一条Permission :
<uses-permission android:name="android.permission.INTERNET" />
布局的相关信息需要上网.
修改一些小错误.完了以后.
将工程里的 org.cocos2dx.tests.TestsDemo 对象中的方法全部复制粘贴到自己的MyCocos2DHelloWorldActivity中:
MyCocos2DHelloWorldActivity 继承 Cocos2dxActivity;
连同包删掉org.cocos2dx.tests.TestsDemo;
这样JAVA层基本搞定了.
接下来,新建一个JNI文件夹,JNI里面,ndk-build工具通过查找 Android.mk文件编译相关的CPP文件
这里需要JNI的相关知识;如果JAVA要调用一个C++/C方法,就应该在项目的根目录下,建立一个文件夹名字叫jni
如图
在jni文件夹里面,新建两个文件,一个是:main.cpp , 另外一个是: Android.mk
main.cpp 中的内容是:
#include "Classes/AppDelegate.h" //visual 2010 中的HELLOWORLD的AppDelegate.h文件
#include "cocos2d.h"
#include "platform/android/jni/JniHelper.h"
#include <jni.h>
#include <android/log.h>
#define LOG_TAG "main"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
using namespace cocos2d;
extern "C"
{
jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
JniHelper::setJavaVM(vm);
return JNI_VERSION_1_4;
}
void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env, jobject thiz, jint w, jint h)
{
if (!cocos2d::CCDirector::sharedDirector()->getOpenGLView())
{
cocos2d::CCEGLView *view = &cocos2d::CCEGLView::sharedOpenGLView();
view->setFrameWidthAndHeight(w, h);
// if you want to run in WVGA with HVGA resource, set it
// view->create(480, 320);
cocos2d::CCDirector::sharedDirector()->setOpenGLView(view);
AppDelegate *pAppDelegate = new AppDelegate();
cocos2d::CCApplication::sharedApplication().run();
}
else
{
cocos2d::CCTextureCache::reloadAllTextures();
cocos2d::CCDirector::sharedDirector()->setGLDefaultValues();
}
}
}
Android.mk 中的内容是: 里面就不注释了,注释有时会有问题,我在前面将几个要紧的先讲清楚吧:
LOCAL_WHOLE_STATIC_LIBRARIES := cocos_hello_tests 中 cocos_hello_tests 是我自己的visual 2010 HelloWorld项目下根目录中 的Android.mk文件中定义的模块名,也就是说,你的 visual 2010中的 HelloWorld项目需要新建一个Android.mk文件,内容通过ndk docs文档编写.其模块名必须是cocos_hello_tests.
$(call import-module,HelloWorld) 中 HelloWorld 是我的visual 2010 项目名,也是我的文件夹的名字
其他的关键字,请查阅NDK中文件夹android-ndk-r7c\docs\下的文件 ANDROID-MK.html等.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := cocos_hello_android
LOCAL_MODULE_FILENAME := libhello
LOCAL_SRC_FILES := main.cpp
LOCAL_STATIC_LIBRARIES := curl_static_prebuilt
LOCAL_WHOLE_STATIC_LIBRARIES := cocos_hello_tests
LOCAL_WHOLE_STATIC_LIBRARIES += cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static
LOCAL_WHOLE_STATIC_LIBRARIES += chipmunk_static
include $(BUILD_SHARED_LIBRARY)
$(call import-module,HelloWorld)
$(call import-module,cocos2dx)
$(call import-module,cocos2dx/platform/third_party/android/prebuilt/libcurl)
$(call import-module,CocosDenshion/android)
$(call import-module,Box2D)
$(call import-module,chipmunk)
这样以后,我们把visual 2010中的 Resources文件夹下的文件全部拷贝到MyCocos2DHelloWorld项目中的Assets文件夹中.有了这些,我们的工程已经完整了.
然后,右键点击工程. 选择Properties 找到Builders 那个选项
新建一个Program 如图:
Main选项卡中,Location :中填写你的NDK 目录下的 ndk-build.cmd文件
Working Directory:中选择当前要编译的项目.
Refresh选项卡中如图填写: 选择第5个Specific resources指定要编译哪个文件夹,就是我们的JNI文件夹咯.
再点击 Specify Resources ,选择JNI文件夹,点击Finish
选择 Environment 中的 新建: 添加一个变量 NDK_MODULE_PATH : 值为 自己安装的COCOS2D根目录.
BUild Options 选项卡中: 按如图方式填写,该操作指定编译条件,同时指定编译的文件.
到此,步骤基本完成.还有什么遗漏的,还望各位指明.