Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





¿por Qué No Me Muestra El Texto? (sdl)

Iniciado por J_F_NASH, 11 de Mayo de 2004, 08:50:49 PM

« anterior - próximo »

J_F_NASH

 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.

AlexHdez


J_F_NASH

 
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.

J_F_NASH

 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.

sés

 :blink: Eh... "c:\\kk\\pp\\algo\\loquesea.cualquiercosa"
Aunque yo prefiero: "c:/kk/pp/algo/loquesea.cualquiercosa"
Soy indeciso... ¿o no?

AlexHdez

 El tipo de error que te da parece de puntero invalido por lo que leo en google.

Un saludo

vicho

 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);
}

J_F_NASH

 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.

AlexHdez

 Yo estuve trasteando tb con la maldita libreria ttf y no me chuto ni bien ni mal. Yo tb tengo ese libro... Un saludo

[EX3]

 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...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






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.