HASH_FIND_PTR
HASH_ADD_PTR
calloc
calloc是一个 ISO C函数 函数名: calloc 函数原型:voID *calloc(size_t n,size_t size); 功 能: 在内存的 动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的 指针;如果分配不成功,返回NulL。原型 extern voID *malloc(unsigned int num_bytes); 头文件 功能 分配长度为num_bytes字节的 内存块 返回值 如果分配成功则返回指向被分配内存的 指针(此存储区中的初始值不确定),否则返回空指针 NULL。当内存不再使用时,应使用 free()函数将内存块释放。函数返回的 指针一定要适当对齐,使其可以用于任何 数据对象。 说明 关于该函数的原型,在以前malloc返回的是 char型 指针,新的ANSIC标准规定,该函数返回为 void型指针,因此必要时要进行类型转换。 名称解释 malloc的全称是memory allocation,中文叫 动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
------- --------------------- 原型:voID *memmove( voID* dest,const voID* src,size_t count ); 头文件:<string.h> 功能:由src所指内存区域复制count个字节到dest所指内存区域。
-------------------
DelayTime* delayTime =DelayTime::create(animate->getDuration()/2);
CallFunc* callFunc1 =CallFunc::create(CC_CALLBACK_0(figure::attacking,this));
DelayTime 和CallFunc 都是FiniteTimeAction的子类
Sequence* sequence =Sequence::create(delayTime,callFunc1,delayTime,callFunc2,NulL);
例如这个例子,它创建的时候由于参数是不定的
先
va_start(params,action1);
再
Now = va_arg(args,FiniteTimeAction*);
最后
va_end(params);
解决了 不定参数传递的问题
createWithVariableList
解释了如何取得参数的过程。
在VC++6.0的include有一个stdarg.h头文件,有如下几个宏定义:#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )#define va_start(ap,v) ( ap = (va_List)&v + _INTSIZEOF(v) ) //第一个可选参数地址#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址#define va_end(ap) ( ap = (va_List)0 ) // 将指针置为无效如果对以上几个宏定义不理解,可以略过,接着看后面的内容.在进程中,堆栈地址是从高到低分配的.当执行一个函数的时候,将参数列表入栈,压入堆栈的高地址部分,然后入栈函数的返回地址,接着入栈函数的执行代码,这个入栈过程,堆栈地址不断递减,一些黑客就是在堆栈中修改函数返回地址,执行自己的代码来达到执行自己插入的代码段的目的.总之,函数在堆栈中的分布情况是:地址从高到低,依次是:函数参数列表,函数返回地址,函数执行代码段.堆栈中,各个函数的分布情况是倒序的.即最后一个参数在列表中地址最高部分,第一个参数在列表地址的最低部分.参数在堆栈中的分布情况如下:最后一个参数倒数第二个参数...第一个参数函数返回地址函数代码段
Sequence* Sequence::create(FiniteTimeAction *action1,...){ va_List params; va_start(params,action1); Sequence *ret = Sequence::createWithVariableList(action1,params); va_end(params); return ret;}#endifSequence* Sequence::createWithVariableList(FiniteTimeAction *action1,va_List args){ FiniteTimeAction *Now; FiniteTimeAction *prev = action1; bool bOneAction = true; while (action1) { Now = va_arg(args,FiniteTimeAction*); if (Now) { prev = createWithTwoActions(prev,Now); bOneAction = false; } else { // If only one action is added to Sequence,make up a Sequence by adding a simplest finite time action. if (bOneAction) { prev = createWithTwoActions(prev,ExtraAction::create()); } break; } } return ((Sequence*)prev);}
-------------------------------
xcode 创建了 .cpp 文件之后 .h 文件才能include “xxx.h” 点击“xxx.h”才能跳转
事件2.x 替换为3.x 版本
// CCtouchdispatcher* touchdispatcher = CCDirector::sharedDirector()->gettouchdispatcher();
// touchdispatcher->addTargetedDelegate(this,kCcmenuHandlerPriority-1000,true);
// Register touch Event
auto Listener =EventListenertouchOneByOne::create();
Listener->setSwallowtouches(true);
Listener->ontouchBegan =CC_CALLBACK_2(GameLoading::ontouchBegan,this);
Listener->ontouchmoved =CC_CALLBACK_2(Paddle::ontouchmoved,this);
Listener->ontouchended =CC_CALLBACK_2(Paddle::ontouchended,this);
_eventdispatcher->addEventListenerWithSceneGraPHPriority(Listener,this);
-------------------------------
cclabelTTF 的替换
// //加载信息label
// CCString *pStrLoading = dynamic_cast<CCString*>(pDicLang->objectForKey("loading_Now"));
// cclabelTTF * pLabelLoading = cclabelTTF::create(pStrLoading->m_sstring.c_str(),"Arial",10);
// CC_BREAK_IF(pLabelLoading==NulL);
// pLabelLoading->setposition(pProloadRec->getposition());
// addChild(pLabelLoading,enZOrderMID+2,enTagLabel);
ValueMap dict =fileUtils::getInstance()->getValueMapFromfile("ui_xml/loading_xml.xml");
std::string pStrLoading = dict.at("loading_Now").asstring();
// LabelTTF * pLabelLoading = LabelTTF::create(pStrLoading,10);
Label * pLabelLoading =Label::createWithSystemFont(pStrLoading,"Arial",10);
// Label * pLabelLoading = Label::createWithTTF(pStrLoading,10);
CC_BREAK_IF(pLabelLoading==NulL);
pLabelLoading->setposition(pProloadRec->getposition());
addChild(pLabelLoading,enZOrderMID+2,enTagLabel);
------------------------
#include "extensions/cocos-ext.h"
APIdJson::Value Json)
#include "cocos2d.h"
#include "extensions/cocos-ext.h"
USING_NS_CC;
USING_NS_CC_EXT;
-------------------------------------------------------------
CC_SYNTHESIZE_Readonly(string,m_propname,Propname);
------------------
// LabelTTF* Title = LabelTTF::create(m_Title,"Helvetica-Bold",22);
Label * Title =Label::createWithSystemFont(m_Title,"Helvetica-Bold",22);
---------------------
std::function<voID()> callfunc;
std::function<voID()> &callfunc; 错误
CallFunc* moveByEnd =CallFunc::create(this,callfunc_selector(Monomer::moveByEnd));
CallFunc* callFunc2 =CallFunc::create(CC_CALLBACK_0(Monomer::unscheduleUpdateVertexZ,this));
--------------------
// CC_SYNTHESIZE_RETAIN(cocos2d::CCString*,m_filename,Npcfilename);
CC_SYNTHESIZE(std::string,m_filename,Npcfilename);
--------------------
int val1 =512,val2 =1024;
stringstream ss;
ss<<"texture_npc/npc_"<<val1 //“val1: "此处有空格,字符串流是通过空格判断一个字符串的结束
<<"_1_"<<val2<<".png"<<endl;
cout<<ss.str();
val1 =222,val2 =333;
ss.str("");
ss<<"texture_npc/npc_"<<val1 //“val1: "此处有空格,字符串流是通过空格判断一个字符串的结束
<<"_1_"<<val2<<".png"<<endl;
string sx= ss.str()+"fff";
cout<<sx;
// 在C++中可以使用stringstream来很方便的进行类型转换,字符串串接,不过注意重复使用同一个stringstream对象时要先继续清空,而清空很容易想到是clear方法,而在stringstream中这个方法实际上是清空stringstream的状态(比如出错等),真正清空内容需要使用.str(“”)方法。
----------------
方法一:
[cpp] view plain copy std::map<std::string,std::string>mapTest; boolTestVal(conststd::string&val); ...... std::map<std::string,std::string>::iteratorit=mapTest.begin(); while(it!=mapTest.end()) { if(TestVal(it->second)) it=mapTest.erase(it); } else it++; } ........... 在这种方式中,通过std::map的erase方法在释放了it后会返回指向下一个元素的指针来获取最新的iterator
方法二:
copy mapTest.erase(it++); 该方法中利用了后++的特点,这个时候执行mapTest.erase(it++);这条语句分为三个过程
1、先把it的值赋值给一个临时变量做为传递给erase的参数变量
2、因为参数处理优先于函数调用,所以接下来执行了it++ *** 作,也就是it现在已经指向了下一个地址。
3、再调用erase函数,释放掉第一步中保存的要删除的it的值的临时变量所指的位置。
如果只是mapTest.erase(it); 当这条语句执行完后,it就是一个非法指针,如果再执行++就会出错
总结,对于iter的移动在对erase时需要注意。
------------------
ValueMap& framesDict = dictionary["frames"].asValueMap();
-----------------
rAPIdJson::document doc;///<创建一个document对象rAPIdJson的相关 *** 作都在document类中
ssize_t size;
unsigned char*ch =NulL;
do {
ch =fileUtils::getInstance()->getfileData("game_data/prop_info.Json","r",&size);
CC_BREAK_IF(ch ==NulL ||strcmp((char*)ch,"") ==0);
std::string data=std::string((constchar*)ch,size);
CC_SAFE_DELETE_ARRAY(ch);
rAPIdJson::document doc;///<创建一个document对象rAPIdJson的相关 *** 作都在document类中
doc.Parse<0>(data.c_str());///<通过Parse方法将Json数据解析出来
CC_BREAK_IF(doc.HasParseError());
---------------
USING_NS_CC;
USING_NS_CC_EXT;
using namespace std;
#include"cocos2d.h"
#include"cocos-ext.h"
USING_NS_CC;
USING_NS_CC_EXT;
---------------
cocos2d::extension::Controlbutton* btnLand =cocos2d::extension::Controlbutton::create("登陆",MAIN_Font_name,50);
btnLand->setposition(Vec2(winSize/2) -Vec2(80,60));
this->addChild(btnLand);
btnLand->addTargetWithActionForControlEvents(this,cccontrol_selector(GameLand::sendLand),cocos2d::extension::Control::EventType::touch_UP_INSIDE);
Controlbutton* button =Controlbutton::create(Scale9Sprite::create("ui/closed_normal.png"));
button->setBackgroundSpriteForState(Scale9Sprite::create("ui/closed_selected.png"),Control::State::HIGH_liGHTED);
button->setPreferredSize(Size(57,58));
button->setposition(Vec2((m_pBg->getposition() + m_pBg->getContentSize()) - button->getContentSize()/2));
m_pBg->addChild(button);
button->addTargetWithActionForControlEvents(GAME_UILAYER,cccontrol_selector(GameInfoUIController::removeBigMenuAndbutton),Control::EventType::touch_UP_INSIDE);
---------------
this->unschedule(CC_SCHEDulE_SELECTOR(BgMap::updateMapposition));
this->unschedule(CC_SCHEDulE_SELECTOR(Player::detectionReplaceBgMap));
Director::getInstance()->getScheduler()->schedule(CC_SCHEDulE_SELECTOR(TextureAsync::WaitForFinish),this,0.1f,CC_REPEAT_FOREVER,0.0f,false);
this->schedule(CC_SCHEDulE_SELECTOR(Player::detectionReplaceBgMap),0.1f);
-----------------
Cocos2dx 3.0 过渡篇 (二十) 闲扯强制类型转换
http://blog.csdn.net/star530/article/details/21990081
---------------
displayData *displayData =decodeBonedisplay(dic,dataInfo);
boneData->adddisplayData(displayData);
displayData->release();
voIDBoneData::adddisplayData(displayData *displayData)
{
displayDataList.pushBack(displayData);
}
voID pushBack(T object)
{
CCASSERT(object !=nullptr,"The object should not be nullptr");
_data.push_back( object );
object->retain();
}
注意这里 一次 release() 和 retain()
------------------
size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。
--------------------
virtualvoID setString(conststd::string& text) overrIDe;
overrIDe????
-----------------
#include "cocostudio/CocoStudio.h"
这个引入和 csloader 有关Node* Widget =csloader::createNode("ui/role_create/role_create.csb");
-----------------
转换问题
转换注意
//转换失败
转换暂时注释
//转换学习到的
转换关键点
转换未知
cocos2d疑问
转换添加的deBUG
总结以上是内存溢出为你收集整理的cocos2d-x 2.x 转 3.x 学到的知识全部内容,希望文章能够帮你解决cocos2d-x 2.x 转 3.x 学到的知识所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)