如何创建多边形以在cocos2dx中显示运行编号

时间:2015-05-14 02:50:39

标签: c++ cocos2d-x

我正在尝试创建一个只是一个带有数字的矩形的节点。这就是我现在正在做的事情:

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

2 个答案:

答案 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。