[C con Clase] ayuda con el siguiente codigo

Antonio Arjona antonio.arjona.melches en gmail.com
Sab Dic 22 19:20:30 CET 2012


Un cordial saludo a todos:
     estoy siguiendo el curso de c++, y a la par estoy intentando crear 
un videojuego GRP multiplataforma, para ello me estoy ayudando por un 
libro de creación de videojuegos, (Programación de videojuegos con SDL 
para Windows y Linux. de Alberto García).
http://www.agserrano.com/publi.html

Estoy tratando que el programa que incluirá el siguiente código cargue 
el juego a partir de documentos de texto plano, por lo que tendría que 
asignar la memoria de forma dinámica al no existir en el momento de 
complilar el numero especifico de elementos, según el autor del libro, 
La clase sdl_sprite está formada por un array de frames, pero en ningún 
momento veo que tenga una cantidad especifica de frames para el array.
¿Esto significa que con el uso de OOP. puedo asignar la memoria en 
ejecución, sin complicarme la vida?
De momento estoy aun tratando de asimilar correctamente el tema de 
punteros y me he saltado muchos capítulos del curso para intentar 
comprender el tema de objetos clases y asignación de memoria dinámica... 
por lo que mi pregunta puede que sea muy estúpida, en tal caso pido 
disculpas de antemano, si alguien me podría explicar el "mecanismo" de 
este código estaría muy agradecido.

el codigo es el siguiente:

//Archivo de cabecera sdl_sprite.h
#ifndef SDL_SPRITE_H_INCLUDED
#define SDL_SPRITE_H_INCLUDED

#define TRUE 1
#define FALSE 0

// SDL_Frame representa un frame independiente de un sprite.
class SDL_Frame {
     public: // accesible desde fuera de la clase
         // variables de la clase
         SDL_Surface *img; //superficie donde cargara la imagen del sprite

         // funciones de la clase
         void carga(char *path); // para cargar un frame
         void elimina(); // para eliminar
};

// La clase sdl_sprite está formada por un array de frames;
class sdl_sprite {
     private: // accesible unicamente desde la clase
         int posx,posy; // coordenadas de posición
         int estado; //punto en que se encuentra la animacion
         int nframes; // numero total de frames de la animación
         int cont; // contador para la animación
     public:
         SDL_Frame *sprite;

         sdl_sprite(int nf);
         sdl_sprite();
         void finaliza();
         void AñadeFrame(SDL_Frame frame);
         void SeleccionaFrame(int nf);
         int frames() {
         return cont;
     }
     void establece_x(int x) {
         posx=x;
     }
     void establece_y(int y) {
         posy=y;
     }
     void desplaza_x(int c) {
         posx+=c;
     }
     void desplaza_y(int c) {
         posy+=c;
     }
     int dame_x() {
         return posx;
     }
     int dame_y() {
         return posy;
     }
     int dame_w() {
         return sprite[estado].img->w;
     }
     int dame_h() {
         return sprite[estado].img->h;
     }
     void dibuja(SDL_Surface *superficie);
     int colision(sdl_sprite sp);
};

#endif // SDL_SPRITE_H_INCLUDED


//archivo de cod.fuente sdl_sprite.cpp
#include <SDL.h>
#include <SDL_image.h>
#include "sdl_sprite.h"
// Sprite Class implementation
void SDL_Frame::carga(char *path) {
     img=IMG_Load(path);
}

void SDL_Frame::elimina() {
     SDL_FreeSurface(img);
}

sdl_sprite::sdl_sprite(int nf) {
     sprite=new SDL_Frame[nf];
     nframes=nf;
     cont=0;
}

sdl_sprite::sdl_sprite() {
     int
     nf=1;
     sprite=new SDL_Frame[nf];
     nframes=nf;
     cont=0;TRUE
}

void sdl_sprite::finaliza() {
     int i;
     for (i=0 ; i<=nframes-1 ; i++)
         sprite[i].elimina();
}

void sdl_sprite::AñadeFrame(SDL_Frame frame) {
     if (cont<nframes)
     {
         sprite[cont]=frame;
         cont++;
     }
}

void sdl_sprite::SeleccionaFrame(int nf) {
     if (nf<=nframes) {
         estado=nf;
     }
}

void sdl_sprite::dibuja(SDL_Surface *superficie) {
     SDL_Rect dest;
     dest.x=posx;
     dest.y=posy;
     SDL_BlitSurface(sprite[estado].img,NULL,superficie,&dest);
}

int sdl_sprite::colision(sdl_sprite sp) {
     int w1,h1,w2,h2,x1,y1,x2,y2;
     w1=dame_w();//ancho del sprite1
     h1=dame_h();//altura del sprite1
     w2=sp.dame_w();//ancho del sprite2
     h2=sp.dame_h();//alto del sprite2
     x1=dame_x();//pos. X del sprite1
     y1=dame_y();//pos. Y del sprite1
     x2=sp.dame_x();//pos. X del sprite2
     y2=sp.dame_y(); //pos. Y del sprite2

     if (((x1+w1)>x2)&&((y1+h1)>y2)&&((x2+w2)>x1)&&((y2+h2)>y1)) {
         return TRUE;
     } else {
         return FALSE;
     }
}
<http://www.agserrano.com/publi.html>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20121222/6f8350b1/attachment.html>


Más información sobre la lista de distribución Cconclase