2011-05-01 13 views
6

He intentado que mi juego box2d funcione en modo Retina, y me estoy enfrentando a muchos problemas irritantes cuando corro en modo de mayor resolución.modos cocos2d, box2d y retina: ¿rendirse o intentar que funcione?

cocos2d muestra mis gráficos correctamente en modo retina, pero estoy buscando la necesidad de hackear después de hackear para que box2d funcione de la misma manera que en el modo de menor resolución. Por ejemplo, yo estoy encontrando que tengo que hacer algo como esto para conseguir la depuración dibujar tamaño de la forma correcta en el modo retina:

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); 

Eso Hack (ajuste de todos los puntos de vértice por CC_CONTENT_SCALE_FACTOR()), por supuesto, inevitablemente, conduce a una truco densidad, para mantener el movimiento similar al modo de baja resolución:

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

Y eso nos lleva a otra corte de ajuste en la aplicación de fuerzas:

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

Tenga en mi nd, estoy dibujando en modo de depuración mediante el escalado de depuración mis llamadas de dibujo, así:

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

Qué es lo que estoy fundamentalmente malentendido sobre conseguir Box2D para trabajar con el modo de retina? Estoy usando el Box2DHelper class sugerido por Steffen Itterheim en lugar de PTM_RATIO, pero eso simplemente no parece ser suficiente. ¿Algunas ideas? Estoy a punto de abandonar por completo el modo Retina para mi juego en este momento.

Respuesta

7

estoy usando la clase GLESDebugDraw que viene con la plantilla Cocos2D + Box2D Xcode y la forma en que hacen el sorteo de depuración para ampliar la retina cuando se encuentra en modo es tan simple como:

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

I don' Necesito usar CC_CONTENT_SCALE_FACTOR() en cualquier otro lugar ya que excepto en algunos métodos/propiedades de clase explícitamente nombrados como contentSizeInPixels etc., Cocos2D usa un espacio de coordenadas basado en puntos en el cual los valores de coordenadas permanecen iguales en modo retina o baja resolución, lo que significa lo mismo PTM_RATIO se puede usar para crear accesorios o formas Box2D en ambos modos.

+0

Interesante, tendré que probarlo más tarde hoy. Sería fantástico si fuera así de simple. –

+0

Desafortunadamente, eso todavía no parece ser suficiente. Todavía estoy descubriendo que las formas de mi accesorio box2d aún son dos veces más grandes en el modo Retina que deberían ser. ¿No necesita tener en cuenta PTM_RATIO (ya sean 32 o 64) al especificar vértices para sus dispositivos box2d? –

+1

@ unforgiven3 pero he estado usando el mismo PTM_RATIO independientemente de si '[director enableRetinaDisplay: YES]' o '[director enableRetinaDisplay: NO]'. ¿Qué hay de los sprites de Cocos2D? ¿Preparaste la versión '-hd' de todas las imágenes de sprites usadas? – Lukman

Cuestiones relacionadas