jueves, 11 de agosto de 2011

Tutorial Cocos2D: Juego completo (parte 4)

Hoy escribo la última entrada referente al primer juego completo publicado en el blog. De momento lo hemos tocado todo, desde la lógica principal del juego, hasta las animaciones. Pero aún queda una cosa esencial en todo juego... El menú

Para ello he creado un menú totalmente simple, con una imagen de fondo y tan sólo dos opciones. Jugar y visitar el código fuente del juego (ya que tengo pensado publicar el juego a modo de "donación" por un precio de 79 céntimos).

Las letras del menú estarán animadas para dar un poco más de vida, y además, mostraremos la puntuación más alta obtenida en nuestras partidas anteriores.




En la definición de la cabecera de la clase "MenuScene" no debemos definir nada, salvo importar la clase "JuegoLayer" ya que necesitamos esta clase, para iniciar el juego.

#import 
#import "JuegoLayer.h"
#import "cocos2d.h"

@interface MenuScene : CCLayer {}

+(CCScene *) scene;

@end

Y ahora, toca implementar el menú. Como ya he dicho, necesitaremos poca cosa, un CCMenu, dos CCMenuItemLabel, un CCSprite como fondo, un CCShaky3D (para la animación del menú), y selectores para cada pulsación de los elementos del menú.

#import "MenuScene.h"


@implementation MenuScene
+(CCScene *) scene
{
	// 'scene' is an autorelease object.
	CCScene *scene = [CCScene node];
	
	// 'layer' is an autorelease object.
	MenuScene *layer = [MenuScene node];
	
	// add layer as a child to scene
	[scene addChild: layer];
	
	// return the scene
	return scene;
}


// Aquí montaremos el menú, encajando cada pieza en su sitio
-(id) init
{
	// always call "super" init
	// Apple recommends to re-assign "self" with the "super" return value
	if((self=[super init])) {		
        
        CCSprite *fondo = [CCSprite spriteWithFile: [[NSBundle mainBundle] pathForResource:@"Inicio" ofType:@"png"]];
        fondo.position = ccp(240,160);
        [self addChild:fondo];
        
        //Defino el botón Jugar, poniendole como texto "Play", fuente "Arial", tamaño 30 y además,
        //El selector que indicará que acción realizará al ser pulsado
        CCMenuItemLabel *jugar = [CCMenuItemLabel itemWithLabel:[CCLabelTTF labelWithString:@"Play" fontName:@"Arial" fontSize:30] target:self selector:@selector(jugarPulsado)];
        
        //Igual que he definido el botón Jugar, defino el de ir a esta página web.
        CCMenuItemLabel *informacion = [CCMenuItemLabel itemWithLabel:[CCLabelTTF labelWithString:@"Source Code" fontName:@"Arial" fontSize:24] target:self selector:@selector(website)];
        
        //Cambiando el anchorPoint de esta manera, obtenemos un texto alineado a la derecha
        jugar.anchorPoint = ccp(jugar.anchorPoint.x*2,0);
        informacion.anchorPoint = ccp(informacion.anchorPoint.x*2,0);
        
        //Una vez definidos los botones, los añadimos a un "CCMenu" y lo posicionamos
        CCMenu *menu = [CCMenu menuWithItems:jugar, informacion, nil];
        [menu alignItemsVertically];
        menu.position = ccp(465,25);
        [self addChild:menu];
        
        //Este es el efecto que tendrán las letras del menú
        CCShaky3D *efecto = [CCShaky3D actionWithRange:5 shakeZ:NO grid: ccg(4,4) duration:5];
        [menu runAction:[CCRepeatForever actionWithAction:efecto]];
        
        self.isTouchEnabled = YES;
        
        int puntuacionAnt;
        if([[NSUserDefaults standardUserDefaults] valueForKey:@"Score"] != nil) {
            // The key existed...
            puntuacionAnt = [[NSUserDefaults standardUserDefaults] integerForKey:@"Score"];
        }
        else {
            puntuacionAnt = 0;
        }
        
        CCLabelTTF *puntuacionAnterior = [CCLabelTTF labelWithString:[NSString stringWithFormat:@"Puntuación: %d",puntuacionAnt] fontName:@"Arial" fontSize:24];
        
        puntuacionAnterior.anchorPoint = ccp(0,0);
        [self addChild:puntuacionAnterior];
        puntuacionAnterior.position = ccp(100,150);

        
        
	}
	return self;
}

-(void) jugarPulsado{
    CCTransitionFlipY *action = [CCTransitionFlipY transitionWithDuration:1 scene:[HelloWorldLayer scene]];
    [[CCDirector sharedDirector] replaceScene:action];
}

-(void) website{
    //¡Así se abre una página web desde un juego!
    NSString *link = @"http://indie-veloper.blogspot.com/2011/08/tutorial-cocos2d-juego-completo-parte-1.html";       
    
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:link]];
}

@end

Y con esta última entrada, se acaba el tutorial de un juego completo bajo Cocos2D

Código Fuente

5 comentarios:

  1. Excelente tutorial Diego, te aviso cuando lo termine y te contaré que tal me fue, saludos!!! y muchas gracias!

    ResponderEliminar
  2. Seria posible volver a subir el codigo fuente por los problemas ya conocidos de megaupload.

    Gracias

    ResponderEliminar
  3. Hola, gracias por el tutorial esta genial, bueno la cosa es si es posible que subieras el código fuente a otro servidor, es que tengo un fallo y no se cual es y la verdad me gustaría averiguarlo, sobre todo para no volverlo a cometer :P

    Muchas gracias

    ResponderEliminar
  4. He vuelto a subir el proyecto a Mediafire, lo teneis en http://indie-veloper.blogspot.com.es/p/codigo-fuente-y-proyecto-xcode-de-smash.html

    Saludos

    ResponderEliminar