Logo

¡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.
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.