cocos2d-x 2.x 转 3.x 学到的知识
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; } #endif Sequence* 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(“”)方法。
----------------
std::map::erase的用法及陷阱
分类:C++
2013-06-25 10:22
4248人阅读
评论(1)
收藏
举报
方法一:
方法二: copy
|