锚点是定位和变换操作的一个重点。锚点我们可以看成用一根图钉将一张纸或者相片钉在墙上的那个点。
节点的位置是由我们设置的position和anchor point一起决定的。
值得一提的是,anchor point的默认位置Layer的是左下,而其他的node是中点。
节点的原点是父节点的左下角。
- CCLayer* layer1 = CCLayerColor::create(ccc4(255,0,0,255), 300, 200);
- CCLayer* layer2 = CCLayerColor::create(ccc4(255,255,0,255), 100, 100);
- addChild(layer1);
- layer1->addChild(layer2);
![](https://img-my.csdn.net/uploads/201212/24/1356338345_8052.png)
- layer2->setPosition(50,50);
![](https://img-my.csdn.net/uploads/201212/24/1356338373_6346.png)
可见Layer的锚点是左下角,节点的原点是父节点的左下角。
再看一个:
- CCSprite *p1 = CCSprite::create("HelloWorld.png", CCRectMake(100, 100, 100, 100));
- CCSprite *p2 = CCSprite::create("girl1.png");
- addChild(p1);
- p1->addChild(p2); //p2作为p1的子节点
- setPosition(200,200); // Layer 的原点移到200,200
![](https://img-my.csdn.net/uploads/201212/24/1356338414_1295.png)
设置锚点:
Layer和Sprite有不同,layer要设置锚点,必须先:ignoreAnchorPointForPosition(false);
- CCLayer* layer1 = CCLayerColor::create(ccc4(255,0,0,255), 300, 200);
- CCLayer* layer2 = CCLayerColor::create(ccc4(255,255,0,255), 100, 100);
- addChild(layer1);
- layer1->addChild(layer2);
- /* layer1->ignoreAnchorPointForPosition(false);*/
- layer1->setAnchorPoint(ccp(0.5,0.5));
![](https://img-my.csdn.net/uploads/201212/24/1356338457_7805.png)
- CCLayer* layer1 = CCLayerColor::create(ccc4(255,0,0,255), 300, 200);
- CCLayer* layer2 = CCLayerColor::create(ccc4(255,255,0,255), 100, 100);
- addChild(layer1);
- layer1->addChild(layer2);
- layer1->ignoreAnchorPointForPosition(false);
- layer1->setAnchorPoint(ccp(0.5,0.5));
![](https://img-my.csdn.net/uploads/201212/24/1356338487_3253.png)
而Sprite不用设置即可。
- CCSprite *p1 = CCSprite::create("HelloWorld.png", CCRectMake(100, 100, 100, 100));
- CCSprite *p2 = CCSprite::create("girl1.png");
- addChild(p1);
- p1->addChild(p2);
- p2->setAnchorPoint(ccp(1,1));
- setPosition(200,200);
![](https://img-my.csdn.net/uploads/201212/24/1356338523_8906.png)
和前面第三个图比较一下就了解了。小女孩的锚点已经到了红色点位置
*****************************************************
而我主要是使用NotificationCenter 进行不同类之间的参数传递。(譬如说在两个layer之间进行参数的传递)
下面对这个CCNotificationCenter类如何使用进行简单的介绍。
1、首先这个类的位置:cocos2dx/support
2、
- static CCNotificationCenter *sharedNotificationCenter(void);
发送通知:
主要用到的两个方法:
- void postNotification(const char *name);
- void postNotification(const char *name, CCObject *object);
例子:
- // Define this at the header
- #define MY_NOTIFICATION "MY_NOTIFICATION"
- CCNotificationCenter::sharedNotificationCenter()->postNotification(MY_NOTIFICATION, (CCObject*)1);
接收通知(添加监听):
方法:
- void addObserver(CCObject *target,
- SEL_CallFuncO selector,
- const char *name,
- CCObject *obj);
例子:
- CCNotificationCenter::sharedNotificationCenter()->addObserver(this, callfuncO_selector(HelloWorld::myNotification), MY_NOTIFICATION, NULL);
- // Handle the notification
- void HelloWorld::myNotification(CCObject* obj)
- {
- CCLOG("Notification achieved. ID: %i", (int)obj);
- }
注意:一般的在接受通知的一方在接受完通知后需要remove监听。
方法:
- void removeObserver(CCObject *target,const char *name);
- int removeAllObservers(CCObject *target);
(注意第二个方法: returns the number of observers removed)
例子:
- HelloWorld::~HelloWorld()
- {
- CCNotificationCenter::sharedNotificationCenter()->removeObserver(this, MY_NOTIFICATION);
- // CCNotificationCenter::sharedNotificationCenter()->removeAllObservers(this);
- }
很简单吧!
参考文章: http://www.plungeinteractive.com/blog/2012/09/20/notification-center-extension-for-cocos2d-x/
补充 :
最近在使用CCNotificationCenter 在两个 scene 之间传递参数的过程中遇到一个很容易出错的细节,下面简单记录一下。
我们知道,使用 CCNotificationCenter 在两个 scene 之间传递参数,接受方scene 要添加监听,也就是 addObserver ;而发送方scene是要发送消息,也就是 postNotification。
那么二者有先后的顺序吗?
注意:一定要先注册监听,然后发送消息,这样才可以实现数据的传递。--- 当然,这个也是很容易理解的吧。
而我就恰恰没有注意到这个问题,所以导致无法传递数据。
- <pre name="code" class="cpp">void HelloWorld::displayCallBack(cocos2d::CCNode *pNode)
- {
- //发送消息
- CCNotificationCenter::sharedNotificationCenter()->postNotification(MNOTIFICATION, (CCObject*)1);
- CCScene* scene = TargetRunScene::scene();
- CCDirector::sharedDirector()->pushScene(CCTransitionSlideInL::create(0.8f, scene));
- }</pre>
注意到:消息的接受方是 TargetRunScene ,那么我现实发送了消息,然后才初始化接受方的 scene,那么显然接收方的添加监听是在发送了消息后的,所以这样的话,是无法传递参数的。
那么,如何解决呢?
简单啦,就是讲发送消息的放在TargetRunScene 初始化之后就可以了。
- void HelloWorld::displayCallBack(cocos2d::CCNode *pNode)
- {
- CCScene* scene = TargetRunScene::scene();
- CCDirector::sharedDirector()->pushScene(CCTransitionSlideInL::create(0.8f, scene));
- //发送消息
- CCNotificationCenter::sharedNotificationCenter()->postNotification(MNOTIFICATION, (CCObject*)1);
- }
cocos2d-x box2d物理引擎深入研究 第一篇之鼠标关节详解(b2MouseJoint)
- //关节把刚体A的锚点和刚体B的锚点连接起来。意思就是把刚体A锚点和刚体B的锚点重叠放在一起,然后一颗钉子钉下去,这颗钉子穿过两个锚点。
- b2RevoluteJointDef jdEx;
- //连接两个刚体
- jdEx.bodyA = bodies[1];
- jdEx.bodyB = bodies[2];
- //是否允许两个刚体之间发生碰撞
- jdEx.collideConnected = bool(0);
- //关节把刚体A的锚点和刚体B的锚点连接起来。意思就是把刚体A锚点和刚体B的锚点重叠放在一起,然后一颗钉子钉下去,这颗钉子穿过两个锚点。
- jdEx.localAnchorA = bodies[1]->GetLocalCenter();
- jdEx.localAnchorB = bodies[2]->GetLocalCenter();
- //参考角度,他是刚体B的角度-刚体B的角度.所以他是一个相对角度.
- jdEx.referenceAngle = 0.000000000000000e+00f;
- //是否使用限制. 连接器中的两个物体可以无限制的围绕锚点旋转,但是旋转关节也可以对旋转范围作出限制。可以对旋转的上限和下限作出设定
- //关节把刚体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());
}
- //关节把刚体A的锚点和刚体B的锚点连接起来。意思就是把刚体A锚点和刚体B的锚点重叠放在一起,然后一颗钉子钉下去,这颗钉子穿过两个锚点。