保卫萝卜~场景的思路以及数据的存储。

学习要写笔记,记录自己的步骤。
一、场景构建Tiled
关于Tiled网上有一大堆的教程,这个比较好用,特别是构建塔防类的游戏极其简单,我也是爽了一把。
场景的资源目录结构比较好做,根据场景id进行区分目录。
场景对应目录:
然后使用Tiled构建基本的场景
这里有
1、两个图块层(底图层、路径层)       2、三个对象层(可行路径对象格、障碍对象格、建筑对象格)
格子使用80X80,跟资源的大小刚好合适……导出.tmx文件,加入舞台就能看到成果了,顿时觉得比较爽。
Cocos2dx已经封装的 TMXTiledMap类使用起来也是顺手至极啊。
TMXTiledMap::create(tmxUrl)
创建一个TMXTiledMap对象直接addChild至场景就可以看到效果,如果要获得对象层的数据,通过name就能获得。通过处理对象层的数据(坐标,宽高,类型、等属性)就可以搞定场景建筑搭建,怪物行走路径,鼠标可点击区域等,通过格子矩形的判断就能实现场景逻辑部分。
对Tiled的了解不是很多,但是够用就行……
二、数据管理SQLite
数据大概是游戏的命脉啊,可惜自己的数值功力有限,只能设计个自己能用的数据库了,借助于SQLite实现对数据的管理。
SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。
下载sqlite文件
下载网址: http://www.sqlite.org/download.html。
这是最新版本。如下图把解压后的三个文件导入项目中就可以开心的使用了。
ok,关于创建SQLite数据库的工具也有一大堆,不过我还是喜欢使用   Navicat_Premium_9.1.11 用的爽就行~
OK,这样创建好数据库DB文件就好啦,下面使用辅助类就可以完美的 增、删、查、改!
三、自封装DB数据类
关于封装SQLite的类也是有很多的,但是适用自己的才是最好的,封装起来也是比较简单的,不过鉴于自己的c++水平有限……(拿来主义)……在以前在网上找了个工具类,
后来自己也修改了下,改成自己适用的,贡献下自己修改后的DBUtil类。

#ifndef __DBUtil__
#define __DBUtil__
#include <string>
#include "cocos2d.h"
#include "sqlite3.h"using namespace std;
USING_NS_CC;
class DBUtil{
public:/************************************************************封装 sqlite3操作************************************************************///用来创建一个db数据库 db为数据库的名字//  打开数据库static void initDB(const char *url);//用来判断表格是否存在// name:表示表名static bool tableIsExist(string table_name);//用来创建一个表名为name的表格,创建时会先匹配时否有该表的存在如果存在则不创建//创建表static void createTable(string sql,string table_name);//用来删除一张表名为name的表格,删除时会先匹配是否有该表的存在如果不存在则不执行删除操作//删除表名static void deleteTable(string sql,string table_name);//用来向表中插入一条数据//插入一条数据static void insertData(string sql);//用来向表中删除一条数据//删除一条数据static void deleteData(string sql);//用来向表中修改一条数据// 修改一条数据static void updateData(string sql);//获取表的全部数据// 返回记录的条数static int getAllData(string table_name,std::function<void(std::map<string,string>)> callback);//读取一条记录的信息/**  此方法是查询方法,pSender()*/static void getDataInfo(string sql,std::function<void(std::map<string,string>)> callback);//关闭打开的数据库static void closeDB();
};#endif

DBUtil.h

#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 直接初始化数据
四、总结
有场景编辑器,有数据库,我觉得我终于可以完成我想要的效果了~~开心一把。哈哈哈,不过自己空闲时间也不多啊 惆怅……。
好想做*******,可惜C++懂得不多……

转载于:https://www.cnblogs.com/Richard-Core/p/4229224.html

