Cocos2d-x 3.2 学习笔记(十五)保卫萝卜 场景与数据
2015-01-16 16:59
459 查看
保卫萝卜~场景的思路以及数据的存储。
学习要写笔记,记录自己的步骤。
[b]一、场景构建Tiled[/b]
关于Tiled网上有一大堆的教程,这个比较好用,特别是构建塔防类的游戏极其简单,我也是爽了一把。
场景的资源目录结构比较好做,根据场景id进行区分目录。
场景对应目录:
DBUtil.cpp
这样在数据初始化的时候就可以直接传入表中怪物ID 直接初始化数据
[b]四、总结[/b]
有场景编辑器,有数据库,我觉得我终于可以完成我想要的效果了~~开心一把。哈哈哈,不过自己空闲时间也不多啊 惆怅……。
好想做*******,可惜C++懂得不多……
学习要写笔记,记录自己的步骤。
[b]一、场景构建Tiled[/b]
关于Tiled网上有一大堆的教程,这个比较好用,特别是构建塔防类的游戏极其简单,我也是爽了一把。
场景的资源目录结构比较好做,根据场景id进行区分目录。
场景对应目录:
#include "DBUtil.h" sqlite3 *pDB = NULL;//数据库指针 char * errMsg = NULL;//错误信息 std::string sqlstr;//SQL指令 int result;//sqlite3_exec返回值 unsigned int _count=0; std::map<unsigned int,std::function<void(std::map<string,string>)>> _keyMap; void DBUtil::initDB(const char *db) { //打开一个数据库,如果该数据库不存在,则创建一个数据库文件 result = sqlite3_open(db, &pDB); if( result != SQLITE_OK ) log( "打开数据库失败,错误码:%d ,错误原因:%s\n" , result, errMsg ); } //tableIsExist的回调函数 int isExisted( void * para, int n_column, char ** column_value, char ** column_name ) { bool *isExisted_=(bool*)para; *isExisted_=(**column_value)!='0'; return 0; } bool DBUtil::tableIsExist( string table_name ) { if (pDB!=NULL) { //判断表是否存在 bool tableIsExisted; sqlstr = "select count(type) from sqlite_master where type='table' and name ='"+table_name+"'"; result =sqlite3_exec(pDB,sqlstr.c_str(),isExisted,&tableIsExisted,&errMsg); return tableIsExisted; } return false; } void DBUtil::createTable( string sql,string table_name ) { if (!tableIsExist(table_name)) { //创建表,设置ID为主键,且自动增加 result = sqlite3_exec(pDB,sql.c_str(),NULL,NULL,&errMsg); if( result != SQLITE_OK ) log( "创建表失败,错误码:%d ,错误原因:%s\n" , result, errMsg ); } } void DBUtil::deleteTable( string sql,string table_name ) { if (tableIsExist(table_name)) { result = sqlite3_exec(pDB,sql.c_str(),NULL,NULL,&errMsg); if( result != SQLITE_OK ) log( "创建表失败,错误码:%d ,错误原因:%s\n" , result, errMsg ); } } //@示例语句sqlstr=" insert into MyTable_1( name ) values ( 'data',..... ) "; void DBUtil::insertData( string sql ){ result = sqlite3_exec( pDB, sql.c_str() , NULL, NULL, &errMsg ); if(result != SQLITE_OK ) log( "插入记录失败,错误码:%d ,错误原因:%s\n" , result, errMsg ); } //@示例语句sqlstr="delete from MyTable_1 where ID = 2"; void DBUtil::deleteData( string sql ) { result=sqlite3_exec( pDB, sql.c_str() , NULL, NULL, &errMsg ); if(result != SQLITE_OK ) log( "插入记录失败,错误码:%d ,错误原因:%s\n" , result, errMsg ); } //@示例语句 sqlstr="update MyTable_1 set name='data' where ID = 3"; void DBUtil::updateData( string sql ) { result = sqlite3_exec( pDB, sql.c_str() , NULL, NULL, &errMsg ); if(result != SQLITE_OK ) log( "插入记录失败,错误码:%d ,错误原因:%s\n" , result, errMsg ); } //getDataCount的回调函数 int loadRecordCount( void *para, int n_column, char ** column_value, char ** column_name ) { std::map<string,string> data; int index; for( index = 0 ; index < n_column; index ++ ) { data.insert(std::pair<string,string>( column_name[index], column_value[index] )); } auto num = *(unsigned int *)para; auto callback = _keyMap.at(num); if( callback != nullptr ) { callback(data); } return 0; } int DBUtil::getAllData(string table_name,std::function<void(std::map<string,string>)> callback) { string sql = "select * from "+table_name; _count++; _keyMap.insert(std::pair<unsigned int,std::function<void(std::map<string,string>)>>(_count,callback)); int count=sqlite3_exec( pDB, sql.c_str() , loadRecordCount, &_count, &errMsg ); return count; } //getDataInfo的回调函数 int loadRecord( void * para, int n_column, char ** column_value, char ** column_name ) { std::map<string,string> data; int index; for( index = 0 ; index < n_column; index ++ ) { string str1 = column_name[index]; if( column_value[index] == NULL ) { log("DBUtil Get Data Value Failure! Table Name Is '%s'",str1.c_str()); continue; } string str2 = column_value[index]; data.insert(std::pair<string,string>(str1,str2)); } auto num = *(unsigned int *)para; auto callback = _keyMap.at(num); if( callback != nullptr ) { _keyMap.erase(num); callback(data); } return 0; } void DBUtil::getDataInfo( string sql,std::function<void(std::map<string,string>)> callback ) { _count++; _keyMap.insert(std::pair<unsigned int,std::function<void(std::map<string,string>)>>(_count,callback)); sqlite3_exec( pDB, sql.c_str() , loadRecord, &_count, &errMsg ); } void DBUtil::closeDB() { sqlite3_close(pDB); }
DBUtil.cpp
这样在数据初始化的时候就可以直接传入表中怪物ID 直接初始化数据
[b]四、总结[/b]
有场景编辑器,有数据库,我觉得我终于可以完成我想要的效果了~~开心一把。哈哈哈,不过自己空闲时间也不多啊 惆怅……。
好想做*******,可惜C++懂得不多……
相关文章推荐
- Cocos2d-x 3.2 学习笔记(十三)CocoStudio UI编辑器 by 保卫萝卜
- Cocos2d-x 3.2 学习笔记(十六)保卫萝卜 游戏主循环与定时器
- Cocos2d-x 3.2 学习笔记(十四)保卫萝卜之界面UI
- cocos2d-html5学习笔记(五)--菜单和场景转换
- cocos2d-x 2.0.4 学习笔记(一)场景、层、精灵
- 【Cocos2d-X开发学习笔记】第29期:游戏中数据的存储(上)
- 【Cocos2d-X开发学习笔记】第04期:渲染框架之场景类(CCScene)的使用
- cocos2d-html5学习笔记(五)--菜单和场景转换
- cocos2d-x学习笔记(5)-- CCScene场景的切换
- IOS cocos2d学习笔记-<七>CCTransitionScene场景切换动画
- 【Cocos2d-X开发学习笔记】第29期:游戏中数据的存储(上)
- Cocos2d-x学习笔记(六)之 场景类CCScene
- 【Cocos2d-x 3.0学习笔记】场景切换
- 学习笔记之cocos2d-x2.1.1实现修改plist文件数据,用TinyXml解析XML
- 【Cocos2d-X开发学习笔记】第30期:游戏中数据的存储(下)
- 【吼吼睡cocos2d学习笔记】第五章 - loading场景以及其他
- cocos2d-x学习笔记04:CCScene场景切换
- cocos2d-x学习笔记(二)--场景切换
- cocos2d-x 菜鸟学习笔记四(游戏场景与场景切换)
- Cocos2d-x学习笔记一 创建场景