Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: J_F_NASH en 11 de Mayo de 2004, 08:50:49 PM

Título: ¿por Qué No Me Muestra El Texto? (sdl)
Publicado por: J_F_NASH en 11 de Mayo de 2004, 08:50:49 PM
 Estoy con el libro "Programacin d videojuegos con SDL" en el apartado SDL_ttf.
El siguiente código debiera mostrar "hola mundo..." en pantalla pero no lo hace.
-El código no me da error de ningún momento.
-He copiado la fuente que habia en windows y la he metido en la carpeta de mi ejecutable
-He cambiado los colores por si acaso
-He revisado el código mil una vez... (bueno, un par)

No se, debería funcionar. ¿Qué estoy haciendo mal?


#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
#include "SDL_ttf.h"


int main(int argc, char *argv[])
{
SDL_Color bgcolor, fgcolor;
SDL_Rect rectangulo;
SDL_Surface *screen, *ttext;
TTF_Font *fuente;
const char texto[14] = "Hola Mundo...";
char msg[14];
SDL_Event event;
int done = 0;

//Inicializamos SDL
if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
 printf("No se pudo inicializar SDL: %s\n", SDL_GetError());
 return 1;
}
//Inicializamos modo de video
screen = SDL_SetVideoMode(640, 480, 24, SDL_HWSURFACE | SDL_DOUBLEBUF);
if(screen = NULL)
{
 printf("No se puede inicializar el modo de video: \n", SDL_GetError());
 return 1;
}
atexit(SDL_Quit);

//Inicializamos SDL_ttf
if(TTF_Init() < 0)
{
 printf("No se ha podido iniciar SDL_ttf: %s\n", SDL_GetError());
 return 1;
}
atexit(TTF_Quit);

//Carga la fuente de letra
fuente = TTF_OpenFont("ariblk.ttf", 20);

//Inicializa colores para el texto
fgcolor.r = 200;
fgcolor.g = 200;
fgcolor.b = 10;

bgcolor.r = 255;
bgcolor.g = 0;
bgcolor.b = 0;

sprintf(msg, "%s", texto);
ttext = TTF_RenderText_Shaded(fuente, msg, fgcolor, bgcolor);
rectangulo.y = 100;
rectangulo.x = 100;
rectangulo.w = ttext->w;
rectangulo.h = ttext->h;


//Usamos color rojo para las transparencias del fondo
SDL_SetColorKey(ttext,SDL_SRCCOLORKEY | SDL_RLEACCEL, SDL_MapRGB(ttext->format, 255, 0, 0));

//Volcamos la superficie a la pantalla
SDL_BlitSurface(ttext, NULL, screen, &rectangulo);

//Destruimos la fuente de letra
TTF_CloseFont(fuente);

//Liberamos la superficie
SDL_FreeSurface(ttext);

//Esperamos la pulsacion de una tecla
while(done ==0)
{
 while(SDL_PollEvent(&event))
 {
  if(event.type == SDL_KEYDOWN)
   done = 1;
 }

}
 return 0;
}



S2.
Título: ¿por Qué No Me Muestra El Texto? (sdl)
Publicado por: AlexHdez en 11 de Mayo de 2004, 09:15:15 PM
 SDL_Flip(screen);   :)  
Título: ¿por Qué No Me Muestra El Texto? (sdl)
Publicado por: J_F_NASH en 12 de Mayo de 2004, 08:02:48 AM
 
Cita de: "AlexHdez"SDL_Flip(screen);   :)
Bueno, he colocado esto entre las lineas:
SDL_BlitSurface(ttext, NULL, screen, &rectangulo);

TTF_CloseFont(fuente);


Y el tema es que ahora la ventana se ejecuta e inmediatamente se me cierra  (nooo) . He mirado en el archivo de error "stderr.txt" (que esta vez si aparece) y me dice lo que sigue:
"Fatal signal: Segmentation fault (SDL Parachute deployed)"
Ya me apareció este error en otras ocasiones. ¿Hay alguna lista de mensajes de error en SDL y lo que significan?

Gracias.



