martes, 30 de agosto de 2011

Herencia y clases abstractas en Objective C

¿Qué es la herencia?

Supongamos que queremos tener un array al que llamaremos "Zoologico". Y que este array sólo puede contener "Animales".

Ahora supongamos que queremos implementar un mono, un elefante y un pájaro, como clases. Todos ellos son animales, por tanto, tienen propiedades comunes a todos los animales, pero cada animal, tiene sus "diferencias". Por ejemplo, el pájaro tiene alas, y el mono no. O el elefante tiene trompa, y el pájaro un pico. Imaginaos que queremos tener una representación gráfica distinta para cada animal, por tanto debemos crear una clase Animal, del tipo CCSprite.

@interface Animal: CCSprite {
    int numeroDePatas;
    bool tienePlumas;
    bool tienePelo;
    bool tienePico;
    bool tieneTrompa;
    bool tieneAlas;
}
-(void) saluda;
@protocol Especializacion
-(void) desplazate;
@end

miércoles, 17 de agosto de 2011

Preparando otro tutorial

Agosto está en su punto medio y las vacaciones llegando a su fin... Mi tiempo libre se agota y empezaré con las clases y exámenes... Espero poder acabar este tutorial que tengo entre manos, que será un intento de "Match 3" estilo Columns, o Bejeweled, aún no lo tengo claro. Los gráficos serán muy "bonitos" y estarán mucho más animados que el anterior tutorial, ya que serán montados por piezas. Un animalito estará formado por 2 ojos, algunos por dos orejas, otros con colas, otros con alas, cuernos, etc...

Gracias a esto, podré explicar un poco la herencia en Objective C. Puesto que cada uno es un "Monstruo" tendrán "habilidades" y "propiedades" comunes, independientemente de cuantas patas, ojos, colas, alas, tengan.

Para prueba, un video:


¡Permaneced atentos!

martes, 16 de agosto de 2011

Ya está a la venta "Smash Them!"

Smash Them! ha sido aprobado por Apple para ser vendido en la App Store. El juego no es más que un ejemplo de cómo desarrollar para iPhone y además, una manera de hacer un pequeño donativo por la publicación del código fuente. El proceso de verificación de esta aplicación ha llevado en total 5 días. Cada uno de los procesos por los que ha pasado la aplicación han sido: Waiting for review, In review, Processing for App Store, y finalmente, Ready for sale. El tiempo que ha tardado cada uno ha sido:

Waiting for review: 5 días
In review: 5 horas
Preparing for App Store: 20 minutos

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.


miércoles, 10 de agosto de 2011

Tutorial Cocos2D: Juego completo (parte 3)

Y ahora, el tutorial está llegando a su fin, esta es la tercera parte de un total de cuatro partes, y en esta en concreto, explicaré la lógica de juego, la detección de toques en la pantalla, el "montaje" del escenario, barras de progreso (CCProgressTimer) y como crear unas partículas en Cocos2D.

Como de costumbre, escribiré aquí la cabecera de la clase "JuegoLayer" la cual contendrá información sobre todo lo relativo al juego, como monstruos, animaciones y puntuaciones.



martes, 9 de agosto de 2011

Tutorial Cocos2D: Juego completo (parte 2)

Por fin he tenido tiempo para preparar la segunda parte del tutorial. Esta vez mostraré como animar CCSprites para moverlos por pantalla, así como usar la directiva @selector y reproducir efectos de sonido.

Empezaré por la cabecera del monstruo, así que pensemos antes de escribir... ¿Qué métodos y funciones debe tener esta clase para poder interactuar con ella? Yo he pensado que como variables debe de tener las acciones de movimiento, y además, un array de strings donde está almacenado cada tipo de monstruo. Además, el monstruo necesita saber que nivel de "agresividad" tener acorde a un parametro de puntuación y con el tiempo de juego.


domingo, 7 de agosto de 2011

Tutorial Cocos2D: Juego completo (parte 1)

El ansiado tutorial está llegando a su fin, para no demorarlo ni crear una entrada tan larga, voy a dividir el tutorial en varias partes (creo que 3 o 4). Esta primera parte estará compuesta por la clase "Mazo" la cual os enseñará como crear animaciones con sprites.

