Eclipse运行cocos2d-x-3终极方案

 - by Hector

news: 此模版已被官方合并~

cocos2d-x 3.x 之后的版本Android项目模板一直是错的,从最初刚出3.0 一直坑到现在的正式版发布,每次都要配置好长时间环境。 花了好长时间将项目模板配置正确了,分享给大家。

使用很简单,下载好模板之后,替换掉原来错的模板,就可以生成正确的项目。设置好Eclipse的NDK_ROOT变量后导入项目即可编译运行。

详细的说明和步骤在模板的README.md有说明。

另外模板正确以外,还有以下特点:

  1. 所有路径都是相对路径,无需改任何东西。
  2. libcocos2d作为link目录(直接用生成项目里面的cocos2d文件),不需要改任何东西。
  3. Android.mk改为自动搜索cpp文件,添加cpp无需改任何东西。
  4. Eclipse添加了宏支持,使得indexer正确识别,代码加亮,F3代码转跳没有任何问题。
  5. Eclipse去除了错误警告,随意跟踪cocos2d代码不会有错误提示。
  6. 没有项目依赖,可以多个环境共存。

后续将添加的东东:

  1. Ant 打包支持
  2. Android代码混淆配置
  3. NDK调试支持

模板下载地址:https://github.com/myourys/cocos2d-x-3-android-template

VituralBox安装cocostudio

 - by Hector

vituralbox在mac下的体验比vmware好很多,但是vituralbox里vituralbox可以正确使用可不容易。 cocostudio(目前为止v1.3)使用了opengl2,对显卡要求比较高。

1.下载完整的安装包,会自动安装依赖的库

2.vituralbox的开启硬件加速

Machine->setting ->Display 开启2D,3D加速

3.Vituralbox版本

不知哪次更新了Vituralbox的版本,然后不能用了,竟然不能用了!!!进入cocostudio显示不了图片了。。。。

好吧,虽然不清楚具体开始从哪个版本开始不能用了,似乎是4.3开始后吧。

我只要重装了老版本,4.1系列的版本应该都是可用的。

可能是跟我电脑的显卡有关,有可能在你电脑上最新的Vituralbox是可以用的也说不定。。。

让Cocos2d-x支持加密的sqlite

 - by Hector

前话

sqlite本身提供了加密的接口,但是免费版本中没有提供相应的实现,目前网上有一些相应的实现,但是大部分集成成本太高,
其他的比如利用ssl实现加密,需要集成ssl到项目中去;尝试自己实现,发现成本也很高,相关文档很少,而且大部分
是基于低版本的。直到发现wxsqlite3,一个近乎完美的sqlite加密方案。

wxsqlite3

wxSqlite3作为wxWidgets的扩展组件用C++语法对Sqlite3的API进行了封装,为Sqlite3的使用提供了方便,并顺带实现了加密。
wxWidgets是一个著名的C++跨平台UI框架。支持两种加密算法,128位的rijndael算法(默认)和256位的AES算法。
下载:http://sourceforge.net/projects/wxcode/files/Components/wxSQLite3/

Makefile版编译

其实wxsqlite3中已经说明了编译方法。我们只需要sqlite3/secure/src文件夹的内容,并且只需编译sqlite3secure.c文件(其他文件,sqlite3secure已经包含进去了,如果自己加会通不过编译),
其编译方法在最外层的README.txt说明了,这里我们写一个测试程序验证我们的加密方法,稍加修改就可作为项目的加密解密数据库工具。

1.启用宏
需要在sqlite3secure.c最上面添加宏,启用加密
#define SQLITE_HAS_CODEC
//启用256位加密,如果不启用,可不加
#define CODEC_TYPE CODEC_TYPE_AES256

在sqlite3.h或者main.c最上面添加
#define SQLITE_HAS_CODEC
启用头文件支持

2.makefile 文件make

CC=gcc
CFLAGS=-I.
DEPS = sqlite3.h
OBJ = main.o sqlite3secure.o 

%.o: %.c $(DEPS)
	$(CC) -c -o $@ $< $(CFLAGS)

main: $(OBJ)
	$(CC) -o $@ $^ $(CFLAGS)

clean:
	rm -f *.o

3.测试文件main.c

#include <stdio.h>
#include "sqlite3.h"
#include "string.h"

#define dbPassWord "I am is a Password"
#define dbFile "test.sqlite"

int main()
{
    sqlite3 *db;
    char pwd[100] = dbPassWord;

    if (sqlite3_open(dbFile , &db) == SQLITE_OK
            && (sqlite3_exec(db, "create table users(uid INTEGER,uname text)", NULL, NULL, NULL)==SQLITE_OK) )
    {
        printf("1.打开未加密数据库成功,正在加密……\n");
        sqlite3_rekey(db,pwd,strlen(pwd));
        sqlite3_close(db);
    }
    else{
        printf("打开未加密数据库失败\n");
        return 0;
    }

    if (sqlite3_open(dbFile , &db) == SQLITE_OK)
    {
        if(sqlite3_key(db,pwd,strlen(pwd)) == SQLITE_OK
            && (sqlite3_exec(db, "drop table users;", NULL, NULL, NULL)==SQLITE_OK) )
        {
            printf("2.验证加密,加密成功\n");
        }
        else{
            printf("加密失败\n");
        }
    }

    if(sqlite3_rekey(db,NULL,0) == SQLITE_OK)
    {
        printf("3.解密数据库成功……\n");
        sqlite3_close(db);
    }

    return 0;
}

Android启用

1.写个Android.mk文件,和上面的所有文件放在external/wxsqlite3目录下

LOCAL_PATH := $(call my-dir)

 include $(CLEAR_VARS)

 LOCAL_MODULE := wxsqlite3_static

 LOCAL_MODULE_FILENAME := libwxsqlite3

 #LOCAL_CFLAGS := \
 #-DSQLITE_HAS_CODEC \
 #-DCODEC_TYPE=CODEC_TYPE_AES128

 LOCAL_SRC_FILES := \
 sqlite3secure.c

 LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)

 LOCAL_C_INCLUDES := $(LOCAL_PATH)

 include $(BUILD_STATIC_LIBRARY)

2.在项目的Android.mk文件中添加支持
LOCAL_WHOLE_STATIC_LIBRARIES += wxsqlite3_static

$(call import-module,external/wxsqlite3)

iOS支持

添加代码目录,找到我们刚才添加的那个文件夹,添加好后,将除sqlite3.h和sqlite3secure.c的所有文件都删除引用。

让cocos2d-x 3.0 支持繁体中文

 - by Hector

cocos2d-x虽然不支持繁体中文,但只要简单的扩展,即可实现繁体中文的支持。

通过跟踪cocos2d的源代码,很容写出繁体中文的支持,但是我是不到万不得已不改引擎,以免后期引擎升级等太麻烦。

这里提供一个函数,判断系统是否为繁体中文。

iOS

//代码放在一个mm后缀的Object-c文件里
bool isTradictionalChinese()
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
    NSString *currentLanguage = [languages objectAtIndex:0];
    
    if ( [currentLanguage isEqualToString:@"zh-Hant"])
    {
        return  true;
    }
    else
    {
        return  false;
    }
}

Android已经提供了相应的JNI,调用即可

//包含头文件
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "jni/Java_org_cocos2dx_lib_Cocos2dxHelper.h"
#endif

函数如下:

auto isHkLang = []()->bool{
        #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
            string  tmp = getCurrentLanguageJNI();
            return tmp.compare("zh-Hant")==0;
        #elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
            return isTradictionalChinese();
        #endif
    };