AnchorPoint锚点 + CCNotificationCenter 通知中心 + 截屏

锚点是定位和变换操作的一个重点。锚点我们可以看成用一根图钉将一张纸或者相片钉在墙上的那个点。

节点的位置是由我们设置的positionanchor point一起决定的。

值得一提的是,anchor point的默认位置Layer的是左下,而其他的node是中点。

节点的原点是父节点的左下角。

[cpp]  view plain copy
  1. CCLayer* layer1 = CCLayerColor::create(ccc4(255,0,0,255), 300, 200);  
  2. CCLayer* layer2 = CCLayerColor::create(ccc4(255,255,0,255), 100, 100);  
  3.           
  4. addChild(layer1);  
  5. layer1->addChild(layer2);  

[cpp]  view plain copy
  1. layer2->setPosition(50,50);  

可见Layer的锚点是左下角,节点的原点是父节点的左下角。

再看一个:

[cpp]  view plain copy
  1. CCSprite *p1 = CCSprite::create("HelloWorld.png", CCRectMake(100, 100, 100, 100));  
  2. CCSprite *p2 = CCSprite::create("girl1.png");  
  3. addChild(p1);  
  4. p1->addChild(p2);   //p2作为p1的子节点  
  5. setPosition(200,200);  // Layer 的原点移到200,200  


设置锚点:

LayerSprite有不同,layer要设置锚点,必须先:ignoreAnchorPointForPosition(false);

[cpp]  view plain copy
  1.     CCLayer* layer1 = CCLayerColor::create(ccc4(255,0,0,255), 300, 200);  
  2.     CCLayer* layer2 = CCLayerColor::create(ccc4(255,255,0,255), 100, 100);  
  3.     addChild(layer1);  
  4.     layer1->addChild(layer2);  
  5. /*  layer1->ignoreAnchorPointForPosition(false);*/  
  6.     layer1->setAnchorPoint(ccp(0.5,0.5));  

[cpp]  view plain copy
  1. CCLayer* layer1 = CCLayerColor::create(ccc4(255,0,0,255), 300, 200);  
  2. CCLayer* layer2 = CCLayerColor::create(ccc4(255,255,0,255), 100, 100);    
  3. addChild(layer1);  
  4. layer1->addChild(layer2);  
  5. layer1->ignoreAnchorPointForPosition(false);  
  6. layer1->setAnchorPoint(ccp(0.5,0.5));  

Sprite不用设置即可。

[cpp]  view plain copy
  1. CCSprite *p1 = CCSprite::create("HelloWorld.png", CCRectMake(100, 100, 100, 100));  
  2. CCSprite *p2 = CCSprite::create("girl1.png");  
  3. addChild(p1);  
  4. p1->addChild(p2);  
  5. p2->setAnchorPoint(ccp(1,1));  
  6. setPosition(200,200);  

和前面第三个图比较一下就了解了。小女孩的锚点已经到了红色点位置

*****************************************************

而我主要是使用NotificationCenter 进行不同类之间的参数传递。(譬如说在两个layer之间进行参数的传递)

下面对这个CCNotificationCenter类如何使用进行简单的介绍。

1、首先这个类的位置:cocos2dx/support

2、

  1.   static CCNotificationCenter *sharedNotificationCenter(void);  

发送通知:

主要用到的两个方法:

[cpp]  view plain copy
  1. void postNotification(const char *name);  
  2.   
  3. void postNotification(const char *name, CCObject *object);  

例子:

[cpp]  view plain copy
  1. // Define this at the header  
  2. #define MY_NOTIFICATION "MY_NOTIFICATION"  

[cpp]  view plain copy
  1. CCNotificationCenter::sharedNotificationCenter()->postNotification(MY_NOTIFICATION, (CCObject*)1);  

接收通知(添加监听):

方法:

[cpp]  view plain copy
  1. void addObserver(CCObject *target,   
  2.                      SEL_CallFuncO selector,  
  3.                      const char *name,  
  4.                      CCObject *obj);  

例子:

[cpp]  view plain copy
  1. CCNotificationCenter::sharedNotificationCenter()->addObserver(this, callfuncO_selector(HelloWorld::myNotification), MY_NOTIFICATION, NULL);  

[cpp]  view plain copy
  1. // Handle the notification  
  2. void HelloWorld::myNotification(CCObject* obj)  
  3. {  
  4.     CCLOG("Notification achieved. ID: %i", (int)obj);  
  5. }  

注意:一般的在接受通知的一方在接受完通知后需要remove监听。

方法:

[cpp]  view plain copy
  1. void removeObserver(CCObject *target,const char *name);  
  2.   
  3. int removeAllObservers(CCObject *target);  

(注意第二个方法: returns the number of observers removed)

例子:

[cpp]  view plain copy
  1. HelloWorld::~HelloWorld()  
  2. {  
  3.     CCNotificationCenter::sharedNotificationCenter()->removeObserver(this, MY_NOTIFICATION);  
  4.       
  5. //    CCNotificationCenter::sharedNotificationCenter()->removeAllObservers(this);  
  6. }  

很简单吧!

参考文章: http://www.plungeinteractive.com/blog/2012/09/20/notification-center-extension-for-cocos2d-x/


