2011-05-01 51 views
6

我一直在試圖讓我的box2d遊戲在視網膜模式下工作,而且我在高分辨率模式下運行時遇到了許多惱人的問題。cocos2d,box2d和視網膜模式:放棄,或試圖讓它工作?

cocos2d在Retina模式下正確渲染我的圖形,但我發現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); 

這幫閒(由CC_CONTENT_SCALE_FACTOR()調整所有頂點),當然不可避免地導致密度黑客,保持相似的運動,以較低分辨率模式:

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,但這似乎還不夠。有任何想法嗎?在這一點上,我即將完全放棄視網膜模式。

回答

7

我使用附帶的cocos2d + Box2D的Xcode的模板和路GLESDebugDraw類我做調試平局擴展時視網膜模式是一樣簡單:

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

我不除了在一些明確命名的類方法/屬性(如contentSizeInPixels等)中,Cocos2D使用基於點的座標空間,其座標值在視網膜模式或低分辨率模式下保持不變,這意味着相同可以使用PTM_RATIO在兩種模式下創建Box2D燈具或形狀。

+0

有趣的是,今天晚些時候我將不得不嘗試一下。如果它那麼簡單,那將是太棒了。 – 2011-05-03 16:17:21

+0

不幸的是,這似乎還不夠。我仍然發現我的box2d燈具的形狀在視網膜模式下仍然是它們的兩倍。在指定box2d燈具的頂點時,是否需要考慮PTM_RATIO(無論是32還是64)? – 2011-05-04 01:54:01

+1

@unforgiven3,但無論是[[director enableRetinaDisplay:YES]'還是'[director enableRetinaDisplay:NO]'',我都一直在使用相同的PTM_RATIO。 Cocos2D精靈怎麼樣:你準備了所有使用的精靈圖像的「-hd」版本嗎? – Lukman 2011-05-04 02:34:02