PDA

Ver la versión completa : [Ayuda] Dudas con mi código ¿está bien?



Gabs86
04/10/2008, 23:01
Hola, estoy aprendiendo SDL y C++ a la vez, así que tengo dudas muy a menudo, quiero hacer las cosas bien así que en cuanto tengo una duda dejo de programar :S. Para empezar hice un pong con C, algo muy básico y que hice en una tarde sin ningún problema, ahora estoy intentando dar un pasito más y me he puesto a hacer un tetris usando POO, aquí os dejo un fragmento del código y lo que creo que está mal:

fichero de cabecera de la clase Tablero

#ifndef TABLEROH
#define TABLEROH
#include "ladrillo.h"

class Tablero{
private:
int x,y;
SDL_Surface tablero;
Ladrillo * matriz[10][20];

public:
Tablero(int x,int y);
bool addLadrillo(int x, int y, SDL_Color color);
SDL_Surface * imprimir();
Ladrillo * getLadrillo(int x, int y);
};
#endif

fichero tablero.cpp

#include "tablero.h"

Tablero::Tablero(int x, int y){
this->x=x;
this->y=y;
SDL_Surface *tablero=SDL_CreateRGBSurface(SDL_HWSURFACE,20*10, 20*20,24,0,0,0,0);
}

bool Tablero::addLadrillo(int x, int y, SDL_Color color){
if(this->matriz[x][y]==NULL) {
this->matriz[x][y]=new Ladrillo(x,y,color);
return true;
}else{
return false;
}
}

SDL_Surface * Tablero::imprimir(){
for(int i=0;i<10;i++){
for(int j=0;j<20;j++){
if(this->matriz[i][j]!=NULL){
SDL_FillRect(&tablero, matriz[i][j]->getRect(), SDL_MapRGB(tablero.format, matriz[i][j]->getColor()->r, matriz[i][j]->getColor()->g, matriz[i][j]->getColor()->b));
}
}
}
return &tablero;
}

Ladrillo * Tablero::getLadrillo(int x, int y){
return this->matriz[x][y];
}



mi duda está en la función imprimir de la clase tablero en la linea SDL_FillRect(&tablero, matriz[i][j]->getRect(), SDL_MapRGB(tablero.format, matriz[i][j]->getColor()->r, matriz[i][j]->getColor()->g, matriz[i][j]->getColor()->b));

en mi opinión es linea debería ser esta:
[SDL_FillRect(tablero, &matriz[i][j]->getRect(), SDL_MapRGB(tablero->format, matriz[i][j]->getColor()->r, matriz[i][j]->getColor()->g, matriz[i][j]->getColor()->b));

pero si pongo la segunda linea el compilador me dice que está mal, y poniendo la primera compila, pero creo que no funciona, al menos he hecho alguna prueba y parece que peta.

pero si pongo

si necesitaís saber como está implementada la clase ladrillo aquí os dejo el archivo de cabecera y el .cpp:

archivo de cabecera ladrillo.h

#ifndef LADRILLOH
#define LADRILLOH
#include <SDL/SDL.h>

class Ladrillo{
private:
SDL_Rect rectangulo;
SDL_Color color;

public:
Ladrillo(int x, int y, SDL_Color color);
void mover();
void mover(int i);
SDL_Rect* getRect();
SDL_Color* getColor();
};
#endif

archivo ladrillo.cpp

#include "ladrillo.h"

Ladrillo::Ladrillo(int x, int y, SDL_Color color){
rectangulo.x=x;
rectangulo.y=y;
rectangulo.w=25;
rectangulo.h=25;
this->color=color;
}

void Ladrillo::mover(int i){
rectangulo.x+=(i*25);
rectangulo.y+=25;
}

void Ladrillo::mover(){
mover(0);
}

SDL_Rect* Ladrillo::getRect(){
return &rectangulo;
}

SDL_Color* Ladrillo::getColor(){
return &color;
}


Un saludo y muchas gracias!!!

hardyx
05/10/2008, 04:07
Así a primera vista he visto algunos errores:

1- La variable tablero de la clase debería ser un puntero. De esta manera: "SDL_Surface *tablero", porque vas a crearla dinámicamente con funciones de la SDL.

2- en el constructor Tablero::Tablero(x,y) guardas la superficie creada en una variable local (no es tu variable de la clase). Y esta variable puntero se pierde al salir del destructor. Deberia ser "this->tablero = ..."

3- En la función Tablero::imprimir() tienes que usar la variable así: &tablero porque SDL_FillRect pide un puntero. Pero si haces lo que te dije en el punto 1, entonces tablero ya sería un puntero. Así, la última instrucción sería "return tablero".

Te peta porque el puntero tablero no apunta a nada válido (indefinido). Por lo que te he dicho en el punto 2.

No me extiendo más, espero que se entienda.
Ánimo, estás aprendiendo mucho.

Gabs86
05/10/2008, 11:42
lo del primer punto creo que antes lo tenía así... pero como no me funcionaba estuve haciendo mil cambios, y al final se me olvidó cambiarlo :P, el fallo que yo buscaba creo que es lo del punto dos, lo del punto tres también lo tenía presente, pero aún me lío muchísimo con los punteros, así que me lo has aclarado todo :D, muchas gracias! enseguida lo pruebo :D

< - >
una duda. Antes, cuando usaba C podía declarar y inicializar un rectángulo así SDL_Rect rectangulo={0,0,50,50}; y si por ejemplo a una función f le tenía que pasar un rectángulo podía pasarle {0,0,50,50} si tener el rectángulo creado, ahora, para crear un objeto al que se le pasas un rectángulo no puedo hacer eso, no? no se si me he explicado :P

hardyx
06/10/2008, 09:55
En C++ también puedes inicializar estructuras de la manera que dices, pero solo al inicializar. No puedes asignar luego valores ni pasar estructuras "literales", ni en C++ ni en C. Eso sólo es posible en Delphi.

La forma de hacerlo en C++ es así:
SDL_Rect rect = {0,0,50,50};
mi_funcion( &rect );

Si quieres cambiar los valores no podrías hacer esto:
rect = {1,2,3,4}; // error

Podrías usar un nuevo rect y copiarlo:
SDL_Rect rect2 = {1,2,3,4};
rect = rect2; // copia la estructura

O también podrías hacerte una función así:
asignar_rect(&rect, 1,2,3,4);