gpt4 book ai didi

c++ - 如何在 cocos2d-x 2.1.4 中复制 Sprite 的 Sprite

转载 作者:太空宇宙 更新时间:2023-11-04 11:51:36 24 4
gpt4 key购买 nike

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

这在 init() 中:

acum = 0.0;
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(ccp(acum, 0));
city2 = CCSprite::create();
acum = 0.0;
for(int i = 0; i < 12; ++i) {
CCSprite *city = CCSprite::createWithSpriteFrameName("env_buildings_background2.png");
city->setPosition(ccp(acum, 0));
city2->addChild(city);
acum+= city->getContentSize().width*0.99;
}
city2->setContentSize(ccp(acum, 0));
_backgroundNode->addChild(city1, -1 , buildingspeed, 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 中没有看到允许我这样做的构造函数...

这在 update() 中:

CCArray *cities = CCArray::createWithCapacity(2);
cities->addObject(city1);
cities->addObject(city2);
for ( int ii = 0; ii <cities->count(); ii++ ) {
CCSprite * city = (CCSprite *)(cities->objectAtIndex(ii));
float xPosition = _backgroundNode->convertToWorldSpace(city->getPosition()).x;
float size = city->getContentSize().width;
if ( xPosition < -size ) {
_backgroundNode->incrementOffset(ccp(city->getContentSize().width*2,0),city);
}
}

我将不胜感激任何帮助,提前致谢。

最佳答案

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

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

希望这对您的要求有所帮助。

否则,如果您的问题只是代码重复。然后你可以编写一个函数,它会为你提供包含其他像这样的 Sprite 的城市 Sprite 。并根据需要调用它的次数。

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;
}

已编辑:这给了你你想要的。但我想说的是,您添加到 city1 的子 Sprite 将保持静态。

 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

}

关于c++ - 如何在 cocos2d-x 2.1.4 中复制 Sprite 的 Sprite ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17975659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com