HASH_FIND_PTR
HASH_ADD_PTR
calloc
原型
头文件
功能
返回值
说明
名称解释
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,"Arial",10);
Label * pLabelLoading =Label::createWithSystemFont(pStrLoading,"Arial",10);
// Label * pLabelLoading = Label::createWithTTF(pStrLoading, "Arial", 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<std::string, std::string > mapTest;
- bool TestVal(const std::string & val);
- ......
- std::map<std::string, std::string >::iterator it = mapTest.begin();
- while(it != mapTest.end())
- {
- if(TestVal(it->second))
- {
- it = mapTest.erase(it);
- }
- else
- it++;
- }
- ...........
方法二:
- std::map<std::string, std::string > mapTest;
- bool TestVal(const std::string & val);
- ......
- std::map<std::string, std::string >::iterator it = mapTest.begin();
- while(it != mapTest.end())
- {
- if(TestVal(it->second))
- {
- mapTest.erase(it++);
- }
- else
- 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());
---------------
#include "cocos2d.h"
#include "extensions/cocos-ext.h"
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