Hola gente, soy nuevo en el foro pero ya hace rato ya que vengo mirando los post, les comento mi problema, estoy modelando un menu para un juego con SDL, tengo un error q me esta volviendo loco, el codigo compila bien pero me tira un Segmentation Fault cuando lo ejecuto, encima no puedo usar el debug para ver donde se produce, espero puedan ayudarme, estoy usando Dev-C++ 4.9.9.2.
Tengo una clase Graficos q contiene las funciones de carga de imagenes e inicializacion de video, y una clase entorno q hereda a la clase Graficos, abajo les copio la implementacion:
Gracias por adelantado. Salu2
//GRAFICOS.H
#ifndef GRAFICOS_H
#define GRAFICOS_H
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_mixer.h>
class Graficos{
protected:
SDL_Surface* screen;
public:
SDL_Surface* cargarImagen(char *nombreArchivo);
void dibujarImagen(SDL_Surface *imagen, int x, int y);
void iniciarAudio();
int iniciarVideo();
void updateScreen();
void dibujarTablero();
void Flip();
};
using namespace std;
SDL_Surface* Graficos::cargarImagen(char *nombreArchivo)
{
SDL_Surface *image, *bmp;
image = IMG_Load(nombreArchivo);
if(!image) return 0;
Uint32 color_key =SDL_MapRGB(image->format, 0, 0, 0);
SDL_SetColorKey(image, SDL_SRCCOLORKEY|SDL_RLEACCEL, color_key);
bmp=SDL_DisplayFormat(image);
SDL_FreeSurface(image);
if(!bmp) return 0;
return bmp;
}
void Graficos::dibujarImagen(SDL_Surface *imagen, int x, int y)
{
SDL_Rect rect;
rect.x=x;
rect.y=y;
SDL_BlitSurface(imagen, 0, screen, &rect);
}
void Graficos::iniciarAudio()
{
int audio_rate = 22050;
Uint16 audio_format = AUDIO_S16; /* 16-bit stereo */
int audio_channels = 2;
int audio_buffers = 4096;
if(Mix_OpenAudio(22050, audio_format, audio_channels, audio_buffers))
{
printf("Unable to open audio!n");
exit(1);
}
}
void Graficos::updateScreen()
{
SDL_LockSurface(screen);
SDL_FillRect( screen, NULL, SDL_MapRGB(screen->format, 0,0,0) );
SDL_UnlockSurface(screen);
}
int Graficos::iniciarVideo()
{
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO)<0)
{
printf("Error al iniciar SDL:: %s",SDL_GetError());
return -1;
}
screen = SDL_SetVideoMode(800,600,32,SDL_HWSURFACE|SDL_RESIZABLE);
if (!screen)
{
printf("Error al iniciar el contexto SDL:: %s",SDL_GetError());
return -1;
}
}
void Graficos::Flip()
{
SDL_Flip(screen);
}
#endif
//ENTORNO.H
#ifndef ENTORNO_H
#define ENTORNO_H
#include "Graficos.h"
class Entorno : public Graficos{
public:
SDL_Surface* sqtitle0;
SDL_Surface* sqtitle1;
SDL_Surface* rtitle0;
SDL_Surface* rtitle1;
SDL_Surface* cant_jug0;
SDL_Surface* cant_jug1;
SDL_Surface* cant_jug2;
SDL_Surface* cant_jug3;
SDL_Surface* volv0;
SDL_Surface* volv1;
SDL_Surface* fondo;
public:
Entorno();
void dibujarTablero();
void gestionarMenu(char);
void gestionarEventos(SDL_Event &, char &);
};
Entorno::Entorno()
{
sqtitle0 = cargarImagen("C:/Imagenes TP/foursq_red.bmp");
sqtitle1 = cargarImagen("C:/Imagenes TP/foursq_yel.bmp");
rtitle0 = cargarImagen("C:/Imagenes TP/raya_red.bmp");
rtitle1 = cargarImagen("C:/Imagenes TP/raya_yel.bmp");
cant_jug0 = cargarImagen("C:/Imagenes TP/jugador_red.bmp");
cant_jug1 = cargarImagen("C:/Imagenes TP/jugador_yel.bmp");
cant_jug2 = cargarImagen("C:/Imagenes TP/jugadores_red.bmp");
cant_jug3 = cargarImagen("C:/Imagenes TP/jugadores_yel.bmp");
volv0 = cargarImagen("C:/Imagenes TP/volver_red.bmp");
volv1 = cargarImagen("C:/Imagenes TP/volver_yel.bmp");
fondo = cargarImagen("C:/Imagenes TP/menu_principal.bmp");
}
void Entorno::dibujarTablero()
{
SDL_Surface* casillero = cargarImagen("C:/foursq_min.jpg");
for (int i = 1; i<13; i++)
for (int j = 1; j<13; j++)
dibujarImagen(casillero, i*36, j*36);
}
void Entorno::gestionarMenu(char menu)
{
dibujarImagen(fondo, 200, 50);
switch (menu)
{
case '1':
int x,y;
SDL_GetMouseState(&x,&y);
if (((x>=320) && (y>=200)) && ((x<=460) && (y<=216)))
dibujarImagen(sqtitle1, 320, 200);
else
dibujarImagen(sqtitle0, 320, 200);
if (((x>=320) && (y>=300)) && ((x<=423) && (y<=313)))
dibujarImagen(rtitle1, 320, 300);
else
dibujarImagen(rtitle0, 320, 300);
break;
case '2':
int i,j;
SDL_GetMouseState(&i,&j);
if (((i>=320) && (j>=200)) && ((i<=431) && (j<=215)))
dibujarImagen(cant_jug1, 320, 200);
else
dibujarImagen(cant_jug0, 320, 200);
if (((i>=320) && (j>=300)) && ((i<=455) && (j<=315)))
dibujarImagen(cant_jug3, 320, 300);
else
dibujarImagen(cant_jug2, 320, 300);
if (((i>=50) && (j>=550)) && ((i<=124) && (j<=570)))
dibujarImagen(volv1, 50, 550);
else
dibujarImagen(volv0, 50, 550);
break;
};
}
#endif
//// M A I N . C P P
#include <cstdlib>
#include <iostream>
#include "JuegoCuad.h"
#include "JuegoRaya.h"
#include "Entorno.h"
using namespace std;
int main(int argc, char *argv[])
{
Entorno pantalla;
pantalla.iniciarVideo();
pantalla.iniciarAudio();
Mix_Music* music = Mix_LoadMUS("C:/son.wav");
SDL_Event event;
int ok = 1;
char menu = '1';
while (ok)
{
if(SDL_PollEvent(&event))
if (event.type==SDL_QUIT)
{
ok = 0;
}
SDL_PumpEvents();
pantalla.updateScreen();
pantalla.gestionarMenu(menu);
if (event.type==SDL_MOUSEBUTTONDOWN)
if(SDL_BUTTON_LEFT)
{
int x,y;
SDL_GetMouseState(&x,&y);
if (((x>=320) && (y>=200)) && ((x<=460) && (y<=216)))
{
//INICIAR CLASE FOUR SQUARE
Mix_PlayMusic(music, 0);
SDL_Delay(500);
menu = '2';
}
if (((x>=320) && (y>=300)) && ((x<=423) && (y<=313)))
{
//INICIAR CLASE 4 EN RAYA
Mix_PlayMusic(music, 0);
SDL_Delay(500);
menu = '2';
}
if (((x>=50) && (y>=550)) && ((x<=124) && (y<=570)))
{
//VOLVER // LIBERAR ESTRUCTURAS
Mix_PlayMusic(music, 0);
SDL_Delay(500);
menu = '1';
}
}
pantalla.Flip();
}
return 1;
}