[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