关于游戏开发数据方面的ios 沙盒存储读取数据与读取

游戏开发中常用的数据结构_菜鸟_熊_新浪博客
游戏开发中常用的数据结构
我们知道,数据结构是编程中非常基础也非常重要的部分。在开发中选择合适的数据结构往往能使复杂的问题变得简单。
常见的数据结构包括:Array(数组)、ArrayList集合、List集合、LinkedList(链表),Queue(队列),Stack(栈),Hashtable(哈希表)、Dictionary(字典)
本文先介绍下​Array、ArrayList和List。
​Array
&& 数组就是具有相同类型的一组数据。有以下特点
①数组里的数据在内存中的内存地址是连续的;
②数组里所有数据的数据类型都是相同的;
③数组可以通过数组下标访问​;
创建数组:
privete string[]&
mNameArray​=new string[6];
​创建一个新的数组时将在CLR托管堆中分配一块连续的内存空间,这儿创建mNameArray​就会分配大小为6的内存空间,存储的数据必须为声明的string类型
&优点:&由于数组在内存上是连续的,所以它的索引速度非常快,访问某个元素的时间是&&
固定的,与数组的大小或者访问哪个元素无关,而且赋值和修改元素也很简单
缺点:①由于数组元素的内存地址是连续的,当往数组中间插入元素的时候就需要后面的元素全部往后移,当删除某个元素的时候也需要后面元素往前移,效率很低;
②数组长度是不可以修改的,声明数组过长浪费内存,声明数组过短则面临溢出
​ArrayList
ArrayList可以说很好的解决了数组的问题,ArrayList长度是可变的,而且增加删除元素非常方便(ArrayList类在System.Collections命名空间下,需要引用)
​private ArrayList &
mArrayList=new ArrayList();
​新增数据
mArrayList.Add("5");
mArrayList​.Add("你好");可见ArrayList​是可以添加所有类型的数据的
修改数据直接通过下标修改就可以
​mArrayList[0]="哈哈";
​删除数据
​mArrayList.Remove();//object类型参数,删除集合里该元素
mArrayList​.RemoveAt();//通过下标删除
​ArrayList​的缺点
①ArrayList​中插入不同类型的数据是允许的,ArrayList​把所有类型数据都当作Object类型来处理,当我们处理ArrayList​数据时,很可能会报类型不匹配的错误,即ArrayList​是类型不安全的
②​由于ArrayList​把数据都当作Object类型处理,当我们存储值类型时会产生装箱操作,检索值类型时会产生拆箱操作,装箱拆箱会带来很大的性能损耗
因为ArrayList的缺点引出了List类
List​​
List类是个泛型类,​List大部分用法跟ArrayList类似,区别就是List声明后只能往里存储特定的数据类型。如List类型就只能往里装int类型的数据
private List​ mNameL
​mNameList.Add("张三");
mNameList​.Add("李四");
mNameList​[0]="王五";
mNameList​.Remove();&&mNameList.RemoveAt();
List的优点:​
①确保了类型安全。
②取消了装箱和拆箱的操作。
③它融合了Array可以快速访问的优点以及ArrayList长度可以灵活变化的优点。
通常List比ArrayList更常用,下面总结下这三种数据结构的区别
​总结:
数组的容量是固定的,您只能一次获取或设置一个元素的值,而ArrayList或List的容量可根据需要自动扩充、修改、删除或插入数据。
数组可以具有多个维度,而 ArrayList或 List& T&
始终只具有一个维度。但是,您可以轻松创建数组列表或列表的列表。特定类型(Object 除外)的数组 的性能优于
ArrayList的性能。 这是因为 ArrayList的元素属于 Object
类型;所以在存储或检索值类型时通常发生装箱和取消装箱操作。不过,在不需要重新分配时(即最初的容量十分接近列表的最大容量),List&
T& 的性能与同类型的数组十分相近。
&&& 在决定使用
List 还是使用ArrayList 类(两者具有类似的功能)时,记住List
类在大多数情况下执行得更好并且是类型安全的。如果对List& T&
类的类型T 使用引用类型,则两个类的行为是完全相同的。但是,如果对类型T使用值类型,则需要考虑实现和装箱问题。
博客等级:
博客积分:0
博客访问:1,335
关注人气:0
荣誉徽章:[Unity3D]手机3D游戏开发:场景切换与数据存储(PlayerPrefs 类的介绍与使用) | Imagination中文技术社区主题 : Unity3D 怎么保存数据,以便下次开启游戏时读取?
级别: 新手上路
UID: 85530
可可豆: 394 CB
威望: 363 点
在线时间: 434(时)
发自: Web Page
来源于&&分类
Unity3D 怎么保存数据,以便下次开启游戏时读取?&&&
网上看了个连接MySQL教程 需要MySql.data.dll 和 System.Data.dll 这两个文件,可我在电脑上没找到,上网载了两个。出现如下错误: CMySql ---& Mono.CSharp.InternalErrorException: Assets/CMySql.cs(8,35): CMySql.dbConnection ---& System.IO.FileNotFoundException: Could not load file or assembly 'System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.File name: 'System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'&&at (wrapper managed-to-native) System.MonoCustomAttrs:GetCustomAttributesInternal想问下 这是什么原因,或者有没其它简单点的方法,让游戏能够保存数据,以便下次开启游戏时读取呢。我是MAC下做Iphone的游戏。
级别: 新手上路
可可豆: 389 CB
威望: 389 点
在线时间: 112(时)
发自: Web Page
单机的话直接PalyerPrefs就可以实现。。
级别: 新手上路
可可豆: 389 CB
威望: 389 点
在线时间: 112(时)
发自: Web Page
playerprefs&&上面打错了。。不好意思。。
级别: 新手上路
可可豆: 150 CB
威望: 150 点
在线时间: 69(时)
发自: Web Page
同意楼上,自带的这个很方便的
级别: 新手上路
UID: 85530
可可豆: 394 CB
威望: 363 点
在线时间: 434(时)
发自: Web Page
谢谢啊 帮了大忙了 ~~
级别: 骑士
UID: 29344
可可豆: 923 CB
威望: 900 点
在线时间: 310(时)
发自: Web Page
PlayerPrefs 好像不支持存入数组之类的
级别: 新手上路
可可豆: 201 CB
威望: 201 点
在线时间: 19(时)
发自: Web Page
&& 要存数组,需要自己的对数组进行切割成字符串 这里有一个PlayerPrefs 增强版
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版1816人阅读
Cocos2d-X开发学习笔记(31)
&本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010
一、对数据进行编解码
&&&&& 在上一期中,我们使用了CCUserDefault对游戏数据进行存储与读取,但是细心的我们肯定会想到,其游戏数据
存储文件是否安全呢?通过上一期对CCUserDefault的讲解,想必大家也很容易看出Cocos2D-X是以键值对进行存储
的,其存储方式其实是个xml文件,也就是说,游戏数据并不是那么安全。
&&&&&这里我们一起来学习一个简单的对游戏数据进行加密的方法:使用Base64编码解码来实现。
&&&&&对于Base64,由于篇幅限制,这里就不过多的介绍了,不是很熟悉的话可以自行查阅相关资料。
二、Base64的C++代码
下面首先来看看Base64的C++版本的代码,我们将编码解码封装在一个BaseData类中,这个类的代码说明如下:
BaseData.h
#ifndef EDCodeTest_BaseData_h
#define EDCodeTest_BaseData_h
#include &string&
std::string saveData( char const* , unsigned int len);
std::string parseData(std::string const& s);
BaseData.cpp
#include &BaseData.h&
static const std::string dataChars =
&ABCDEFGHIJKLMNOPQRSTUVWXYZ&
&abcdefghijklmnopqrstuvwxyz&
static inline bool isData(unsigned char c) {
return (isalnum(c) || (c == '+') || (c == '/'));
std::string saveData( char const* bytes_to_encode, unsigned int in_len) {
int i = 0;
int j = 0;
unsigned char char_array_3[3];
unsigned char char_array_4[4];
while (in_len--) {
char_array_3[i++] = *(bytes_to_encode++);
if (i == 3) {
char_array_4[0] = (char_array_3[0] & 0xfc) && 2;
char_array_4[1] = ((char_array_3[0] & 0x03) && 4) + ((char_array_3[1] & 0xf0) && 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) && 2) + ((char_array_3[2] & 0xc0) && 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for(i = 0; (i &4) ; i++)
ret += dataChars[char_array_4[i]];
for(j = j & 3; j++)
char_array_3[j] = '\0';
char_array_4[0] = (char_array_3[0] & 0xfc) && 2;
char_array_4[1] = ((char_array_3[0] & 0x03) && 4) + ((char_array_3[1] & 0xf0) && 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) && 2) + ((char_array_3[2] & 0xc0) && 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (j = 0; (j & i + 1); j++)
ret += dataChars[char_array_4[j]];
while((i++ & 3))
ret += '=';
std::string parseData(std::string const& encoded_string) {
int in_len = encoded_string.size();
int i = 0;
int j = 0;
int in_ = 0;
unsigned char char_array_4[4], char_array_3[3];
while (in_len-- && ( encoded_string[in_] != '=') && isData(encoded_string[in_])) {
char_array_4[i++] = encoded_string[in_]; in_++;
if (i ==4) {
for (i = 0; i &4; i++)
char_array_4[i] = dataChars.find(char_array_4[i]);
char_array_3[0] = (char_array_4[0] && 2) + ((char_array_4[1] & 0x30) && 4);
char_array_3[1] = ((char_array_4[1] & 0xf) && 4) + ((char_array_4[2] & 0x3c) && 2);
char_array_3[2] = ((char_array_4[2] & 0x3) && 6) + char_array_4[3];
for (i = 0; (i & 3); i++)
ret += char_array_3[i];
for (j = j &4; j++)
char_array_4[j] = 0;
for (j = 0; j &4; j++)
char_array_4[j] = dataChars.find(char_array_4[j]);
char_array_3[0] = (char_array_4[0] && 2) + ((char_array_4[1] & 0x30) && 4);
char_array_3[1] = ((char_array_4[1] & 0xf) && 4) + ((char_array_4[2] & 0x3c) && 2);
char_array_3[2] = ((char_array_4[2] & 0x3) && 6) + char_array_4[3];
for (j = 0; (j & i - 1); j++) ret += char_array_3[j];
此类中我们封装了两个重要的函数saveData和parseData,它们分别对数据进行编码和解码。
&1& std::string saveData(char const * ,unsigned int len)
作用:对字符串数据进行编码。
参数1:需要编码的目标字符串。
参数2:目标字符串长度。
&2& std::string parseData(std::string const & s)
作用:对字符串数据进行解码。
参数:需要解码的目标字符串。
三、项目实例
1、首先新建Cocos2D-X项目,取名为“MyDataSave02”,然后在项目中加入之前的BaseData类,最后在
HelloWorldScene.cpp文件的init函数中添加如下所示代码。
bool HelloWorld::init()
bool bRet =
CC_BREAK_IF(! CCLayer::init());
//需要存储的字符串
string sValue = &Yangyu&;
//对存储的数据进行编码
string saveBaseString = saveData(sValue.c_str(), sValue.length());
//将得到编码后的数据进行存储
CCUserDefault::sharedUserDefault()-&setStringForKey(&Base&, saveBaseString);
CCUserDefault::sharedUserDefault()-&flush();
//从存储中获取编码的数据
string loadBaseString
CCUserDefault::sharedUserDefault()-&getStringForKey(&Base&);
//对编码数据进行解码得到真实数据
string trueValue = parseData(loadBaseString);
//---用以观察数据
CCLabelTTF* label = CCLabelTTF::create(&&, &Helvetica&, 20);
label-&setPosition(ccp(240,185));
addChild(label);
//编码之前的数据
string logStr = &Before Encoding:&;
logStr+=sV
//编码之后的数据
After Encoding:&;
logStr+=saveBaseS
label-&setString(logStr.c_str());
CCLabelTTF*label2 = CCLabelTTF::create(&&, &Helvetica&, 20);
label2-&setPosition(ccp(240,140));
addChild(label2);
//解码之前的数据
logStr = &Before Decode:&;
logStr+=loadBaseS
//解码之后的数据
After Decode:&;
logStr+=trueV
label2-&setString(logStr.c_str());
} while (0);
2、运行效果图
四、Base64编码解码工具
&&&& 如果我们只是简单的将数据进行Base64编码,其实也是不安全的,对于稍微有些技术背景的人来说,对Base64解
码轻而易举!下图所示是我从网上随意使用了一个Base64解码工具,对刚编码的数据进行解码的例子。
在使用我提供的BaseData工具类时,我们需要在保存数据和读取数据时注意以下几点。
保存数据时:
&1& 当Base64对游戏数据进行编码后,不要着急进行存储,可以对编码后的字符串进行一些处理。例如在编码后的字符串中添加一
些无用字符、数字;或者在这个编码后的字符串进行位置调换操作等。
&2& 当对数据编码后的字符串进行处理后,在利用CCUserDefault进行保存。
读取数据时:
&1& 从存储文件中获取到数据后(已经做了处理的Base64编码字符串),首先对获取的数据进行反操作(按照存储
之前对编码字符串的操作进行反操作)。
&2& 反操作得到正确的Base64编码字符串后再进行Base64解码,以得到真实数据。
这里一来,除非破解者知道你做处理的过程,或者有你的源码,否则会很难破解你的数据。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:530198次
积分:5786
积分:5786
排名:第3562名
原创:66篇
评论:893条
阅读:58422
阅读:16917
(8)(22)(11)(18)(7)

我要回帖

更多关于 ios开发 读取健康数据 的文章

 

随机推荐