【问题标题】:cocos2d, box2d and retina mode: give up, or try to get it to work?cocos2d、box2d和retina模式:放弃,还是试着让它工作?
【发布时间】:2011-05-01 17:27:04
【问题描述】:

我一直试图让我的 box2d 游戏在视网膜模式下运行,但在更高分辨率模式下运行时遇到了很多恼人的问题。

cocos2d 可以在视网膜模式下正确渲染我的图形,但我发现需要在 hack 之后进行 hack,以使 box2d 与在低分辨率模式下一样工作。例如,我发现我需要做这样的事情才能在视网膜模式下获得正确的调试绘制形状大小:

b2Vec2 vertices[4];
vertices[0].Set(-0.5f / CC_CONTENT_SCALE_FACTOR(), 1.0f / CC_CONTENT_SCALE_FACTOR());
vertices[1].Set(-0.5f / CC_CONTENT_SCALE_FACTOR(), -1.0f / CC_CONTENT_SCALE_FACTOR());
vertices[2].Set(0.5f / CC_CONTENT_SCALE_FACTOR(), -1.0f / CC_CONTENT_SCALE_FACTOR());
vertices[3].Set(0.5f / CC_CONTENT_SCALE_FACTOR(), 1.0f / CC_CONTENT_SCALE_FACTOR());  
int32 count = 4;    
b2PolygonShape polygon;    
polygon.Set(vertices, count);

这种 hack(通过 CC_CONTENT_SCALE_FACTOR() 调整所有顶点)当然不可避免地会导致密度 hack,以保持类似于低分辨率模式的运动:

b2FixtureDef fixtureDef;
fixtureDef.shape = &polygon;
fixtureDef.density = 1.0f * CC_CONTENT_SCALE_FACTOR();
fixtureDef.friction = 0.9f;
playerBody->CreateFixture(&fixtureDef);

这会在施加力时导致另一个调整技巧:

b2Vec2 force = b2Vec2(10.0f / CC_CONTENT_SCALE_FACTOR(), 15.0f / CC_CONTENT_SCALE_FACTOR());
playerBody->ApplyLinearImpulse(force, playerBody->GetPosition());

请记住,我是在调试模式下通过缩放调试绘制调用来绘制的,如下所示:

glPushMatrix();  
glScalef(CC_CONTENT_SCALE_FACTOR(), CC_CONTENT_SCALE_FACTOR(), 1.0f);
world->DrawDebugData();
glPopMatrix();

对于让 box2d 与视网膜模式一起工作,我从根本上误解了什么?我正在使用 Steffen Itterheim 建议的 Box2DHelper class 代替 PTM_RATIO,但这似乎还不够。有任何想法吗?在这一点上,我即将完全放弃我的游戏的视网膜模式。

【问题讨论】:

    标签: ios retina-display box2d-iphone


    【解决方案1】:

    我正在使用 Cocos2D+Box2D Xcode 模板附带的 GLESDebugDraw 类,并且我在视网膜模式下使调试绘制放大的方式就像这样简单:

    m_debugDraw = new GLESDebugDraw( PTM_RATIO * CC_CONTENT_SCALE_FACTOR() );
    world->SetDebugDraw(m_debugDraw);
    

    我不需要在其他任何地方使用CC_CONTENT_SCALE_FACTOR(),因为除了在一些明确命名的类方法/属性(如contentSizeInPixels 等)中,Cocos2D 使用基于点的坐标空间,其中坐标值在视网膜模式下保持不变或低分辨率模式,这意味着相同的PTM_RATIO 可用于在两种模式下创建 Box2D 固定装置或形状。

    【讨论】:

    • 有趣,今天晚些时候我得试一试。如果就这么简单就太好了。
    • 不幸的是,这似乎还不够。我仍然发现我的 box2d 夹具形状在视网膜模式下仍然是应有的两倍大。在为 box2d 固定装置指定顶点时,您不需要考虑 PTM_RATIO(无论是 32 还是 64)?
    • @unforgiven3 但无论[director enableRetinaDisplay:YES] 还是[director enableRetinaDisplay:NO],我一直在使用相同的PTM_RATIO。 Cocos2D sprites 怎么样:你准备好了所有使用的 sprite 图片的-hd 版本吗?
    • 确实使用了高清图像 - 我不明白如何使用相同的 PTM_RATIO。在非视网膜中,它通常是每米 32 像素,而在视网膜中,它是每米 64 像素……对吧?对于在视网膜模式下覆盖相同屏幕区域的精灵,它必须是非视网膜模式下的两倍……或者我是这么想的?
    • @unforgiven3 cocos2d 使用基于点的坐标,在视网膜模式或非视网膜模式下它总是 32 个。您是否使用基于像素的计算?
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多