viernes, 8 de julio de 2011

Curso de programación: Capítulo 2. Aplicación de los defines


Hola a todos,

Este curso de programación no lo teneis que ver como un curso a la vieja usanza sino como un ente interactivo en el que en base a vuestras preguntas y sugerencias iré construyendo capitulos que intenten resolver vuestras dudas.

Hace pocas horas uno de los lectores del blog me ha comentado por el gtalk que ha empezado a provar el motor 2D y que le parece muy engorroso tener que escribir cada vez que quiere hacer algo:
                                Core::singleton().loquesea();

Y tiene razón. Así que aprovecho la oportunidad para que los que no tienen demasiada idea de prorgamación en C/C++ puedan ir entendiendo los conceptos mediante la práctica.

La forma de resolver este problema es sencilla mediante un define.Como? En el core.h incluimos

//Hacemos un poco más facil la vida al programador de juegos
#define LPE Core::singleton()

Y así en el código del juego las llamadas quedan bastante más cortas (ignorad las funciones que veais raras no son mas que el ejemplo que estoy haciendo para el capitulo 18 del curso del game engine, cuando llegue el momento os lo enseñare :D ) :

void draw ()
    {
        static bool right = true;
        static int angle = 0;
        int x,y;

        if ( LPE.KeyBoardRight() )
            right = true;

        if ( LPE.KeyBoardLeft() )
            right = false;           

        if ( right )
            LPE.DisableFlag("INVX");
        else
            LPE.EnableFlag("INVX");
   
        //Personaje
        LPE.DrawAnim(300,260,"RUN");
       
        //Pintamos el arma
        LPE.GetMousePosition(&x,&y);
        angle = atan2( (double)(y - 230), (double)( 290 - x) ) * 180/PI + 180;
        angle %= 360;
        LPE.DrawCenterRotate(290,230,angle,"PLAYER",3);

        //Cuando hemos acabado de pintar lo que queremos tener girado, desactivamos los flips de x
        LPE.DisableFlag("INVX");

        //Pintado de textos
        LPE.DrawText("SYSTEM",200,350,"ANIMACIONES 2D");
    }

Si, LPE viene de LordPakus Engine , es que soy de un original que espanta ... :D

Alguna sugerencia o duda más? algo que creais que se puede mejorar o sencillamente que no entendeis??  Si me la haceis llegar os prometo haceros un capitulo respondiendola.

Nos vemos
LordPakusBlog

2 comentarios :

  1. Buenas LordPakus, yo soy de los que prefiere no usar defines en C++, que para eso hay alternativas. En tu caso concreto:

    Core& c = Core::singleton();
    c.DisableFlag();
    c.EnableFlag();
    ...

    Un saludo!

    ResponderEliminar
  2. Pues si, de hecho, en la remodelación que estoy haciendo del engine hago desaparecer los singleton, así que deja de tener sentido el define.

    De todas maneras, era un ejemplo práctico para mostrar como funcionaban los defines.

    Muchisimias gracias por tu aportación, siempre va bien que la gente aporte sus conocimientos y experiencias para la comunidad.

    ResponderEliminar

Entradas populares