C++ 如何在cocos2d-x 2.1.4中复制精灵中的精灵

C++ 如何在cocos2d-x 2.1.4中复制精灵中的精灵,c++,cocos2d-iphone,sprite,cocos2d-x,C++,Cocos2d Iphone,Sprite,Cocos2d X,好吧,我的问题很简单,我从cocos2d-x编程开始,我试图制作一个平铺的无限背景,假设我有一个图像的png,我想无限重复作为背景,我所做的是我创建了一个精灵作为容器,然后我添加了具有相同图像的精灵,一个放在另一个旁边,覆盖了大约110%的屏幕,然后,在空间游戏教程之后,我再次创建了相同的精灵中的精灵作为第二个背景,我使用它作为两个相同的大图像来滚动无限。。。它工作完美。。。但是我想知道是否可以通过复制第一个精灵来创建第二个精灵。一些代码可能会清除我的情况: 这在init()中进行: acum=

好吧,我的问题很简单,我从cocos2d-x编程开始,我试图制作一个平铺的无限背景,假设我有一个图像的png,我想无限重复作为背景,我所做的是我创建了一个精灵作为容器,然后我添加了具有相同图像的精灵,一个放在另一个旁边,覆盖了大约110%的屏幕,然后,在空间游戏教程之后,我再次创建了相同的精灵中的精灵作为第二个背景,我使用它作为两个相同的大图像来滚动无限。。。它工作完美。。。但是我想知道是否可以通过复制第一个精灵来创建第二个精灵。一些代码可能会清除我的情况:

这在init()中进行:

acum=0.0;
city1=CCSprite::create();
对于(int i=0;i<12;++i){
CCSprite*city=CCSprite::createWithPriteFrameName(“env_buildings_background2.png”);
城市->设置位置(ccp(acum,0));
城市1->addChild(城市);
acum+=city->getContentSize().宽度*0.99;
}
city1->setContentSize(ccp(acum,0));
city2=CCSprite::create();
acum=0.0;
对于(int i=0;i<12;++i){
CCSprite*city=CCSprite::createWithPriteFrameName(“env_buildings_background2.png”);
城市->设置位置(ccp(acum,0));
城市2->addChild(城市);
acum+=city->getContentSize().宽度*0.99;
}
city2->setContentSize(ccp(acum,0));
_backgroundNode->addChild(城市1,-1,建筑速度,ccp(0,winSize.height*0.6));
_backgroundNode->addChild(city2,-1,buildingspeed,ccp(city1->getContentSize().width,winSize.height*0.6));
printf(“%f-%f\n”,city1->getContentSize().width,city2->getContentSize().width);
主要的问题是在这里,我需要从city1创建city2,而不仅仅是重复代码。。。有办法做到这一点吗?我在CCSprite中没有看到允许我这样做的构造函数

这将在更新()中进行:

CCArray*cities=CCArray::createWithCapacity(2);
城市->添加对象(城市1);
城市->添加对象(城市2);
对于(int ii=0;ii count();ii++){
CCSprite*城市=(CCSprite*)(城市->对象索引(ii));
float xPosition=\u backgroundNode->convertToWorldSpace(city->getPosition()).x;
浮动大小=城市->getContentSize().宽度;
如果(X位置<-尺寸){
_backgroundNode->incrementOffset(ccp(城市->getContentSize().width*2,0),城市);
}
}

我将感谢您的帮助,提前谢谢。

此代码将创建您的
citySprite
的准确快照。由于这是一个快照,您将无法访问它包含的精灵。因为它们现在嵌入到图像或精灵本身中

float citySpriteWidth = 480;
float citySpriteHeight = 320;

//Set position in order to make it fit inside CCRenderTexture (You can change this later)
citySprite->setPosition(ccp(citySpriteWidth/2, citySpriteHeight/2));

CCRenderTexture *render = CCRenderTexture::renderTextureWithWidthAndHeight(citySpriteWidth, citySpriteWidth);
render->beginWithClear(0, 0, 0, 0);
citySprite->visit();
render->end();

