请教cocos2d::vector的问题

我创建了一个Vector容器,在里面装了三个元素:

//在.h 文件中定义路障容器
cocos2d::Vectorcocos2d::Node* obstruct_Vector;

//在cpp文件中装入元素

//创建路障
void GameScene::createobstruct() {

//在屏幕中同时只出现3个路障的情况

for (int i = 1; i <= 3; i++) {

auto winSize = Director::getInstance()->getVisibleSize();

auto obstruct = Sprite::create("manhole_cover.png");


//按照精灵的大小创建刚体,并将精灵与刚体绑定
auto holdMertialBody = PhysicsBody::createBox(obstruct->getContentSize());

holdMertialBody->setDynamic(false);    //这是设置是否受重力影响,false表示不受重力影响

holdMertialBody->setContactTestBitmask(1);   //碰撞检测

//obstruct->setAnchorPoint(Point::ANCHOR_MIDDLE);

obstruct->setAnchorPoint(Point::ZERO);

obstruct->setPhysicsBody(holdMertialBody);



//创建节点,并将绑定了刚体的精灵装进节点去
auto singleobstruct = Node::create();

singleobstruct->addChild(obstruct);

singleobstruct->setName("obstruct");  //起个名,以后好找

singleobstruct->setPosition(winSize.width / 2, i*METERIAL_INTERVAL + INIT_DISTANCE);

this->addChild(singleobstruct,20); 

obstruct_Vector.pushBack(obstruct);   //将节点装进容器(根据for 的循环次数,会有三个障碍)

}

};

但是我现在发现一个问题,就是在我循环取出容器中的元素的时候,想依次给它们设置位置属性,发现它们的属性居然是一样的:

代码是这样的:

for (auto hm1 : holdMaterial_Vector) {

cnt = cnt + 1;

hm1->setPositionY(hm1->getPositionY() - 2);

if (hm1->getPositionX() > winSize.width) {
  hm1->setPositionX(hm1->getPositionX()-10);
}
else {
  hm1->setPositionX(hm1->getPositionX()+10);
}

CCLOG("cnt is : %d, X is : %f, Y is : %f", cnt, hm1->getPositionX(),hm1->getPositionY());

}

最后输出的时候是这样的:
cnt is : 1, X is : 10.000000, Y is : -2.000000
cnt is : 2, X is : 10.000000, Y is : -2.000000
cnt is : 3, X is : 10.000000, Y is : -2.000000
cnt is : 1, X is : 20.000000, Y is : -4.000000
cnt is : 2, X is : 20.000000, Y is : -4.000000
cnt is : 3, X is : 20.000000, Y is : -4.000000
cnt is : 1, X is : 30.000000, Y is : -6.000000
cnt is : 2, X is : 30.000000, Y is : -6.000000
cnt is : 3, X is : 30.000000, Y is : -6.000000
cnt is : 1, X is : 40.000000, Y is : -8.000000
cnt is : 2, X is : 40.000000, Y is : -8.000000
cnt is : 3, X is : 40.000000, Y is : -8.000000
cnt is : 1, X is : 50.000000, Y is : -10.000000
cnt is : 2, X is : 50.000000, Y is : -10.000000
cnt is : 3, X is : 50.000000, Y is : -10.000000
cnt is : 1, X is : 60.000000, Y is : -12.000000
cnt is : 2, X is : 60.000000, Y is : -12.000000
cnt is : 3, X is : 60.000000, Y is : -12.000000

感觉每次循环,里面各个元素的位置参数都是一样的,这是怎么回事呢?

你只给给singleobstruct设置的位置,obstruct位置默认是0的。

singleobstruct 应该只是在循环3次,向vector中塞进三个元素的时候设置的位置,那个是初始位置,就是进入场景时看到的样子,那个我测试了,应该是正常的。

我现在的疑问就是,我在从vector中循环取出这三个元素的时候,它们的属性感觉是一样的。

就是下面这个代码:

  for (auto &hm1 : holdMaterial_Vector) {
    
    cnt = cnt + 1;

    hm1->setPositionY(hm1->getPositionY() - 2);

    if (hm1->getPositionX() > winSize.width) {
      hm1->setPositionX(hm1->getPositionX()-10);
    }
    else {
      hm1->setPositionX(hm1->getPositionX()+10);
    }

    CCLOG("cnt is : %d, X is : %f, Y is : %f", cnt, hm1->getPositionX(),hm1->getPositionY());

  }

根据打印的结果,在for循环里面确实是循环了3次,所以每次循环,hm1应该已经分别对应了holdMaterial_Vector中的三个元素了,它们的Y坐标应该不一样才对啊,怎么打印显示的结果确是一样的呢?

你将obstruct放入singleobstruct中,此时取得的obstruct的坐标是相对于singleobstruct中的坐标,应为初始放进去的时候你没有设置obstruct的位置,所以obstruct默认位置为(0, 0),所以你的容器中的obstruct的位置都是一样的

是我搞错了,我最后装进容器中的是精灵,其实应该装的是Node,装singleobstruct就对了,应该这么写:

holdMaterial_Vector.pushBack(singleHoldMaterial);