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!!! :(
Te falta cerrar la llave del
while(done == 0)
{
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
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();
..
...
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.
Muchas Gracias ya ta arreglao lo de la ventana
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!
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)
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
¿No ves nada raro aquí?
if(imagen = SDL_LoadBMP("cuadrado.bmp"))
{
return false;
}
Lo he visto tantas veces, ke ya no veo na raro, ahi.No se que podrá ser...:(
Retorna false si es correcta la carga, lo veo bastante curioso, deberias añadir un bonito "!"
Saludos
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)
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!
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)
He estado mirando el inicializar que has puesto al principio del post y deberias quitarle el polling de eventos, no viene al cuento :P y en general el bucle del "done"...
Inicializar lo que deberia es inicializar (:P) SDL y asiganar a un parametro la surface de pantalla (la principal vamos) y nada mas.. ni esperar a que pulsen teclas ni nada.
Primero inicializas todo , lo preparas y entras en el game loop.
Saludos! :P