1

我在 Blackberry Playbook 上使用 Cocos2d-x。我试图将 jpeg 在屏幕上居中,但我用来获取屏幕大小的变量最终为 0。即使我可以在 jpeg 加载和定位之前确认它是非零的。我的 init 函数中的代码如下:

bool MyScene::init() {

    if ( !CCLayer::init() ) {
        return false;
    }

    CCSize size = CCDirector::sharedDirector()->getWinSize();

    bg = CCSprite::create("2.jpg");
    bg->setPosition(ccp( size.width/2 , size.height/2 ));
    this->addChild(bg); 

    fg = CCSprite::create("hud2.png");
    fg->setPosition(ccp( size.width/2 , 25 ));
    this->addChild(fg);

    fg2 = CCSprite::create("hud.png");
    fg2->setPosition(ccp( size.width/2 , size.height - 30 ));
    this->addChild(fg2);

    std::stringstream stream;
    stream << "size is " << (size.width/2) << "and " (size.height/2);
    std::string outtext = stream.str();

    label = CCLabelTTF::create(outtext.c_str(), "DejaVuSansMono.ttf", 25, CCSizeMake(size.width, 25), kCCTextAlignmentCenter);
    label->setPosition(ccp( size.width/2 , 28 ));
    this->addChild(label);
}

如果我运行它,标签将打印出尺寸为 0 并且 jpeg 在左下角而不是在中间居中。但是,如果我加载 png 而不是 jpeg,一切正常。更让我感到困惑的是,如果我将使用“size”值填充字符串的代码移动到设置“size”的代码下方,一切正常。如果我将该代码放在其他任何地方,或者将其完全取出,“大小”(大概)会回到 0 并且 jpeg 不会居中。这个问题只发生在黑莓上,但似乎“大小”设置正确,所以我不知道这是一个 cocos2d-x 错误。会不会有一些编译器的古怪把事情搞砸了,或者只是我错过了其他编译​​器更宽容的一些非常简单的错误?

为了进一步混淆,我有另一个应用程序,其中背景设置在一个名为 initBackground 的单独函数中,该函数从主 init 函数调用。在该应用程序中,即使我手动将位置设置为屏幕中间,背景也会定位错误。高度是正确的,但是如果我将 x 位置设置为 160,它的行为就好像我将其设置为 0 并且只显示了一半的图像。

我不介意深入研究 cocos2d-x 代码,但是任何关于从哪里开始寻找的提示都将不胜感激。

4

1 回答 1

0

我意识到这是一篇旧帖子,但我会尝试提供一些建议,以防其他人遇到类似问题。根据您的问题,我想可能会影响图像定位的一个变量是锚点值。也许由于某种原因,您的锚点设置为与图像中心 (0.5,0.5) 不同的值。

anchorPoint 的取值范围为 0.0 到 1.0(0% 到 100%)。如果 anchorPoint 为 0.5x0.5(具有纹理的节点的默认值),则纹理以节点位置为中心。如果 anchorPoint 为 0x0,则纹理的左下角与节点的位置对齐。如果 anchorPoint 为 1x1,则纹理的右上角与节点的位置对齐。这使得 anchorPoint 在左、右、上或下对齐节点时最流行。它最常用于对齐文本标签或将屏幕元素与屏幕边框对齐。

您可以在此处了解有关 anchorPoint 的更多信息http://www.koboldtouch.com/display/IDCAR/How+The+Anchor+Point+Works+And+What+To+Use+It+For

关于您的变量被重置为零,我想这些行可能存在一些问题.. std::stringstream stream; stream << "size is " << (size.width/2) << "and " (size.height/2); std::string outtext = stream.str();

块引用

我更像是一个 java 程序员,但我想应该有一种方法可以直接将 size.width 的值添加到您的标签并打印出来。

希望anchorPoint的建议有所帮助。

于 2013-09-10T02:15:22.750 回答