Cocos trae varios módulos de física en 2d como Box2d sin embargo el que mejor integrado está con el engine es Chipmunk por ello este será el que utilicemos.
Al igual que en el capítulo anterior, trabajamos sobre la clase BaseLevel. Lo primero que hay que hacer para integrar la física en un juego será crear la física del mundo, en el método createScene.
Gracias a este Scene::createWithPhysics() los physicsBodies introducidos en la escena se verán afectados por la gravedad. Veamos ahora como crear estos physicsBodies.
Si recordáis en el capítulo anterior, a la hora de tratar capas de objetos llamábamos al método createPhysicsFromLayer este método a su vez llama a otro llamado createPhysicsBodyFromPoints. Este último método genera physicsBodies con forma de línea a partir de dos puntos, esto physicsBodies, son no dinámicos, esto es, que no están afectados por la física por así decirlo, es decir no se moverán de su posición ni se alteran por acción de otros physicsBodies sin embargo ellos si influirán sobre physicsBodies que sean dinámicos.
Los physicsBodies deben estar asociados a un nodo, como vemos aquí creamos una línea con PhysicsBody::createEdgeSegment(origin, destination), esta línea será hija de un objeto Node posteriormente.
El fragmento de código physicsBody->setContactTestBitmask(PLAYER_CONTACT_MASK) es importante para que estos objetos puedan ser tratados en un contactListener ya que sin esa línea estos objetos no tomarían parte del listener que veremos en el capítulo siguiente. Con esto ya tendríamos completa la física de nuestro nivel, ahora debemos añadir physicsBodies al player y a los enemigos, estos physicasBodies serán dinámicos, es decir se verán afectados por la gravedad del mundo del juego y por las colisiones con estos otros physicsBodies no dinámicos.
En el siguiente capítulo veremos cómo trata la clase player las colisiones y como crear un contact listener.