本节暂定为我所认识的Cocos2d-x第一环节终章,以后我会直接用项目跟大家继续的探讨。
本节所讲的就是数据管理器和数据库的基础运用。
本篇所用的Cocos2d-x版本为:Cocos2d-x 3.2
编译器版本VS2013
CocosStudio 1.5
Cocos2d-x3.2教程——【我所认识的Cocos2d-x】
七、Cocos2d-x项目—数据管理器篇数据管理器,作为数据的持久化、存储、查找、更新、设置等数据的集中管理器,其实就是我们将数据全部统一放在一个地方,方便我们调用,我们先从数据库开始讲。
SQLite是适用非常广泛的嵌入式数据库,在中型或大型游戏中经常见到。
在cocos2d-x中,我们使用它的C语言绑定。为了方便和简化篇幅,我们直接使用它的源代码。我所用的数据库的下载地址:
http://www.sqlite.org/sqlite-amalgamation-3071000.zip
将其解压到我们项目classes目录下,里面有四个源文件。
shell.c
sqlite3.c
sqlite3.h
sqlite3ext.h
下面我就开始上代码了!做个简单的引导
首先我创建了一个数据库,大概内容是这样的
然后我定义了 公用结构体类Game_Struct.h将所有公用的结构体我全部放在这里,并方便调用
Game_Struct.h
#ifndef __GAME__STRUCT_H__
#define __GAME__STRUCT_H__
using namespace std;
#include
//游戏分区结构体;
struct GameRegion
{
string GR_S_ID; //选区ID;
string GR_S_Name; //分区名字;
string GR_S_Http; //选区地址;
string GR_S_State; //选区状态: 0未开 1正常 2停服 X其他;
string GR_S_Time; //开启时间;
string GR_S_DBName; //服务器名称;
string GR_S_TallServer; //聊天服务器;
int GR_B_IsOpen; //是否可以注册;
int GR_B_IsReto; //是否指定注册地址;
};
#endif //__GAME__STRUCT_H__
```
然后我们开始写数据库管理器,这里我只做一些初步的引导,如果想要详细的去了解,还是希望大家从基础的看起,因为我所理解的,不能代表你就理解了
GameSQLite.h
#ifndef __GAME_SQLITE_H__
#define __GAME_SQLITE_H__
#include "sqlite3.h"
#include "cocos2d.h"
#include "Game_Struct.h"
#include
USING_NS_CC;
using namespace std;
class GameSQLite
{
public:
//单例模式;
static GameSQLite* getInstance();
public:
//初始化;
bool initSQLite();
//获取服务器分区数据;
vector GetGameRegionDataList(string fKey);
};
#endif //__GAME_SQLITE_H__
```
GameSQLite.cpp
#include "GameSQLite.h"
static GameSQLite* m_pGameSQLite;
static sqlite3* m_pSqliteDB;
//单例;
GameSQLite* GameSQLite::getInstance()
{
if (m_pGameSQLite == nullptr)
{
m_pGameSQLite = new GameSQLite();
if (m_pGameSQLite->initSQLite()){
log("SQLite Data OK");
}else{
log("SQLite Data NO");
}
}
return m_pGameSQLite;
}
//初始化;
bool GameSQLite::initSQLite()
{
bool isOK = false;
char * errMsg = nullptr;//错误信息;
int result = -1;
string sqlstr = "";
string pathStr = FileUtils::getInstance()->fullPathForFilename("Test.db");
if("Test.db" != pathStr){
result = sqlite3_open(pathStr.c_str(), &m_pSqliteDB);
if (result == SQLITE_OK){
isOK = true;
}
}
return isOK;
}
//读取GameRegion表数据;
vector GameRegion_list;
int Read_database_FFFlower_load(void * para, int n_column, char ** column_value, char ** column_name)
{
GameRegion temp;
//选区ID;
temp.GR_S_ID = column_value == NULL ? "NULL" : column_value;
//分区名字;
temp.GR_S_Name = column_value == NULL ? "NULL" : column_value;
//选区地址;
temp.GR_S_Http = column_value == NULL ? "NULL" : column_value;
//选区状态: 0未开 1正常 2停服 X其他;
temp.GR_S_State = column_value == NULL ? "NULL" : column_value;
//开启时间;
temp.GR_S_Time = column_value == NULL ? "NULL" : column_value;
//服务器名称;
temp.GR_S_DBName = column_value == NULL ? "NULL" : column_value;
//聊天服务器;
temp.GR_S_TallServer = column_value == NULL ? "NULL" : column_value;
//是否可以注册;
temp.GR_B_IsOpen = atoi(column_value == NULL ? "NULL" : column_value);
//指定注册地址;
temp.GR_B_IsReto = atoi(column_value == NULL ? "NULL" : column_value);
GameRegion_list.push_back(temp);
return 0;
}
//获取服务器分区数据;
vector GameSQLite::GetGameRegionDataList(string fKey)
{
GameRegion_list.clear();
string sql = "select * from GameRegion";
if (fKey.size() != 0)
{
sql.append(" a where a.ID in (");
sql.append("'");
sql.append(fKey.c_str());
sql.append("'");
sql.append(")");
}
char * errMsg = NULL;
sqlite3_exec(m_pSqliteDB, sql.c_str(), Read_database_FFFlower_load, NULL, &errMsg);
log("Get GameRegion Data OK");
return GameRegion_list;
}
```
那么我们大概的讲解下,要想使用数据库,我们最少要知道基本的SQL语句,增、删、改、查! Insert、delete、select、update。基本语法我们可以去问度娘!
那么,我们数据库管理器搭建好了,现在要做什么呢?用编写数据管理器来调用,数据库管理器,进行一些数据的持久化和查找所用。
开始上代码
GameData.h
#ifndef __GAME_DATA_H__
#define __GAME_DATA_H__
#include "Game_Struct.h"
#include
using namespace std;
class GameData
{
public:
//单例模式;
static GameData* getInstance();
public:
//初始化;
void initData();
//读取数据;
void readData();
//获取服务器分区数据;
vector GetServer_GR_Data(string key);
public:
};
#endif //__GAME_DATA_H__
```
GameData.cpp
#include "GameData.h"
#include "PublicHeaderFiles.h"
static GameData* m_pGameData;
//单例;
GameData* GameData::getInstance()
{
if (m_pGameData == nullptr)
{
m_pGameData = new GameData();
m_pGameData->initData();
}
return m_pGameData;
}
//初始化;
void GameData::initData()
{
}
//读取数据;
void GameData::readData()
{
}
//获取服务器分区数据;
vector GameData::GetServer_GR_Data(string key)
{
return GameSQLite::getInstance()->GetGameRegionDataList(key);
}
```
OK 数据管理器也最做好了!
这只是一个基本的思想和概念,具体怎么使用,我希望同学们能进一步的去思考,去完善!
那么我们简单的在代码里调用下,可以在某个UI类里随便的调用下,我们看下log
好的,目前基本上教程就暂时到这里结束了,很抱歉,最后一章草草的结束了,因为我想真正给大家打来一个项目,而不是挤时间给大家草草的去写,所以,我们的教材就暂时结束,后期我会开始用实例教程给同学们一起学习进步!



这篇写的不好,最近工作心情不是很好,影响到教程了。。。。