cocos2dx获取当前场景中如何在类中获取游戏配置信息

博客分类:
在Cocos2dX中提供了自带存储类:CCUserDefault
,这里强调一点,如果你的数据量比较大,建议使用SQL存储比较适合,另外一点要注意的是,尽 可能不要在Cocos2dX中使用与平台相关的api进行开发,例如Xcode使用Cocos2dX进行开发游戏时不小心使用了iOS的控件/组件在项目 中,那么当移植到Android等平台的时候就肯定异常费劲,估计连正常运行都不可能,因为其他平台不可能正好有iOS的这些控件,即使有也肯定底层实现 不一样!换句话而言,神马功能都使用Cocos2dX api实现,尽量都向X靠拢吧,所以这里的存储我也使用X自带的CCUserDefault;至少使用Cocos2dX自带的对于跨平台这一块肯定支持的比较好啦;
言归正传,先大致介绍一下这个类的API:
PublicMemberFunctions
~CCUserDefault()
getBoolForKey (constchar*pKey,booldefaultValue=false)
Getboolvalue by key,ifthe key doesn't exist, a defaultvalue will return.
getIntegerForKey (constchar*pKey, intdefaultValue=0)
Get integer value by key, ifthe key doesn't exist, a defaultvalue will return.
getFloatForKey (constchar*pKey,floatdefaultValue=0.0f)
Getfloatvalue by key,ifthe key doesn't exist, a defaultvalue will return.
getDoubleForKey (constchar*pKey, doubledefaultValue=0.0)
Get doublevalue by key, ifthe key doesn't exist, a defaultvalue will return.
std::string
getStringForKey (constchar*pKey,conststd::string&defaultValue="")
Getstring value by key,ifthe key doesn't exist, a defaultvalue will return.
setBoolForKey (constchar*pKey, boolvalue)
Set boolvalue by key.
setIntegerForKey (constchar*pKey, intvalue)
Set integer value by key.
setFloatForKey (constchar*pKey, floatvalue)
Set floatvalue by key.
setDoubleForKey (constchar*pKey, doublevalue)
Set doublevalue by key.
setStringForKey (constchar*pKey, conststd::string &value)
Set string value by key.
Save content to xml file.
Static Public Member Functions
staticCCUserDefault *
sharedUserDefault ()
staticvoid
purgeSharedUserDefault ()
staticconststd::string &
getXMLFilePath ()
从以上可以一目了然CCUserDefault的使用和功能,哈希表结构,Key -Value,key索引Value值;
提供的存储都是些基础类型,bool,int,string,double,float,方法很容易懂:存储使用set ,获取使用get
那么最后static方法中可以看到CCUserDefault类留出了一个sharedUserDefault作为接口供开发者使用,那么大概介绍后,下面我们来写几段代码验证下:
//我们这里简单存储条数据
CCUserDefault::sharedUserDefault()-&setStringForKey("key", "himi");
CCUserDefault::sharedUserDefault()-&flush();//这里一定要提交写入哦,否则不会记录到xml中,下次启动游戏你就获取不到value了。
//这里随便定义一个string为了验证我们的存储
string str= "wahaha";
//取出我们刚存储的himi,然后赋值给str验证下;
str= CCUserDefault::sharedUserDefault()-&getStringForKey("key");
CCLog("打印str=:%s",str.c_str());
这里要注意,
CCUserDefault中有个
flush()的函数,这个用来将数据写入xml文件中,也就是说当你使用setXX的一些函数后记得提交(调用一下flush函数)
OK,下面是控制台输入的结果:
Cocos2d: cocos2d: cocos2d-1.0.1-x-0.12.0
Cocos2d: cocos2d: GL_VENDOR:
ImaginationTechnologies
Cocos2d: cocos2d: GL_RENDERER:
PowerVR SGX 543
Cocos2d: cocos2d: GL_VERSION:
OpenGL ES-CM 1.1 IMGSGX543-63.14.2
Cocos2d: cocos2d: GL_MAX_TEXTURE_SIZE:4096
Cocos2d: cocos2d: GL_MAX_MODELVIEW_STACK_DEPTH:16
Cocos2d: cocos2d: GL supports PVRTC:YES
Cocos2d: cocos2d: GL supports BGRA8888 textures:NO
Cocos2d: cocos2d: GL supports NPOT textures:YES
Cocos2d: cocos2d: GL supports discard_framebuffer:YES
Cocos2d: cocos2d: compiled with NPOT support:NO
Cocos2d: cocos2d: compiled with VBO support inTextureAtlas:NO
Cocos2d:打印str=:himi
最后一句验证了我们的存储没问题,那么我们现在验证是否真的存在xml中了,首先停止当前运行的项目,然后删除刚才代码替换如下代码:
CCLog("打印str=:%s",CCUserDefault::sharedUserDefault()-&getStringForKey("key").c_str());
然后重新运行此项目,观察控制台打印如下:
Cocos2d: cocos2d: cocos2d-1.0.1-x-0.12.0
Cocos2d: cocos2d: GL_VENDOR:
ImaginationTechnologies
Cocos2d: cocos2d: GL_RENDERER:
PowerVR SGX 543
Cocos2d: cocos2d: GL_VERSION:
OpenGL ES-CM 1.1 IMGSGX543-63.14.2
Cocos2d: cocos2d: GL_MAX_TEXTURE_SIZE:4096
Cocos2d: cocos2d: GL_MAX_MODELVIEW_STACK_DEPTH:16
Cocos2d: cocos2d: GL supports PVRTC:YES
Cocos2d: cocos2d: GL supports BGRA8888 textures:NO
Cocos2d: cocos2d: GL supports NPOT textures:YES
Cocos2d: cocos2d: GL supports discard_framebuffer:YES
Cocos2d: cocos2d: compiled with NPOT support:NO
Cocos2d: cocos2d: compiled with VBO support inTextureAtlas:NO
Cocos2d:打印str=:himi
通过刚才的key-&”key”,正常获取到“himi”这个字符串了,OK,监测没问题;
那么一般情况下我们会需要一个方法就是判定当前项目是否已经有存储数据的xml文件存在了,那么Himi这里说下,Cocos2dX默认源码中有这个方法,但是并没有提供给开发者使用,因为此函数被private私有了,此函数源码如下图所示:
那么既然如此Himi这里就自定义了一个检测是否已存在数据xml的函数提供大家使用:
bool isHaveSaveFile();
.cpp文件:
//当前项目是否存在存储的xml文件
bool HelloWorld::isHaveSaveFile(){
if(!CCUserDefault::sharedUserDefault()-&getBoolForKey("isHaveSaveFileXml"))
CCUserDefault::sharedUserDefault()-&setBoolForKey("isHaveSaveFileXml",true);
CCUserDefault::sharedUserDefault()-&flush();//提交
CCLog("存储文件不存在,头次开始加载游戏");
returnfalse;
CCLog("存储文件已存在");
returntrue;
备注:当存储数据的xml不存在的时候,你的第一次存储数据的时候默认会创建,路径在你的app下的documents,如下图所示:
那么这里强调一点!大家要注意setXX的函数的参数,例如以下这个函数:
setStringForKey (constchar*pKey,const std::string&value)
第一个参数是const char*类型,不是string!!!!(Himi因为这个原因浪费不少时间,悲剧阿。)
Himi当时存储写了如下代码,造成错误,如下:
CCUserDefault::sharedUserDefault()-&setStringForKey(""+823, sKey);
错误截图如下:(存储的key变成了路径。。。。《数据是Himi加密后的》)
哎,郁闷,这里Himi犯错希望童鞋们不要再范此错误,之前Himi一直想找 itoa 找个函数,但是怎么都找不到!(c++
应该存在的整形转字符串),但是Cocos2dX中没有,并且最后Himi使用了与Cocos2dX引擎中的实现itoa的源码,发现如下:
Cocos2dX自带的这个CCUserDefault并不是加密的,而是明文并且是.xml格式的,所以后续准备写一篇使用base64来进行加密的文章供大家参考;
浏览: 38102 次
来自: 南京
rowColorFunction 和setCustomColo ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'cocos2dx怎么读取配置文件_百度知道
cocos2dx怎么读取配置文件
我有更好的答案
using System.IO; String Path=&Images&;
List&string& files =
string getFilesFilter = &*.*.*.*.*.*.&;
string[] arrFilter = getFilesFilter.Split(';');
if (!string.IsNullOrEmpty(Path))
files = new List&string&();
DirectoryInfo di = new DirectoryInfo(&Images&);
for (int i = 0; i & arrFilter.L i++)
if (di.Exists)
foreach (FileInfo fileInfo in di.GetFiles(arrFilter[i]))
files.Add(fileInfo.FullName);
if (files.Count & 50)
catch (IOException) { }
catch (ArgumentException) { }
catch (SecurityException) { }
网络工程师
在cocos2d-x中可以用.plist格式的文件来保存数据,它是XML文件格式的一种,在cocos2d-x解析.plist方面相关的资料比较少,但本身也很简单,要解析.plist文件可以参考cocos2d-x类库中的CCSpriteFrameCache类和CCParticleSystem类,它主要是使用CCDictionary类来对.plist文件进行操作。下面有一个.plist文件:[html] view plaincopy&?xml version=&1.0& encoding=&UTF-8&?&
&!DOCTYPE plist PUBLIC &-//Apple//DTD PLIST 1.0//EN& &&&
&plist version=&1.0&&
&key&level1&/key&
&key&bg_far_scene&/key&
&key&path&/key&
&string&images/far_scene.png&/string&
&key&pos&/key&
&string&{358, 309}&/string&
&key&bg_near_scene&/key&
&key&path&/key&
&string&images/near_scene.png&/string&
&key&pos&/key&
&string&{360, 100}&/string&
读取.plist文件的代码如下:[cpp] view plaincopyconst char* testPlistPath = &BSPlistDatas\\test.plist&;
const char* fullPath = CCFileUtils::sharedFileUtils()-&fullPathFromRelativeFile(&test.plist&, testPlistPath);
CCDictionary* plistDic = CCDictionary::createWithContentsOfFile(testPlistPath);
CCDictionary* levelDic = dynamic_cast&CCDictionary*&(plistDic-&objectForKey(&level1&));
CCDictionary* farScene = dynamic_cast&CCDictionary*&(levelDic-&objectForKey(&bg_far_scene&));
CCString* farScenePath = dynamic_cast&CCString*&(farScene-&objectForKey(&path&));
CCPoint point = CCPointFromString(farScene-&valueForKey(&pos&)-&getCString());
CCLog(&path = %s&, farScenePath-&getCString());
CCLog(&pos = %f, %f&, point.x, point.y);
第一行是.plist文件的相对路径,通过CCFileUtils类获得文件中绝对路径后,使用CCDictionary::createWithContensOfFile(filePath);将文件中内容加载到CCDictionary数据结构的内存中,然后通过xxxForKey获得相应的key下的value。这里需要注意的是,当在读取'pos'的时候,它的值一个{x, y}的字符串,这是.plist文件中的数组存储规则,我们可以通过cocos2d-x提供函数api将这样的字符串转化为CCpoint对象。[cpp] view plaincopyCCPoint point = CCPointFromString(farScene-&valueForKey(&pos&)-&getCString());
上面这句话就是做了这样的一个转化的过程,同样的cocos2d-x还支持CCSize、CCRect的字符串的转化。他们转化的方法以及在.plist中对应的字符串格式如下:CCPoint:
CCPointFromString(); {x, y}CCSize:
CCSizeFromString(); {w, h}CCRect:
CCSizeFromString(); {x, y, w, h}这样我们2D游戏所初始化所需要的数据都基本上够用了,可以尝试将游戏的初始数据放在.plist中,然后修改调整数值就可以直接修改plist文件,而无需重新编译程序了,从而实现游戏数据和游戏逻辑的分离。
本回答被提问者和网友采纳
为您推荐:
其他类似问题
配置文件的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。【IOS-COCOS2D-X 游戏开发之十四】XCODE中C++&OBJECT-C混编,详细介绍如何在COCOS2DX中访问OBJECT函数以及APPLE API
【IOS-COCOS2D-X 游戏开发之十四】XCODE中C++&OBJECT-C混编,详细介绍如何在COCOS2DX中访问OBJECT函数以及APPLE API
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2dx/743.html
Cocos2dx系列博文的上一篇详细介绍了如何在Xcode中利用jni调用Android的...
本站文章均为
原创,转载务必在明显处注明: 转载自【黑米GameDev街区】 原文链接:
Cocos2dx系列博文的上一篇详细介绍了如何在Xcode中利用jni调用Android的Java层代码,还没有看过的童鞋,请移步到如下博文:
本篇继续介绍另外一个在Cocos2dx中必经之路:在Cocos2dx中调用苹果Api以实现后期iOS的GameCenter和iap的相关操作, 那么Himi这里就跟大家简单分享探讨下;如何在Xcode中进行c++与oc混编吧~
参考王哥说的 SimpleAudioEngine 类;
首先Himi建立了两个类,一个object-c ,一个c++,详细如下:
HSpriteOC.h
HSpriteOC.h
Created by Himi
on 12-4-10.
Copyright (c) 2012年 Himi. All rights reserved.
#import &Foundation/Foundation.h&
NSString * str;
@interface HSpriteOC
+(void) testLog;
+(void) testLogWithStr:(NSString*)_str;
+(void) hMessageBox:(NSString*)pszMsg title:(NSString*)pszTitle;
HSpriteOC.m
Created by Himi on 12-4-10.
Copyright (c) 2012年 Himi. All rights reserved.
#import "HSpriteOC.h"
@implementation HSpriteOC
+(void) testLog{
str = @"Himi-&string is: ";
NSLog(@"HSprite: testLog");
+(void) testLogWithStr:(NSString*)_str{
str = [NSString stringWithFormat:@"%@%@",str,_str];
NSLog(@"%@",str);
+(void) hMessageBox:(NSString*)pszMsg title:(NSString*)pszTitle{
UIAlertView * messageBox = [[UIAlertView alloc] initWithTitle: pszTitle
message: pszMsg
delegate: nil
cancelButtonTitle: @"OK"
otherButtonTitles: nil];
[messageBox autorelease];
[messageBox show];
这个类比较简单,简单定义了几个静态函数,打印和显示一个提示框,不赘述,大家大概看下就可以了;
下面来看c++的类:
HSpriteCPP.h
HSpriteCPP.h
Created by Himi on 12-4-10.
Copyright (c) 2012年 Himi. All rights reserved.
#ifndef Oc_Cpp_HSprite_h
#define Oc_Cpp_HSprite_h
#include "cocos2d.h"
using namespace cocos2d;
class HSpriteCPP:public cocos2d::CCSprite {
static HSpriteCPP* hspriteWithFile(const char *spName);
void myInit();
virtual ~HSpriteCPP();
HSpriteCPP.cpp
HSpriteCPP.mm
Created by Himi on 12-4-10.
Copyright (c) 2012年 Himi. All rights reserved.
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#include "HSpriteOC.h"
#include "HSpriteCPP.h"
HSpriteCPP* HSpriteCPP::hspriteWithFile(const char *spName)
HSpriteCPP *pobSprite = new HSpriteCPP();
if (pobSprite && pobSprite->initWithFile(spName))
pobSprite->myInit();
pobSprite->autorelease();
return pobSprite;
CC_SAFE_DELETE(pobSprite);
return NULL;
void HSpriteCPP::myInit(){
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
[HSpriteOC testLog];
[HSpriteOC testLogWithStr:@"wahaha"];
[HSpriteOC hMessageBox:@"cocos2dx调用oc函数" title:@"Himi"];
//Android代码
HSpriteCPP::~HSpriteCPP(){
此类是个自定义精灵类,都是简单的创建等函数,其HSprite.cpp类的导入和在 myInit() 自定义初始化函数中都加入了预编译(#if #else #endif 对预编译不太了解的自定百度下吧),主要为了区别当前手机设备的平台区分做处理;而且在myInit()中我使用了object-c语法进行调用之前OC写的HSprite类函数;
其实通过观察以上两个类童鞋们估计很容易看出在xcode中cpp和oc如何混编;其实就是两点:
1. 混编的类需要将其实现类(.cpp)改成(.mm)类,那么Xcode就会智能知道这个类混编类了,不用复杂的操作;
2. 混编中cpp调用oc,其实就是各自使用各自语法即可,没差异!(最好对OC和c++都比较熟悉更效率)
然后Himi在HelloWorldScene.cpp中加入以下测试代码:
HSpriteCPP * sp =HSpriteCPP::hspriteWithFile("Icon.png");
sp->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width*0.5,CCDirector::sharedDirector()->getWinSize().height*0.5-100));
this->addChild(sp);
别忘记导入对应使用的类哦~OK,看运行效果:
用云栖社区APP,舒服~
【云栖快讯】《阿里巴巴Java开发手册》(详尽版)已经上线!您的Java学好了吗?如果没有,那就赶紧加入学习吧!&&
文章2301篇
以阿里云成熟的商业化云服务为基础,为游戏开发者、运营企业提供专属集群、尊享VIP服务、专项扶...
阿里云移动APP解决方案,助力开发者轻松应对移动app中随时可能出现的用户数量的爆发式增长、...
是基于语音识别、语音合成、自然语言理解等技术,为企业在多种实际应用场景下,赋予产品“能听、会...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效...
飞天发布会第8期:智能选址解决方案没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!}

我要回帖

更多关于 cocos2dx 获取ip地址 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信