本文主要說說自己對
Position AnchorPoint 的理解
首先上一段主要適配代碼
#define EnumContains(value,enum) ((value & enum) == enum)
enum NodePositionMark{
NodePositionMarkTop = 1 << 1,
NodePositionMarkLeft = 1 << 2,
NodePositionMarkBottom = 1 << 3,
NodePositionMarkRight = 1 << 4,
NodePositionMarkVerticalityCenter = 1 << 5,
NodePositionMarkHorizontalCenter = 1 << 6,
};
void setPosition(Node *node,NodePositionMark nodePositionMark)
{
Vec2 visibleOrigin = Director::getInstance()->getVisibleOrigin();
Size visibleSize = Director::getInstance()->getVisibleSize();
Size dSize = Director::getInstance()->getOpenGLView()->getDesignResolutionSize();
Vec2 anchorPoint = node->getAnchorPoint();
Size parentContentSize = Director::getInstance()->getVisibleSize();
if (node->getParent()) {
parentContentSize = node->getParent()->getContentSize();
visibleOrigin = Vec2::ZERO;
}
bool isNeedCareInVisibleSize = false;
if (parentContentSize.equals(dSize) && visibleOrigin != Vec2::ZERO) {
isNeedCareInVisibleSize = true;
parentContentSize = visibleSize;
visibleOrigin = Director::getInstance()->getVisibleSize();
}
Size contentSize = node->getContentSize();
float x = .0,y = .0;
if ( EnumContains(nodePositionMark, NodePositionMarkTop) ) {
y = parentContentSize.height + contentSize.height * (anchorPoint.y - 1) ;
}
if ( EnumContains(nodePositionMark, NodePositionMarkBottom)) {
y = contentSize.height * anchorPoint.y;
}
if ( EnumContains(nodePositionMark, NodePositionMarkVerticalityCenter) ) {
y = (parentContentSize.height - contentSize.height) * 0.5 + contentSize.height * anchorPoint.y ;
}
if ( EnumContains(nodePositionMark, NodePositionMarkLeft)) {
x = contentSize.width * anchorPoint.x;
}
if ( EnumContains(nodePositionMark, NodePositionMarkRight)) {
x = parentContentSize.width - contentSize.width * (1-anchorPoint.x);
}
if ( EnumContains(nodePositionMark, NodePositionMarkHorizontalCenter) ) {
x = (parentContentSize.width - contentSize.width) * 0.5 + contentSize.width * anchorPoint.x;
}
node->setPosition(visibleOrigin+Vec2(x, y));
}
- anchor
anchor 這個的英文意思是:錨;拋錨停泊 拋錨;使固定
在此處AnchorPoint的意思的 ,錨的點 ,便是相對於本身node 固定的點,可以理解爲釘子 - Position
Position 在cocos2d裏面的意思便是 上面的anchorPoint這個釘子所在的點 在父級node的位置
這裏需要注意AnchorPoint 的x,y取值是(.0~1.0)
舉例說明值的含義 比如(0,0)級左下角、 1,0 左上角、0,1右下角、1,1右上角 、0.5,0.5 中心 說到這裏應該明白了吧
上面的代碼缺少 margin 模塊 比如MarginTop 、 MarginLeft 等
- margin
如果你需要考慮margin 最好傳參用map這種鍵值對的格式比較容易實現 - VisibleSize
再說說VisibleSize 這個便是 可以看見的區域的大小 意思很明確對吧 Visible Size - VisibleOrigin
VisibleOrigin這個意思也很明確 就是可見區域相對整個屏幕的起始點 Visible Origin - 爲啥說VisibleOrigin和VisibleSize呢
因爲有時候會遇到初始創建的node大小都是最大的並不是可見區域的大小那麼此時我計算的時候是先按照父級大小爲 VisibleSize算然後座標位置加上VisibleOrigin (判斷是否爲此情況的依據是 parentContentSize.equals(dSize) && visibleOrigin != Vec2::ZERO)上面代碼中的 - #define EnumContains(value,enum) ((value & enum) == enum)
這行代碼應該不難理解吧 就不說了
9.15添加
在看tests的時候發現的 用來佈局應該是有幫助的