Para empezar una clase, debemos tener claro como estructurarla y que función debe desempeñar. Esta clase que he diseñado, lo único que hace es crear un mazo. Un mazo no es otra cosa que un Sprite animado, por lo que es lógico que deba heredar de la clase CCSprite. Para ello debemos indicarlo en el @interface


#import 
#import "cocos2d.h"

@interface Mazo : CCSprite //Aquí nuestro mazo, hereda las propiedades de un sprite
{}

+(id) animacion; //Con este procedimiento, creamos un mazo (en lugar de init), que tendrá la propiedad "autorelease"
@end

Animación Mazo

sábado, 6 de agosto de 2011

El tutorial está llegando a su fín

Este fin de semana me he puesto manos a la obra para empezar (y casi acabar) el tutorial que quería publicar desde hace un par de días. El tiempo sigue siendo escaso y el esfuerzo en crear los gráficos y buscar sonidos y música es grande en comparación con la programación que debemos realizar. Cocos2D es muy simple, pero a la vez muy eficaz.

Tengo pensado publicar TODO lo realizado para el tutorial, es decir, tanto las imágenes como el código fuente y el proyecto. Por sí a alguien no le queda bien claro lo descrito en la entrada del blog.

Para ir dejando un buen sabor de boca os comentaré que es lo que llevo implementado.

Música: usaré la librería Cocos Dension.
HD y SD: Para retina y sin retina.
Sprite Batch: un png de 2048 x 1024 para almacenar todos los sprites.
Controles táctiles: detectaremos uno o varios toques.
Animaciones: las usaremos para mover sprites (y darles vida con CCAnimate).
Partículas: Todavía por implementar
Menu: Todavía por implementar
Nombre: Aún no está claro :D

Para los impacientes, además dejo un video.

viernes, 5 de agosto de 2011

Preparando algo especial

Hoy y mañana estaré bastante ocupado, pero estoy preparando un tutorial para hacer un juego completo hecho en Cocos2D. Estoy haciendo en los pocos ratos libres que tengo los gráficos que usaré. Tengo pensado tocar los siguientes temas en el tutorial:

Música: usaré la librería Cocos Dension.
Sprite Batch: un png de 1024 x 1024 para almacenar todos los sprites.
Controles táctiles: detectaremos uno o varios toques.
Animaciones: las usaremos para mover sprites.
Partículas: usaremos las partículas predefinidas de Cocos2D

Con todos estos elementos ya podremos crear un juego bastante simple y educativo, ¡Permaneced atentos!

miércoles, 3 de agosto de 2011

Multiples "dedos" o "toques" o "touches"

Hoy voy a mostrar un simple ejemplo de como detectar cuantos dedos hay en la pantalla. Es un poco más "complejo" que obtener información del sensor del acelerómetro, pero sigue siendo sencillo para todos.

Comenzando desde un proyecto nuevo en COCOS2D y eliminando el contenido del hello world (como ya hicimos en el tutoria acelerómetro) tenemos que añadir las siguientes líneas de código:


martes, 2 de agosto de 2011

Acelerómetro y Cocos2D

Hoy enseñaré como usar el acelerómetro y además, a elegir una imagen de un sprite, acorde con el ángulo del iPhone.

Para ello, necesitaremos esta flecha que he diseñado yo mismo (para vuestro uso y tutorial)
Descarga flecha animada / Download animated arrow

será algo tal que así:
Cómo veis es una imagen parecida a la que subí anteriormente, por lo que el ZIP de Megaupload contiene las imágenes en HD y SD así como los archivos correspondientes "plist"





Y este será el resultado final del tutorial:

lunes, 1 de agosto de 2011

¿Synthesize? Objective-C te ayuda con getters y setters

Mucho he tardado en entender de una manera clara que es @synthesize en Objective C. Y por fin sé que es, y puedo explicarlo de una manera clara. No sé si me topé con una mala ayuda, o simplemente tuve varios días malos, pero por fín lo tengo claro.

Aquí os dejo la "ayudita" de hoy.

Supongamos que tenemos una clase "Persona". La cual tendrá Nombre, Apellidos y edad como variables de clase. Tendremos pues, un header definido de la siguiente manera:

@interface Persona{
    NSString *nombre;
    NSString *apellidos;
    int edad;
}