我在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'的代码下面,那么一切正常。如果我将该代码放在其他地方,或完全取出,'size'(推测)会回到0并且jpeg不会居中。这个问题只发生在Blackberry上,但看起来“大小”设置正确,所以我不知道它是一个cocos2d-x错误。可能会有一些编译器怪异搞砸了或者只是一些非常简单的错误我错过了其他编译器更宽容的原因吗?
为了进一步混淆,我有另一个应用程序,其背景设置在一个名为initBackground的单独函数中,该函数从主init函数调用。在该应用程序中,即使我手动将位置设置到屏幕中间,背景也会定位错误。高度是正确的,但是如果我将x位置设置为160,它的行为就像我将其设置为0并且只显示图像的一半。
我不介意深入研究cocos2d-x代码,但是非常感谢任何关于从哪里开始寻找的提示。
答案 0 :(得分: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建议有所帮助。