S2.
Título: ¿por Qué No Me Muestra El Texto? (sdl)
Publicado por: J_F_NASH en 12 de Mayo de 2004, 08:48:01 AM
 Ah! se me olvidaba. Ya que estoy ... ¿cómo le indico a SDL una ruta?. Por ejemplo, tengo la funcion:
IMG_Load("pericoDeLosPalotes.jpg");
Pero no se indicarle que esta imagen está en la ruta:
\imagenes\Pericos


S2.
Título: ¿por Qué No Me Muestra El Texto? (sdl)
Publicado por: sés en 12 de Mayo de 2004, 10:02:04 AM
 :blink: Eh... "c:\\kk\\pp\\algo\\loquesea.cualquiercosa"
Aunque yo prefiero: "c:/kk/pp/algo/loquesea.cualquiercosa"
Título: ¿por Qué No Me Muestra El Texto? (sdl)
Publicado por: AlexHdez en 12 de Mayo de 2004, 02:37:47 PM
 El tipo de error que te da parece de puntero invalido por lo que leo en google.

Un saludo
Título: ¿por Qué No Me Muestra El Texto? (sdl)
Publicado por: vicho en 12 de Mayo de 2004, 03:45:30 PM
 el tipo SDL parachute se da por cualquier error asi que mejor no tiremos palos de ciego

el flip screen deberia ir dentro de este ciclo y el poll event deberia ser una simple funcion no estar condicionada a un ciclo yo pondria algo asi


//Esperamos la pulsacion de una tecla
while(done ==0)
{
SDL_PollEvent(&event);
if(event.type == SDL_KEYDOWN)
 done = 1;

SDL_Flip(screen);
}
Título: ¿por Qué No Me Muestra El Texto? (sdl)
Publicado por: J_F_NASH en 12 de Mayo de 2004, 09:19:37 PM
 Nada, que no hay manera, he probado lo de meterlo en el ciclo y tampoco. Sinceramente, no lo entiendo  :blink:

Gracias sés por lo de las rutas.


S2.
Título: ¿por Qué No Me Muestra El Texto? (sdl)
Publicado por: AlexHdez en 12 de Mayo de 2004, 10:09:18 PM
 Yo estuve trasteando tb con la maldita libreria ttf y no me chuto ni bien ni mal. Yo tb tengo ese libro... Un saludo
Título: ¿por Qué No Me Muestra El Texto? (sdl)
Publicado por: [EX3] en 13 de Mayo de 2004, 01:50:10 AM
 No me hagas mucho caso por ke de SDL poco entiendo (y C++ no recuerdo bien la sintaxis) pero me imagino ke el manejo sera similar a DirectX.

(...)

Bool bInit; //Declaramos una variable boleana para controlar el bucle principal.

//Cargamos e inicializamos todo lo necesario.
(...)

bInit=True; //Si todo ha salido bien activamos la variable.

While(bInit == True) //Mientras bInit este a True repetir el ciclo.
{
//Esperamos la pulsacion de una tecla
SDL_PollEvent(&event);

if(event.type == SDL_KEYDOWN)
{
bInit=False;
}

//Volcamos la superficie a la pantalla
SDL_BlitSurface(ttext, NULL, screen, &rectangulo);

SDL_Flip(screen); //Mostramos las operaciones graficas en la pantalla.
}

//Destruimos la fuente de letra
TTF_CloseFont(fuente);

//Liberamos la superficie
SDL_FreeSurface(ttext);

(...)

Si no me ekivoco el fallo lo tenias en ke eliminabas la fuente de memoria y destruias la superficie donde dibujastes el texto dentro del bucle principal, asi pasaba ke cuando el bucle se volvia a repetir no dibujabas la superificie y aunque kisieras ya la habias eliminado, asi ke pienso ke deberia ser asi, pero a lo mejor me ekivoco.

Al menos asi funciona con DirectX, creas un bucle y en el realizas las llamadas de dibujo y demas, y la llamada de dibujar en la pantalla (SDL_Flip()).

Si alguien me puede decir ke tengo mal, ke de seguro he metido la pata con la sintaxis.
Espero haber acertado con la solucion  ;)

Salu2...