Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemilla Con Sdl

Iniciado por Leoheart, 19 de Diciembre de 2004, 11:21:19 AM

« anterior - próximo »

Leoheart

 Wenas, Toy empezando un poco a trastear con SDL y el otro dia me puso a crear una clase para crear una ventana en SDL.Lo unico que queria que hiciese es que me crease una ventana y ya esta. Tonce me puse manos a la obra e hice esta clase:


#include <stdio.h>
#include <stdlib.h>

#include <SDL/SDL.h>

class Ventana
{
private:
 
public:

bool inicializar();
       
};

bool Ventana::inicializar()
{
 SDL_Surface *ventana;
 if ( SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0 )
 {
   printf("No se puede incializar SDL: %s\n", SDL_GetError());
   exit(1);
   atexit(SDL_Quit);
 }
 
 ventana=SDL_SetVideoMode(800,600,32,SDL_HWSURFACE|SDL_DOUBLEBUF);
 if ( ventana == NULL )
 {
   printf("No se puede incializar la ventana: %s\n", SDL_GetError());
   exit(1);
 }
 int done=0;

 while(done == 0)
 {
   SDL_Event evento;

   while ( SDL_PollEvent(&evento) )
   {
     if ( evento.type == SDL_QUIT )  {  done = 1;  }

     if ( evento.type == SDL_KEYDOWN )
     {
       if ( evento.key.keysym.sym == SDLK_ESCAPE ) { done = 1; }
     }
   }
 
 
 return true;
   
}  


Y luego para poder usarla en el main.cpp, puse:


#include <stdio.h>
#include <stdlib.h>

#include <SDL/SDL.h>

#include "ventana.h"

Ventana *window;

int main(int argc, char *argv[])
{
 if (window.inicializar() == false){
     exit(1)
 }    
 return 0;

}



Me da error en el { despues del main:

11 C:\Documents and Settings\Leoheart\Escritorio\SDL\main.cpp syntax error before `{' token

Pero el error esta en ventana.h por que si no la incluyo me compila y me funciona.¡Que puede ser!!! :(
oding!

sés

 Te falta cerrar la llave del
while(done == 0)
{
Soy indeciso... ¿o no?

Leoheart

 Ya he cerrado el { pero ahora me dan dos errores!! :P  Me lo das cuando compruebo que la funcion incializar funciona:

C:\Documents and Settings\Leoheart\Escritorio\SDL\main.cpp In function `int SDL_main(int, char**)':

12 C:\Documents and Settings\Leoheart\Escritorio\SDL\main.cpp request for member `inicializar' in `window', which is of  non-aggregate type `Ventana*'

14 C:\Documents and Settings\Leoheart\Escritorio\SDL\main.cpp syntax error before `}' token

C:\Documents and Settings\Leoheart\Escritorio\SDL\Makefile.win [Build Error]  [main.o] Error 1

A ver si podeis hacer algo..
THANKS
oding!

Zaelsius

 Repasa tu C++  :rolleyes: , tienes que crear una nueva instancia de tu objeto ventana antes usarla(hacer un new), y luego usar el operador -> para acceder a los miembros.

O sea

Ventana* window = new Ventana;
window->inicializar();
..
...

sés

 Bueno, con un vistazo más detenido:

- Te falta un ";" después del exit(1) en main.
- Has declarado window como un puntero a Ventana. Declara window así: Ventana window;

Con esto te debería funcionar, lo he comprobado.
Soy indeciso... ¿o no?

Leoheart

 Muchas Gracias ya ta arreglao lo de la ventana
oding!

Leoheart

 Wenas , lo de la ventana ya ta arreglao, a continuacion e seguido creando cosillas, y keria hacer una funcion para cargar imagenes, y e escrito esto:

Citar
class Imagen
{
    public:
        bool cargar(int x, int y, SDL_Surface *superficie);
        bool borrar();
        bool mover();
    private:
        SDL_Surface *imagen;
       
};
bool Imagen::cargar(int x, int y, SDL_Surface *superficie)
{
if(imagen = SDL_LoadBMP("cuadrado.bmp"))
{
return false;
}
SDL_Rect destino;
destino.x = 0;
destino.y = 0;
SDL_BlitSurface(imagen, NULL, superficie, &destino);

return true;   
}
Y en el main e puesto
Citar
#include
#include

#include

#include "ventana.h"
#include "imagen.h"

int main(int argc, char *argv[])
{
  Ventana* window = new Ventana;
  Imagen* cuadrado = new Imagen;

  window->inicializar();
  cuadrado->cargar(100,100,window->ventana);
  return 0;

}
Me compila bien pero no hay forma de ke me carge la imagen
ayudadme plz!
oding!

nsL

 Por partes...
Yo cambiaria asi :

destino.x = x;
destino.y = y;
destino.h = imagen->h;
destino.w = imagen->w;


sino no estas dibujandolo en la posicion que tu quieres, sino en la (0,0) y el ancho y alto no lo fijabas, asi que si trae basura a saber .... Aunq creo que las variables locales se inicializan a 0, por eso quizas no se te vea la imagen.

Por otro lado al final del todo, antes del return 0 deberias hacer un SDL_Flip(window->ventana); por si usas doble buffer.


Por otro lado, y esto ya no es un error de codigo, sino una forma o habito de programacion:
Yo solo usaria funciones para devolver los atributos o el estado del objeto y dejaria los procedimientos (void) para modificar el objeto en si... pero weno, eso ya va por gustos :P

y si sigue sin ir, mira que el bmp este en el mismo directorio que el exe ;)

Saludos!  B)
Yo no muero hasta la muerte -

Leoheart

 Nada xico, e cambiado eso ke m has dixo diciendole lo de la altura y la anchura, y tambien lo de actualizar los buffers y no hya manera, y la imagen si ke esta n la carpeta! Menua merda
oding!

sés

 ¿No ves nada raro aquí?
if(imagen = SDL_LoadBMP("cuadrado.bmp"))
{
return false;
}
Soy indeciso... ¿o no?

Leoheart

 Lo he visto tantas veces, ke ya no veo na raro, ahi.No se que podrá ser...:(
oding!

StraT

 Retorna false si es correcta la carga, lo veo bastante curioso, deberias añadir un bonito "!"

Saludos
quot;Solo hay dos cosas infinitas, el universo y la estupidez humana, aunque de lo primero no estoy muy seguro\\\" Einstein

nsL

 cambiaria esto:

bool Imagen::cargar(int x, int y, SDL_Surface *superficie)
{
if(imagen = SDL_LoadBMP("cuadrado.bmp"))
{
return false;
}
SDL_Rect destino;
destino.x = 0;
destino.y = 0;
SDL_BlitSurface(imagen, NULL, superficie, &destino);

return true;    
}

por esto otro:

void Imagen::cargar(int x,int y,SDL_Surface *superficie)
{
   SDL_Rect destino;

   imagen = SDL_LoadBMP("cuadrado.bmp");
   if (imagen != NULL)
   {
        destino.x = x;
        destino.y = y;
        destino.h = imagen->h;
        destino.w = imagen->w;
        SDL_BlitSurface(imagen, NULL, superficie, &destino);
    }
}

Las variables locales que crees dentro de una funcion o metodo de una clase ponlas al principio del mismo, queda mas ordenado y mas legible para otra persona que lo lea :P

Saludos!  B)
Yo no muero hasta la muerte -

Leoheart

 Pese a los cambios que me recomendasteis , no he podido hacerlo funcionar :P . Eso si, he observado un fenomeno un tanto extraño, a lo mejor vosotros sabeis lo que le pasa, pero yo no tengo ni idea :D . Siguiendo en la linea de antes cuando compilo y ejecuto, me sale la ventanita en negro sin dibujar la imagen, pero cuando cierro la ventana, por un instante me sale la imagen , como un flash! O_O  La veo por instante :blink: , no se donde puede estar el error , no tengo ni idea.A ver si vosotros sabeis algo!

Un saludo!
oding!

nsL

 
int main(int argc, char *argv[])
{
 Ventana* window = new Ventana;
 Imagen* cuadrado = new Imagen;

 window->inicializar();
 cuadrado->cargar(100,100,window->ventana);
 return 0;

}

es que cargas la imagen y ya devuelves el valor de la funcion y se cierra el programa puesto q es la main...

En los juegos hay una cosa que se llama Game Loop, que viene a ser un bucle en el que se pinta la escena, se comprueban los controles , etc....
Prueba esto:

bool bLoop = false;
Ventana* window = new Ventana;
Imagen* cuadrado = new Imagen;
SDL_Event Evento;  // Si no viste los eventos aun es wen momento

window->inicializar();
cuadrado->cargar(100,100); // Modifica este metodo y que no haga el blit, solo cargue la surface en el puntero

while (bLoop == false)
{
   while (SDL_PollEvent(&Evento) ) // si hay algun evento esperando ser ejecutado entra por el while
    {  
       if (Evento.type==SDL_KEYDOWN) { bLoop=true;}  // Miramos q el evento sea una tecla presionada y de ser asi salimos del game loop
    }
   cuadrado->draw(window->ventana); // Dibujamos la imagen en la surface principal (create un metodo de este estilo) es decir, el blit.
   SDL_Flip(window->ventana); // Volcamos el buffer
}
SDL_FreeSurface(window->ventana); // Liberas recursos
delete(window); // Liberas
delete(cuadrado);  // Liberas
return 0;
}


A ver te explico un poko:
En cada iteracion del bucle se repinta la misma imagen en el mismo sitio. En el bucle controlamos que eventos ocurren (raton, teclado, etc..) y actuamos en consecuencia modificando ya sean los parametros x,y de la imagen o lo que tu quieras hacer, y al final del bucle, despues de todo pintamos en pantalla y vuelta a empezar....
Si por alguna casualidad quieres salir del bucle, creas un evento que te ponga el booleano a true y ya no vuelves a entrar...
Y acuerdate de liberar recursos siempre al final del programa, que sino pierdes memoria, ya que la memoria reservada durante la ejecucion del programa no se libera y los punteros se borran, con lo cual esa memoria es innacesible y se crean "lagunas de memoria". (esa memoria no la puede usar ningun programa mas, o eso tengo entendido :P)

El codigo puede que tenga fallos, que yo tb estoy algo verde en esto y encima no lo he probado, asi q compila y comprueba, pero la idea es esa.. :P
Espero haberte ayudado y si no te funciona pasate por aqui y vemos que pasa ;)

Saludos!  B)
Yo no muero hasta la muerte -






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.