cocos2d-x 2.x 转 3.x 学到的知识

来源:互联网 发布:微信群控系统源码 编辑:程序博客网 时间:2024/05/21 08:05

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,"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::stringm_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++ 4248人阅读 评论(1) 收藏 举报

方法一:

[cpp] view plaincopy
  1. std::map<std::string, std::string > mapTest;  
  2. bool TestVal(const std::string & val);  
  3.   
  4. ......  
  5. std::map<std::string, std::string >::iterator it = mapTest.begin();  
  6. while(it != mapTest.end())  
  7. {  
  8.          if(TestVal(it->second))  
  9.          {  
  10.                  it = mapTest.erase(it);  
  11.          }  
  12.          else  
  13.                  it++;  
  14. }  
  15. ...........  
在这种方式中,通过std::map的erase方法在释放了it后会返回指向下一个元素的指针来获取最新的iterator


方法二:

[cpp] view plaincopy
  1. std::map<std::string, std::string > mapTest;  
  2. bool TestVal(const std::string & val);  
  3.   
  4. ......  
  5. std::map<std::string, std::string >::iterator it = mapTest.begin();  
  6. while(it != mapTest.end())  
  7. {  
  8.          if(TestVal(it->second))  
  9.          {  
  10.                 mapTest.erase(it++);  
  11.          }  
  12.          else  
  13.                  it++;  
  14. }  
  15. ...........  
该方法中利用了后++的特点,这个时候执行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());

        




---------------


#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




0 0
原创粉丝点击