补充 :

最近在使用CCNotificationCenter 在两个 scene 之间传递参数的过程中遇到一个很容易出错的细节,下面简单记录一下。

我们知道,使用 CCNotificationCenter 在两个 scene 之间传递参数,接受方scene 要添加监听,也就是 addObserver ;而发送方scene是要发送消息,也就是 postNotification。

那么二者有先后的顺序吗?

注意:一定要先注册监听,然后发送消息,这样才可以实现数据的传递。--- 当然,这个也是很容易理解的吧。


而我就恰恰没有注意到这个问题,所以导致无法传递数据。

[cpp]  view plain copy
  1. <pre name="code" class="cpp">void HelloWorld::displayCallBack(cocos2d::CCNode *pNode)  
  2. {  
  3.     //发送消息  
  4.     CCNotificationCenter::sharedNotificationCenter()->postNotification(MNOTIFICATION, (CCObject*)1);  
  5.       
  6.     CCScene* scene = TargetRunScene::scene();  
  7.     CCDirector::sharedDirector()->pushScene(CCTransitionSlideInL::create(0.8f, scene));  
  8. }</pre>  


注意到:消息的接受方是 TargetRunScene ,那么我现实发送了消息,然后才初始化接受方的 scene,那么显然接收方的添加监听是在发送了消息后的,所以这样的话,是无法传递参数的。

那么,如何解决呢?

简单啦,就是讲发送消息的放在TargetRunScene 初始化之后就可以了。

[cpp]  view plain copy
  1. void HelloWorld::displayCallBack(cocos2d::CCNode *pNode)  
  2. {  
  3.     CCScene* scene = TargetRunScene::scene();  
  4.     CCDirector::sharedDirector()->pushScene(CCTransitionSlideInL::create(0.8f, scene));  
  5.       
  6.     //发送消息  
  7.     CCNotificationCenter::sharedNotificationCenter()->postNotification(MNOTIFICATION, (CCObject*)1);  
  8. }  


 

cocos2d-x box2d物理引擎深入研究 第一篇之鼠标关节详解(b2MouseJoint)



  1. //关节把刚体A的锚点和刚体B的锚点连接起来。意思就是把刚体A锚点和刚体B的锚点重叠放在一起,然后一颗钉子钉下去,这颗钉子穿过两个锚点。

  1. b2RevoluteJointDef jdEx;  
  2. //连接两个刚体   
  3. jdEx.bodyA = bodies[1];  
  4. jdEx.bodyB = bodies[2];  
  5. //是否允许两个刚体之间发生碰撞  
  6. jdEx.collideConnected = bool(0);  
  7. //关节把刚体A的锚点和刚体B的锚点连接起来。意思就是把刚体A锚点和刚体B的锚点重叠放在一起,然后一颗钉子钉下去,这颗钉子穿过两个锚点。  
  8. jdEx.localAnchorA = bodies[1]->GetLocalCenter();  
  9. jdEx.localAnchorB = bodies[2]->GetLocalCenter();  
  10. //参考角度,他是刚体B的角度-刚体B的角度.所以他是一个相对角度.   
  11. jdEx.referenceAngle = 0.000000000000000e+00f;  
  12. //是否使用限制. 连接器中的两个物体可以无限制的围绕锚点旋转,但是旋转关节也可以对旋转范围作出限制。可以对旋转的上限和下限作出设定  

  1. //关节把刚体A的锚点和刚体B的锚点连接起来。意思就是把刚体A锚点和刚体B的锚点重叠放在一起,然后一颗钉子钉下去,这颗钉子穿过两个锚点。 

  • localAnchorA - 基于刚体A的本地坐标系,在刚体A上的点,刚体A围绕这一点进行旋转.
  • localAnchorB - 基于刚体B的本地坐标系,在刚体B上的点,刚体B围绕这一点进行旋转.
  • eferenceAngle - 刚体B减去刚体B的弧度值.Box2D中角度用弧度表示.

void HelloWorld::jiePing()

{

    CCSize size = CCDirector::sharedDirector()->getWinSize();

    //定义一个屏幕大小的渲染纹理

    CCRenderTexture* pScreen =CCRenderTexture::create(size.width,size.height,kCCTexture2DPixelFormat_RGBA8888);

    //获得当前的场景指针

    CCScene* pCurScene =CCDirector::sharedDirector()->getRunningScene();

    //渲染纹理开始捕捉

    pScreen->begin();

    //当前场景参与绘制

    pCurScene->visit();

    //结束捕捉

    pScreen->end();

    //保存为png

    pScreen->saveToFile("XXXXXX.png",kCCImageFormatPNG);

    //保存为jpg

    pScreen->saveToFile("XXXXXX.jpg",kCCImageFormatJPEG);

    CC_SAFE_DELETE(pScreen);

    

    std::string path =CCFileUtils::sharedFileUtils()->getWritablePath();

 

    CCLog("---- -- - -- ppppppp : %s",  path.c_str());

}


  1. //关节把刚体A的锚点和刚体B的锚点连接起来。意思就是把刚体A锚点和刚体B的锚点重叠放在一起,然后一颗钉子钉下去,这颗钉子穿过两个锚点。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值