我正在尝试创建一个只是一个带有数字的矩形的节点。这就是我现在正在做的事情:
int size = 100, fontSize = 64;
auto node = DrawNode::create();
Vec2 vertices[] =
{
Vec2(0,size),
Vec2(size,size),
Vec2(size,0),
Vec2(0,0)
};
node->drawPolygon(vertices, 4, Color4F(1.0f,0.3f,0.3f,1), 0, Color4F(1.0f,1.0f,1.0f,1));
auto texture = new Texture2D();
int numberToDisplay = 2000;
std::string s = std::to_string(numberToDisplay);
texture -> initWithString(s.c_str(), "fonts/Marker Felt.ttf", fontSize, Size(size, size), TextHAlignment::CENTER, TextVAlignment::CENTER);
auto textSprite = Sprite::createWithTexture(texture);
node -> addChild(textSprite);
textSprite -> setPosition(size/2, size/2);
每当我想要更改数字时,我必须重新创建一个textureSprite,删除当前的子项并添加新的子项。有没有更好的方法呢?
答案 0 :(得分:1)
我想知道您是否需要一些特殊功能,为什么不使用LayerColor和labelTTF?
LayerColor* node = LayerColor::create(Color4B(255, 85, 85, 255), 100, 100);
LabelTTF* label = LabelTTF::create(s, "fonts/Marker Felt.ttf", fontSize);
node->addChild(label);
只需更改labelttf的内容,无需创建精灵
答案 1 :(得分:0)
您可以使用两种不同的技术来实现这一目标,对我来说两者都很好
1: - 使用纹理缓存来缓存纹理并在运行时更改图像纹理(如果你知道有多少精确纹理并且纹理具有相同的大小,那就很好)。在你的.h文件中定义没有纹理,如: -
Texture2D *startTexture, *endTexture, *midTexture;
在.cpp文件中这样做: -
startTexture = Director::getInstance()->getTextureCache()->addImage(
"start.png");
endTexture = Director::getInstance()->getTextureCache()->addImage(
"end.png");
middleTexture = Director::getInstance()->getTextureCache()->addImage(
"middle.png");
之后当你想要改变任何Sprite的纹理时,只需这样做: -
textSprite->setTexture(startTexture);
为了与你合作,声明" textSprite"在您的.h文件中也可以快速访问。
坑洼: - 改变纹理不会改变精灵初始边界框,如果初始精灵纹理为32 * 32且改变纹理为50 * 50,那么20 * 20的额外纹理将自动裁剪原点,可能看起来很糟糕。为了解决这个问题,您还需要使用
更改rect textSprite->setTextureRect(
Rect(0, 0, startTexture->getContentSize().width,
startTexture->getContentSize().height));
2: - 使用Sprite Frame Cache,将所有纹理放在spriteframe中,将其加载到内存中,如: -
SpriteFrameCache *spriteCache = SpriteFrameCache::getInstance();
spriteCache->addSpriteFramesWithFile("test.plist", "test.png");
现在,当你想要改变你的纹理时,就像这样做
testSprite->setSpriteFrame(
(SpriteFrameCache::getInstance())->getSpriteFrameByName(
"newImage.png"));
这将首先检查一个名为" newImage.png"的图像的sprite缓存,如果它在内存中找到它然后它将返回该纹理,否则它将返回nullptr。