presentación de powerpointexpertojava.ua.es/dadm/restringido/juegos/traspas/sesion...experto en...
TRANSCRIPT
![Page 1: Presentación de PowerPointexpertojava.ua.es/dadm/restringido/juegos/traspas/sesion...Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Videojuegos © 2012-2013 Depto](https://reader034.vdocuments.co/reader034/viewer/2022051605/60096002239e5f45a63d58f5/html5/thumbnails/1.jpg)
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2012-2013 Depto. Ciencia de la Computación e IA
Videojuegos
Sesión 4: Motor de físicas
![Page 2: Presentación de PowerPointexpertojava.ua.es/dadm/restringido/juegos/traspas/sesion...Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Videojuegos © 2012-2013 Depto](https://reader034.vdocuments.co/reader034/viewer/2022051605/60096002239e5f45a63d58f5/html5/thumbnails/2.jpg)
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Videojuegos © 2012-2013 Depto. Ciencia de la Computación e IA Motor de físicas
Puntos a tratar• Motor Box2D• Objetos de Box2D• Tipos de cuerpos• Unidades de medida• Simulación física• Detección de colisiones• Physics Editor
2
![Page 3: Presentación de PowerPointexpertojava.ua.es/dadm/restringido/juegos/traspas/sesion...Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Videojuegos © 2012-2013 Depto](https://reader034.vdocuments.co/reader034/viewer/2022051605/60096002239e5f45a63d58f5/html5/thumbnails/3.jpg)
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Videojuegos © 2012-2013 Depto. Ciencia de la Computación e IA Motor de físicas
Motor de físicas Box2D• Físicas de cuerpos rígidos• Escrito en C++• Se incluye en la mayoría de motores• AndEngine, Cocos2D, libgdx
3
![Page 4: Presentación de PowerPointexpertojava.ua.es/dadm/restringido/juegos/traspas/sesion...Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Videojuegos © 2012-2013 Depto](https://reader034.vdocuments.co/reader034/viewer/2022051605/60096002239e5f45a63d58f5/html5/thumbnails/4.jpg)
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Videojuegos © 2012-2013 Depto. Ciencia de la Computación e IA Motor de físicas
Conceptos de Box2D
4
Body Cuerpo rígido. Puede ser estático, cinemático, o dinámico
Fixture Fija las propiedades de un cuerpo, incluyendo su forma
Shape Define la forma de un cuerpo (círculo o polígono)
Constraint Limita los grados de libertad de un objeto
Joint Define una unión de diferentes cuerpos
World Simulación del mundo 2D. Contiene un conjunto de cuerpos
![Page 5: Presentación de PowerPointexpertojava.ua.es/dadm/restringido/juegos/traspas/sesion...Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Videojuegos © 2012-2013 Depto](https://reader034.vdocuments.co/reader034/viewer/2022051605/60096002239e5f45a63d58f5/html5/thumbnails/5.jpg)
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Videojuegos © 2012-2013 Depto. Ciencia de la Computación e IA Motor de físicas
Mundo de Box2D• Se encarga de realizar la simulación física
• Podemos añadir al mundo diferentes cuerpos rígidos
• Se crea con el vector de gravedad a aplicar• La gravedad se indica mediante un vector 2D (x, y)• El segundo parámetro nos permite optimizar el rendimiento,
evitando que se simulen los cuerpos inactivos si es true
• Podemos cambiar la gravedad con SetGravity
5
b2Vec2 gravity;gravity.Set(0, -‐10);b2World *world = new b2World(gravity);
![Page 6: Presentación de PowerPointexpertojava.ua.es/dadm/restringido/juegos/traspas/sesion...Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Videojuegos © 2012-2013 Depto](https://reader034.vdocuments.co/reader034/viewer/2022051605/60096002239e5f45a63d58f5/html5/thumbnails/6.jpg)
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Videojuegos © 2012-2013 Depto. Ciencia de la Computación e IA Motor de físicas
Tipos de cuerpos en Box2D
6
Estático
CinemáticoDinámico
![Page 7: Presentación de PowerPointexpertojava.ua.es/dadm/restringido/juegos/traspas/sesion...Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Videojuegos © 2012-2013 Depto](https://reader034.vdocuments.co/reader034/viewer/2022051605/60096002239e5f45a63d58f5/html5/thumbnails/7.jpg)
• Usa el sistema métrico (m, kg)• Debemos fijar ratio de conversión píxeles-metros• Optimizado para manejar objetos de 1 metro
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Videojuegos © 2012-2013 Depto. Ciencia de la Computación e IA Motor de físicas
Unidades de medida en Box2D
7
b2BodyDef bodyDef;bodyDef.type = b2_dynamicBody; bodyDef.position.Set(x / PTM_RATIO, y / PTM_RATIO); b2Body *body = world-‐>CreateBody(&bodyDef); b2PolygonShape bodyShape;bodyShape.SetAsBox((width/2) / PTM_RATIO, (height/2) / PTM_RATIO); body-‐>CreateFixture(&bodyShape, 1.0f);
PTM_RATIO = 32width = 32 (1m)height = 64 (2m)
32 px1 m
64 px2 m
![Page 8: Presentación de PowerPointexpertojava.ua.es/dadm/restringido/juegos/traspas/sesion...Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Videojuegos © 2012-2013 Depto](https://reader034.vdocuments.co/reader034/viewer/2022051605/60096002239e5f45a63d58f5/html5/thumbnails/8.jpg)
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Videojuegos © 2012-2013 Depto. Ciencia de la Computación e IA Motor de físicas
Límites del escenario• Podemos crearlos como objetos estáticos de tipo arista
8
b2BodyDef limitesBodyDef;limitesBodyDef.position.Set(x, y); b2Body *limitesBody = world-‐>CreateBody(&limitesBodyDef);b2EdgeShape limitesShape;b2FixtureDef fixtureDef;fixtureDef.shape = &limitesShape; limitesShape.Set(b2Vec2(0.0f / PTM_RATIO, 0.0f / PTM_RATIO), b2Vec2(width / PTM_RATIO, 0.0f / PTM_RATIO));limitesBody-‐>CreateFixture(&fixtureDef); limitesShape.Set(b2Vec2(width / PTM_RATIO, 0.0f / PTM_RATIO), b2Vec2(width / PTM_RATIO, height / PTM_RATIO));limitesBody-‐>CreateFixture(&fixtureDef); limitesShape.Set(b2Vec2(width / PTM_RATIO, height / PTM_RATIO), b2Vec2(0.0f / PTM_RATIO, height / PTM_RATIO));limitesBody-‐>CreateFixture(&fixtureDef); limitesShape.Set(b2Vec2(0.0f / PTM_RATIO, height / PTM_RATIO), b2Vec2(0.0f / PTM_RATIO, 0.0f / PTM_RATIO));limitesBody-‐>CreateFixture(&fixtureDef);
![Page 9: Presentación de PowerPointexpertojava.ua.es/dadm/restringido/juegos/traspas/sesion...Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Videojuegos © 2012-2013 Depto](https://reader034.vdocuments.co/reader034/viewer/2022051605/60096002239e5f45a63d58f5/html5/thumbnails/9.jpg)
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Videojuegos © 2012-2013 Depto. Ciencia de la Computación e IA Motor de físicas
Simulación física• En cada iteración del ciclo del juego debemos actualizar la
simulación del mundo físico• Debemos proporcionar el delta time en la actualización
9
// Ejecuta la simulaciónworld-‐>Step(delta, 6, 2);world-‐>ClearForces(); // Lee datos de los cuerpos en la simulación físicab2Vec2 pos = body-‐>GetPosition();CGFloat rot = -‐1 * CC_RADIANS_TO_DEGREES(b-‐>GetAngle()); sprite.position = ccp(pos.x*PTM_RATIO, pos.y*PTM_RATIO);sprite.rotation = rot;
Conviene acortarlo
Iteraciones posición
Iteraciones velocidad
![Page 10: Presentación de PowerPointexpertojava.ua.es/dadm/restringido/juegos/traspas/sesion...Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Videojuegos © 2012-2013 Depto](https://reader034.vdocuments.co/reader034/viewer/2022051605/60096002239e5f45a63d58f5/html5/thumbnails/10.jpg)
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Videojuegos © 2012-2013 Depto. Ciencia de la Computación e IA Motor de físicas
Datos de usuario de los cuerpos• Podemos asignar datos de usuarios genéricos a los cuerpos• Útil para adjuntar el sprite asociado al cuerpo
• El cuerpo de Box2D sólo realiza simulación física• Nosotros debemos mostrarlo en pantalla mediante un sprite• Esto lo haremos tras la actualización del mundo
10
bodyDef.userData = sprite;
CCSprite *sprite = (CCSprite *)body-‐>GetUserData();b2Vec2 pos = body-‐>GetPosition();CGFloat rot = -‐1 * CC_RADIANS_TO_DEGREES(b-‐>GetAngle()); sprite.position = ccp(pos.x*PTM_RATIO, pos.y*PTM_RATIO);sprite.rotation = rot;
![Page 11: Presentación de PowerPointexpertojava.ua.es/dadm/restringido/juegos/traspas/sesion...Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Videojuegos © 2012-2013 Depto](https://reader034.vdocuments.co/reader034/viewer/2022051605/60096002239e5f45a63d58f5/html5/thumbnails/11.jpg)
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Videojuegos © 2012-2013 Depto. Ciencia de la Computación e IA Motor de físicas
Detección de colisiones• Podemos definir listener de contacto (ContactListener)
11
class MiContactListener : public b2ContactListener { public: MiContactListener(); ~MiContactListener(); // Se produce un contacto entre dos cuerpos virtual void BeginContact(b2Contact* contact); // El contacto entre los cuerpos ha finalizado virtual void EndContact(b2Contact* contact); // Se ejecuta antes de resolver el contacto. // Podemos evitar que se procese virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold); // Podemos obtener el impulso aplicado sobre los cuerpos en contacto virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse); };
![Page 12: Presentación de PowerPointexpertojava.ua.es/dadm/restringido/juegos/traspas/sesion...Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Videojuegos © 2012-2013 Depto](https://reader034.vdocuments.co/reader034/viewer/2022051605/60096002239e5f45a63d58f5/html5/thumbnails/12.jpg)
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Videojuegos © 2012-2013 Depto. Ciencia de la Computación e IA Motor de físicas
Velocidad de impacto
• WorldManifold da información sobre los puntos de contacto
12
void MiContactListener::BeginContact(b2Contact* contact) { b2Body *bodyA = contact.fixtureA-‐>GetBody(); b2Body *bodyB = contact.fixtureB-‐>GetBody(); // Obtiene el punto de contacto b2WorldManifold worldManifold; contact-‐>GetWorldManifold(&worldManifold); b2Vec2 point = worldManifold.points[0]; // Calcula la velocidad a la que se produce el impacto b2Vec2 vA = bodyA-‐>GetLinearVelocityFromWorldPoint(point); b2Vec2 vB = bodyB-‐>GetLinearVelocityFromWorldPoint(point); float32 vel = b2Dot(vB -‐ vA, worldManifold.normal); ...}
![Page 13: Presentación de PowerPointexpertojava.ua.es/dadm/restringido/juegos/traspas/sesion...Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Videojuegos © 2012-2013 Depto](https://reader034.vdocuments.co/reader034/viewer/2022051605/60096002239e5f45a63d58f5/html5/thumbnails/13.jpg)
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Videojuegos © 2012-2013 Depto. Ciencia de la Computación e IA Motor de físicas
Impulso durante el contacto
• Nos informa de la fuerza ejercida entre los cuerpos mientras dura el contacto
13
void MiContactListener::PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) { b2Body *bodyA = contact.fixtureA-‐>GetBody(); b2Body *bodyB = contact.fixtureB-‐>GetBody(); float impulso = impulse-‐>GetNormalImpulses()[0];}
![Page 14: Presentación de PowerPointexpertojava.ua.es/dadm/restringido/juegos/traspas/sesion...Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Videojuegos © 2012-2013 Depto](https://reader034.vdocuments.co/reader034/viewer/2022051605/60096002239e5f45a63d58f5/html5/thumbnails/14.jpg)
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Videojuegos © 2012-2013 Depto. Ciencia de la Computación e IA Motor de físicas
Physics Editor• En código podemos definir formas básicas• Es difícil definir figuras complejas• Podemos utilizar herramientas como Physics Editor
14
http://www.codeandweb.com/physicseditor
![Page 15: Presentación de PowerPointexpertojava.ua.es/dadm/restringido/juegos/traspas/sesion...Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Videojuegos © 2012-2013 Depto](https://reader034.vdocuments.co/reader034/viewer/2022051605/60096002239e5f45a63d58f5/html5/thumbnails/15.jpg)
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Videojuegos © 2012-2013 Depto. Ciencia de la Computación e IA Motor de físicas
Opciones de Physics Editor• Podemos cargar sprites y obtener su contorno automáticamente• Existe una herramienta de tipo “varita mágica”
• Debemos cargar la versión normal (no retina)• Podemos especificar• Ratio points-to-meters• Anchor point del sprite• Propiedades de la fixture (restitution, friction, etc)• Formato de salida
• Como formato de salida seleccionaremos Box2D genérico• Exporta la forma como un fichero plist• Podemos cargar dicho fichero desde Cocos2D
15
![Page 16: Presentación de PowerPointexpertojava.ua.es/dadm/restringido/juegos/traspas/sesion...Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Videojuegos © 2012-2013 Depto](https://reader034.vdocuments.co/reader034/viewer/2022051605/60096002239e5f45a63d58f5/html5/thumbnails/16.jpg)
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Videojuegos © 2012-2013 Depto. Ciencia de la Computación e IA Motor de físicas
Carga de formas en Cocos2D• Debemos copiar en el proyecto la librería de Physics Editor• Se puede encontrar en el instalador del programa
• Cargamos en contenido del fichero en la caché de formas
• Asignamos una fixture de la caché a un cuerpo• Se debe proporcionar el nombre del sprite en el fichero
• No es necesario definir la fixture en código
16
[[GB2ShapeCache sharedShapeCache] addShapesWithFile:@"formas.plist"];
b2Body *body = ... // Inicializar body [[GB2ShapeCache sharedShapeCache] addFixturesToBody:body forShapeName:@"roca"];
![Page 17: Presentación de PowerPointexpertojava.ua.es/dadm/restringido/juegos/traspas/sesion...Experto en Desarrollo de Aplicaciones para Dispositivos Móviles Videojuegos © 2012-2013 Depto](https://reader034.vdocuments.co/reader034/viewer/2022051605/60096002239e5f45a63d58f5/html5/thumbnails/17.jpg)
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Videojuegos © 2012-2013 Depto. Ciencia de la Computación e IA Motor de físicas
¿Preguntas...?
17