CCTexture2D *tex = render->getSprite()->getTexture();
CCSprite *newCitySprite = CCSprite::spriteWithTexture(tex);
newCitySprite->setFlipY(true);  //Texture might be upside down
希望这有助于您的需求

否则,如果您的问题只是代码重复。然后你可以写一个函数,它会给你的城市精灵包含像这样的其他精灵。你想叫多少次就叫多少次

CCSprite* creteCitySprite()
{
     float acum = 0.0;
     CCSprite *city1 = CCSprite::create();

     for(int i = 0; i < 12; ++i)
     {
          CCSprite *city = CCSprite::createWithSpriteFrameName("env_buildings_background2.png");
          city->setPosition(ccp(acum, 0));
          city1->addChild(city);
          acum+= city->getContentSize().width*0.99;
     }

     city1->setContentSize(CCSizeMake(acum, 0));

     return city1;
}

此代码将创建您的
citySprite
的精确快照。由于这是一个快照,您将无法访问它包含的精灵。因为它们现在嵌入到图像或精灵本身中

float citySpriteWidth = 480;
float citySpriteHeight = 320;

//Set position in order to make it fit inside CCRenderTexture (You can change this later)
citySprite->setPosition(ccp(citySpriteWidth/2, citySpriteHeight/2));

CCRenderTexture *render = CCRenderTexture::renderTextureWithWidthAndHeight(citySpriteWidth, citySpriteWidth);
render->beginWithClear(0, 0, 0, 0);
citySprite->visit();
render->end();

CCTexture2D *tex = render->getSprite()->getTexture();
CCSprite *newCitySprite = CCSprite::spriteWithTexture(tex);
newCitySprite->setFlipY(true);  //Texture might be upside down
希望这有助于您的需求

否则,如果您的问题只是代码重复。然后你可以写一个函数,它会给你的城市精灵包含像这样的其他精灵。你想叫多少次就叫多少次

CCSprite* creteCitySprite()
{
     float acum = 0.0;
     CCSprite *city1 = CCSprite::create();

     for(int i = 0; i < 12; ++i)
     {
          CCSprite *city = CCSprite::createWithSpriteFrameName("env_buildings_background2.png");
          city->setPosition(ccp(acum, 0));
          city1->addChild(city);
          acum+= city->getContentSize().width*0.99;
     }

     city1->setContentSize(CCSizeMake(acum, 0));

     return city1;
}

我不明白,我想问的是,是否有一种方法可以从城市1已有的基础上创建城市2。。。例如city2=CCSprite::create(city1);创建一个创建精灵的函数并运行它两次是一样的,这正是我想要避免的。事实上,这就是我所拥有的,我只是在发布问题时重复了一遍,以更好地说明我的问题。请参见编辑。试一下。我不明白,我想问的是,是否有一种方法可以从城市1已有的东西中创建城市2。。。例如city2=CCSprite::create(city1);创建一个创建精灵的函数并运行它两次是一样的,这正是我想要避免的。事实上,这就是我所拥有的,我只是在发布问题时重复了一遍,以更好地说明我的问题。请参见编辑。试试看。
 CCSptire *getSpriteFromSprite(CCSprite *citySprite, float citySpriteWidth, float citySpriteHeight)
{
    CCPoint prevPosition = citySprite->getPosition();

    //Set position in order to make it fit inside CCRenderTexture (You can change this later)
    citySprite->setPosition(ccp(citySpriteWidth/2, citySpriteHeight/2));

    CCRenderTexture *render = CCRenderTexture::renderTextureWithWidthAndHeight(citySpriteWidth, citySpriteWidth);
    render->beginWithClear(0, 0, 0, 0);
    citySprite->visit();
    render->end();

    citySprite->setPosition(prevPosition);

    CCTexture2D *tex = render->getSprite()->getTexture();
    CCSprite *newCitySprite = CCSprite::spriteWithTexture(tex);
    newCitySprite->setFlipY(true);  //Texture might be upside down

}