Cocos2d-x 3.2 学习笔记(十五)保卫萝卜 场景与数据相关推荐

  1. python复制指定字符串_python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)...

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  2. windows内核开发学习笔记十五:IRP结构

    windows内核开发学习笔记十五:IRP结构   IRP(I/O Request Package)在windows内核中,有一种系统组件--IRP,即输入输出请求包.当上层应用程序需要访问底层输入输 ...

  3. Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件

    Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件 用Polyworks脚本开发,没有高级语言的支持,功能难免单一,一些比较复杂的交互实现不了,界面和报告也很 ...

  4. IOS之学习笔记十五(协议和委托的使用)

    1.协议和委托的使用 1).协议可以看下我的这篇博客 IOS之学习笔记十四(协议的定义和实现) https://blog.csdn.net/u011068702/article/details/809 ...

  5. Mr.J-- jQuery学习笔记(十五)--实现页面的对联广告

    请看之前的:Mr.J-- jQuery学习笔记(十四)--动画显示隐藏 话不多说,直接上demo <!DOCTYPE html> <html lang="en"& ...

  6. 世界是有生命的(通向财富自由之路学习笔记十五)

    最近因为工作调度的事情,有了一段空闲的日子,有比较多的时间来回望自己走过的路以及如何走好以后的路.之前忙得很少时间来写博文,很少时间来写读书笔记,逐渐将自己一些很好的习惯丢弃了.从今天起将重拾写博文的 ...

  7. 前端学习笔记(十五)

    第十五章 HTML5新增标签 一.HTML5概述 1.简介         HTML5万维网的核心语言.标准通用标记语言下的一个应用超文本标记语言的第五次大修改.HTML5将成为 HTML.XHTML ...

  8. 【theano-windows】学习笔记十五——受限玻尔兹曼机

    前言 终于到了最喜欢的模型: 受限玻尔兹曼机(RBM)了, 发现关于RBM是如何从能量模型发展过来的介绍非常不错, 而关于详细理论证明, 可以去看我前面的受限玻尔兹曼机的一系列博客. 国际惯例, 参考 ...

  9. hough变换直线检测_CV学习笔记(十五):直线检测

    在这一篇文章中我们将学习使用OpenCV中的 HoughLines 函数和 HoughLinesP 函数来检测图像中的直线. 在这个函数中,使用的是霍夫变换(Hough Transform) 这是计算 ...

  10. javascript学习笔记(十五) 间歇调用和超时调用

    1.超时调用setTimeout() setTimeout() 方法接受两个参数,第一个参数是函数,第二个参数是时间(单位微秒),返回数值ID 1 setTimeout( function () { ...

最新文章

  1. 工作上996,生活上669,并不是什么难事儿!
  2. C++Primer Plus (第六版)阅读笔记 + 源码分析【第一章:预备知识】
  3. Windows 路由追踪tracert命令使用示例
  4. cython linux so,更改Cython的.so文件命名规则
  5. switch 根据键盘录入成绩 显示分数及判断等级(第二次)
  6. [Jarvis OJ - PWN]——Test Your Memory
  7. T级图片数据Cache思路以及图片服务器搭建方法
  8. joi模块验证日期格式_python datetime模块详解
  9. webapi随机调用_BeetleX之webapi验证插件JWT集成
  10. GitHub | 周志华《机器学习》手推笔记正式开源!可打印版本附pdf下载链接
  11. 将10个成绩排序java程序_快速排序——成绩排序
  12. h5故障代码_H5故障与内机有关?
  13. 一款ModbusRTU/TCP485串口协议调试软件工具绿色版免安装
  14. vuecli2+axios 设置多个域名代理
  15. linux nfs acl 特定ip,Linux NFS配置
  16. Ubuntu 18.04 LTS 桌面版 WPS 安装字体
  17. 微信也能鉴别山寨iPhone【微信高级教程2】
  18. 容斥定理与鸽巢定理(抽屉定理)
  19. bootstrap文字,图片
  20. Blogbus博客*

热门文章

  1. Linux 修改时区为中国上海时间
  2. C++获取当前系统时间
  3. 3---Linux内核及内核编程
  4. Twinmotion 贴花应用教程
  5. 亿方云企业网盘和坚果云企业网盘哪个好?
  6. 优质女性为什么没有男朋友
  7. %hh% 星期 怎么表示_网络星期一:优雅主题提供有史以来最大折扣的25%的折扣
  8. 开发手机rpg类型游戏用素材合集,人物行走图片
  9. ARMv7-A 处理器窥探(1) —— 处理器模式
  10. Qt 之 Eventloop 事件循环