如何在 cocos2dx 中创建多边形以显示 运行 数字

How to create polygons to display running number in cocos2dx

我正在尝试创建一个节点,它只是一个包含数字的矩形。这就是我现在的做法:

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,删除当前子项并添加新子项。有更好的方法吗?

你可以使用两种不同的技术来实现这一点,对我来说它们都很好

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");

之后当你想改变任何精灵的纹理时,只需像这样做:-

         textSprite->setTexture(startTexture); 

为了与您一起使用,请在您的 .h 文件中声明 "textSprite" 以便快速访问。

陷阱:- 改变纹理不会改变精灵初始边界框,如果初始精灵纹理是 32*32 并且改变纹理是 50*50,那么额外的 20*20 纹理会从开始自动裁剪原点,这可能看起来很糟糕。要克服这个问题,您还需要使用

更改矩形
    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" 的图像,如果它在内存中找到它,那么它将 return 该纹理,否则它将 return nullptr.

不知道你是不是想要一些特殊的功能,为什么不使用 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的内容,无需创建sprite