Cómo crear un juego para romper niveles usando cocos2d y box2d: ParteTambién puedes ver la versión china de este tutorial en el sitio web de Ray. Captura de pantalla del juego Simple Breakout Bbox2d es una biblioteca de motor de física muy poderosa y también es muy adecuada para el desarrollo de juegos en iPhone en combinación con cocos2d. Los famosos Angry Birds y Little Wings están escritos en box2d. Por supuesto, la mejor manera de aprender es hacer un juego sencillo con él. En este tutorial, explicaremos la creación de un juego sencillo para romper niveles, que incluye detección de colisiones, física de rebote de baloncesto, toque y arrastre de la raqueta (el rectángulo blanco en la imagen de arriba) y escenarios de victoria/derrota. (Si aún no conoces cocos2d y box2d, también puedes leer "Cómo usar cocos2d para crear un juego sencillo para iPhone" y "Cómo usar el motor de física de box2d en cocos2d: Pinball". Bueno, es hora de hacer Breakout! Primero, abra Xcode y seleccione la plantilla de aplicación cocos2d-0.99.1 Box2d y cree un proyecto llamado "Box2DBreakout". Elimine el código de la plantilla para tener un proyecto vacío para comenzar de nuevo; consulte el tutorial "Cómo crear un nuevo proyecto". en cocos2d". Use el motor de física box2d en: b2Fixture *_bottomFixture; b2Fixture *_ballFixture; Luego defina la proporción en la parte superior del archivo HelloWorldScene.mm: #define PTM_RATIO 32 Ya hemos discutido esta proporción en el tutorial anterior, así que no entraré en detalles aquí = new b2World(0.0f, 0.0f); // Crea un mundo._world = new b2World(gravity, doSleep); // Crea bordes alrededor de toda la pantalla b2BodyDef groundBodyDef.position(0,0); groundBody = _world->CreateBody(&groundBodyDef) ; b2PolygonShape groundBox; b2FixtureDef groundBoxDef.winSize.width/PTM_RATIO, winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, 0)); ; Bien, este código es el mismo que el anterior. El código de un tutorial es básicamente el mismo; en el tutorial anterior creamos un borde de cuadro para toda la pantalla. Luego, esta vez configuramos la gravedad en 0 porque en un juego de nivelación, ¡no necesitamos la gravedad! Tenga en cuenta que almacenamos un puntero a la abrazadera inferior para su uso posterior (lo usaremos para rastrear cuándo la pelota de baloncesto choca con la parte superior en un tutorial posterior). Ahora, descargue la imagen de baloncesto que hice y arrástrela a la carpeta Recursos, asegurándose de que "Copiar elementos a la carpeta del grupo objetivo (si es necesario)" esté marcado.
ball.position = ccp(100, 100); ball.tag = 1; [self addChild:ball] No hay duda aquí, hemos hecho cosas similares muchas veces. Tenga en cuenta que tenemos un identificador de etiqueta para la pelota de baloncesto, verá su uso más adelante. A continuación, crea un cuerpo para la forma: // Crea un cuerpo de bola b2BodyDef ballBodyDef; ballBodyDef.type = b2_dynamicBody; ballBodyDef.position.Set(100/PTM_RATIO, 100 /PTM_RATIO); >CreateBody(&ballBodyDef); // Crea una forma de círculo b2CircleShape círculo; círculo.m_radius = 26.0/PTM_RATIO; // Crea una definición de forma y agrega al cuerpo b2FixtureDef ballShapeDef.shape = &circle. = 0.f; ballShapeDef.restitution = 1.0f; _ballFixture = ballBody->CreateFixture(&. ballShapeDef); Para hacerlo más concreto, para crear un objeto de cuerpo, primero creamos una estructura de definición de cuerpo, luego creamos el cuerpo, luego creamos la forma, luego especificamos la estructura del elemento fijo y finalmente creamos el objeto de elemento fijo. Actualización: tenga en cuenta que también configuramos la fricción de la pelota en 0. Esto evita que la bola pierda energía por fricción cuando choca, provocando una pequeña desviación cuando choca hacia adelante y hacia atrás. Bueno, ¡es hora de hacer algo completamente diferente! Siguiendo el código anterior: b2Vec2 force = b2Vec2(10, 10); ballBody->ApplyLinearImpulse(force, ballBodyDef.position); Esto aplicará un pulso a la pelota, inicializándola para que se mueva en una dirección específica. Esto aplicará un pulso a la bola, lo que hará que se mueva en una dirección específica durante la inicialización. Lo último que debe hacer es agregar un método de programación de ticks en el método init: [self Schedule:@selector(tick:)] La siguiente es la implementación del método tick: - (void)tick:(ccTime) dt { _world->Step( dt, 10, 10); for( b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) { if (b->GetUserData() != NULL) { CCSprite *sprite = ( CCSprite *)b->GetUserData(); sprite.position = ccp(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO.rotation = -1); * CC_RADIANS_TO_DEGREES(b- >GetAngle()); } }.}} Por supuesto, como en el tutorial anterior, aquí no hay nada especial.