现在的位置: 首页 > 综合 > 正文

cocos2d-x部分函数介绍

2018年01月23日 ⁄ 综合 ⁄ 共 3670字 ⁄ 字号 评论关闭

1、VisibleSize和VisibleOrigin
getVisibleSize:表示获得视口(可视区域)的大小,如果DesignResolutionSize跟屏幕尺寸一样大,则getVisibleSize等于getWinSize。

getVisibleOrigin:表示可视区域的起点坐标,这在处理相对位置的时候非常有用,确保节点在不同分辨率下的位置一致。

2、因为在cocos2d里CCNode对象有缩放的方法setScaleX和setScaleY。所以在获取对象大小的时候就必须根据情况明确指定获取对象原始大小,还是缩放后的大小。当然cocos2d里提供了对应的函数来完成这些操作。

getContentSize函数来获得节点原始的大小。只是逻辑尺寸,不是像素

boundingBox函数来获得经过缩放和旋转之后的外框盒大小。
getContentSizeInPixels获得的是像素点大小
3、在精灵初始化时不指定图片,后期在设置

  1. CCSprite *grossini = CCSprite::create();  
  2. CCSpriteFrame *frame = frameCache->spriteFrameByName("grossini_dance_01.png");  
  3. grossini->setDisplayFrame(frame);   //给精灵设置一个新的显示帧  

类似的添加图片按钮:

  1. /* 加入关闭按钮-使用图片菜单来实现*/  
  2. CCMenuItemImage* closeItemImg = CCMenuItemImage::create();  
  3. /* 初始化,先不设置图片*/  
  4. closeItemImg->initWithTarget(this, menu_selector(BatchNodeSceneWithCloseBtn::menuCloseCallback));  
  5. /* 设置正常图片-使用SpriteFrame对象*/  
  6. closeItemImg->setNormalSpriteFrame(cache->spriteFrameByName("CloseNormal.png"));  
  7. /* 设置点击状态图片-使用SpriteFrame对象*/   
  8. closeItemImg->setSelectedSpriteFrame(cache->spriteFrameByName("CloseSelected.png"));  
  9. CCMenu* menu = CCMenu::create(closeItemImg,NULL);  
  10. menu->setPosition(ccp(size.width – 50, 50));  
  11. this->addChild(menu);  
  12. //区别就是,initWithTarget、setNormalSpriteFrame、setSelectedSpriteFrame这几个函数,主要是setNormalSpriteFrame和setSelectedSpriteFrame,SpriteFrame已经存在SpriteFrameCache里了,所以我们可以成功地设置按钮的图片。  

当然,如果开始制定了精灵的显示图片,后期也是可以更改显示的图片的,

  1. CCTexture2D * tex = CCSprite::create("btn_room_hover.png")->getTexture();  
  2. bg->setTexture(tex);  

4、场景切换

  1. void GameSetting::callbackreturn(CCSprite *sprite)  
  2. {  
  3.     CCScene *returnback=HelloWorld::scene();   //要切换到的场景  
  4.     CCDirector::sharedDirector()->setDepthTest(true); //开启深度检测  
  5.     CCTransitionScene *tmpaction=CCTransitionMoveInR::create(1.2,returnback);  //切换方法  
  6.     CCDirector::sharedDirector()->replaceScene(tmpaction);     
  7. }  

同样,如果在多个layer中间切换,可以把多个layer放到一个CCLayerMultiplex中,同时通过switchTo来进行layer的切换。
5、更改文本标签值

  1. CCLabelTTF *ttf=CCLabelTTF::create("%0""Arial", 12);  //创建文本  
  2.      this->addChild(ttf,1);  

而后期,可以通过一下方法改变文本的值

  1. char tmp[10];  
  2. sprintf(tmp, "%%%d",totalNum*100));  
  3. ttf->setString(tmp);  //主要是此函数  

6、如果是通过CCTableView建立列表的话,数据如果不是固定的话,在创建后如果存在多个CCTableView的切换,这时需要通过

View->reloadData();                 //View =CCTableView::create(this,CCSizeMake(960,422));,即创建时的名字,而reloadData为系统函数

来重新加载数据,否则,将导致数据不能时时改变。
另外,可以通过View->setContentOffset(ccp(0, -80 * (idx - 5)));来设置显示的区域(不包括当前已显示窗口的大小,5为当前窗口最多显示的cell个数)。

7、游戏中经常遇到几个层之间互相通信的问题,这就用到了观察者模式,

  1. void addObserver(CCObject *target,   
  2.                      SEL_CallFuncO selector,  
  3.                      const char *name,  
  4.                      CCObject *obj);  

具体代码如下:

  1. void A::onEnter() {  
  2.     CCLayer::onEnter();  
  3.     CCNotificationCenter::sharedNotificationCenter()->addObserver(  
  4.           this,                           
  5.           callfuncO_selector(A::func),  // 处理的消息的回调函数  
  6.           kXxxxName,                    // 感兴趣的消息名称  
  7.           NULL);                        // 保存消息中传递的数据  
  8. }  

可以参考文字cocos2d-x
观察者模式
这样的话如果有消息来得话,就会调用回调函数来处理了。其次,也很重要,要重写onExit()方法,释放掉消息观察者,如果不释放,会发生内存泄露的。

8、设置加载资源的路径,如果有多套ccb文件,针对不同的情况,在文件名完全一样的情况下,就可以通过设置上级目录,从而实现加载不同资源的问题,这样,就需要知道资源的路径。

     把资源以目录的形式加入xcode时,
选择"
Create folder references for any added folders ",
而不是默认的"
Create groups for any added folders  ",
加入后,xcode左侧树状结构内显示的图标是蓝色而非黄色。这样,就建立了不同的资源。
      获取资源时,在AppDelegate.cpp中可以设置全局资源路径:

  1. std::vector<std::string> paths;  
  2.   paths.push_back("zh_CN");    //上层文件夹名称  
  3.   paths.push_back("en_US");    //上层文件夹名称,根据需要,选择不同的设置  
  4.   paths.push_back("");  
  5.   CCFileUtils::sharedFileUtils()->setSearchPaths(paths);  

当然,系统自动处理到Resources目录的,所以,只用设置之后的目录即可,需要详细了解,可以看这里

抱歉!评论已关闭.