Foros del Web » Programación para mayores de 30 ;) » C/C++ »

duda en ingreso de texto online con sdl

Estas en el tema de duda en ingreso de texto online con sdl en el foro de C/C++ en Foros del Web. hi gente tengo un codigo para ingresar texto desde pantalla con sdl y funciona bien. usa una cadena char msg. por favor cambien esto si ...
  #1 (permalink)  
Antiguo 17/11/2008, 15:35
 
Fecha de Ingreso: mayo-2007
Ubicación: Buenos aires
Mensajes: 19
Antigüedad: 17 años
Puntos: 0
duda en ingreso de texto online con sdl

hi gente tengo un codigo para ingresar texto desde pantalla con sdl
y funciona bien. usa una cadena char msg.
por favor cambien esto si usan otra fuente
//fuente = TTF_OpenFont("ariblk.ttf",15);

Código:
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>

int main(int argc, char *argv[])
{
    SDL_Surface *screen,*ttext;
	SDL_Event event;
	bool done = false;
	SDL_Color colorfuente={255,255,255};
	SDL_Rect rect={0,0,0,0};
	TTF_Font *fuente;
	char msg[64]="\0";
	
	atexit(SDL_Quit);
	atexit(TTF_Quit);

	// Iniciar SDL
	if (SDL_Init(SDL_INIT_VIDEO) < 0) {
		printf("No se pudo iniciar SDL: %s\n",SDL_GetError());
		exit(1);
	}

	// Activamos modo de video
	screen = SDL_SetVideoMode(800,600,24,SDL_HWSURFACE);
	if (screen == NULL) {
		printf("No se puede inicializar el modo gráfico: %s\n",SDL_GetError());
		exit(1);
	}
	
	if(TTF_Init() < 0){
        printf("No se pudo iniciar SDL_TTF: %s\n",SDL_GetError());
		exit(1);
	}
	
	fuente = TTF_OpenFont("ariblk.ttf",15);
	
	while(!done) {
        SDL_FillRect(screen,NULL,SDL_MapRGB(screen->format,0,0,0));
        if(msg[0]){
            ttext = TTF_RenderText_Solid(fuente,msg,colorfuente);
            rect.w=ttext->w;
            rect.h=ttext->h;
            SDL_BlitSurface(ttext,NULL,screen,&rect);
        }
        
		while(SDL_PollEvent(&event)){
    		switch(event.type)
    		{
                case SDL_KEYDOWN:
                    if(event.key.keysym.sym>='a'&&event.key.keysym.sym<='z'){
                        if(strlen(msg)<64-1)
                            msg[strlen(msg)]=event.key.keysym.sym;
                    }
                    break;
                case SDL_QUIT:
                    done=true;
            }
		}
		SDL_Flip(screen);
		SDL_Delay(30);
	}
	TTF_CloseFont(fuente);
	SDL_FreeSurface(ttext);

	return 0;
}
el problema es que yo quiero implementarla a mi juego pero en mi caso uso 1 struct con un campo cadena weno hago lo mismo pero me muestra basura por pantalla queria saber porque y si hay alguna forma de arreglarlo ya debo usar un struct

Código:
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
struct tp
{
  char cad[50];
};
int main(int argc, char *argv[])
{
  tp p;
    SDL_Surface *screen,*ttext;
	SDL_Event event;
	bool done = false;
	SDL_Color colorfuente={255,255,255};
	SDL_Rect rect={0,0,0,0};
	TTF_Font *fuente;

	atexit(SDL_Quit);
	atexit(TTF_Quit);

	// Iniciar SDL
	if (SDL_Init(SDL_INIT_VIDEO) < 0) {
		printf("No se pudo iniciar SDL: %s\n",SDL_GetError());
		exit(1);
	}

	// Activamos modo de video
	screen = SDL_SetVideoMode(800,600,24,SDL_HWSURFACE);
	if (screen == NULL) {
		printf("No se puede inicializar el modo gráfico: %s\n",SDL_GetError());
		exit(1);
	}

	if(TTF_Init() < 0){
        printf("No se pudo iniciar SDL_TTF: %s\n",SDL_GetError());
		exit(1);
	}

	fuente = TTF_OpenFont("times.ttf",15);

	while(!done) {
        SDL_FillRect(screen,NULL,SDL_MapRGB(screen->format,0,0,0));
        if(p.cad[0]){
            ttext = TTF_RenderText_Solid(fuente,p.cad,colorfuente);
            rect.w=ttext->w;
            rect.h=ttext->h;
            SDL_BlitSurface(ttext,NULL,screen,&rect);
        }

		while(SDL_PollEvent(&event)){
    		switch(event.type)
    		{
                case SDL_KEYDOWN:
                    if(event.key.keysym.sym>='a'&&event.key.keysym.sym<='z'){
                        if(strlen(p.cad)<64-1)
                            p.cad[strlen(p.cad)]=event.key.keysym.sym;
                    }
                    break;
                case SDL_QUIT:
                    done=true;
            }
		}
		SDL_Flip(screen);
		SDL_Delay(30);
	}
	TTF_CloseFont(fuente);
	SDL_FreeSurface(ttext);

	return 0;
}
  #2 (permalink)  
Antiguo 27/04/2009, 15:12
 
Fecha de Ingreso: diciembre-2008
Ubicación: Vigo, Spain
Mensajes: 141
Antigüedad: 15 años, 4 meses
Puntos: 12
Respuesta: duda en ingreso de texto online con sdl

Pues al usar la estructura directamente pasa lo de la basura, pero al usar un auxiliar de cadena, a mi me sirvio.

Código:
if ( event.type == SDL_KEYDOWN)  //recogemos datos
{
            //recogemos la tecla pulsada
if(event.key.keysym.sym>=65 && event.key.keysym.sym<=90 ||event.key.keysym.sym>=97 && event.key.keysym.sym<=122)
            {
	      aux[i] = event.key.keysym.sym;
	}
	sprintf(msg,"%s",aux);
	ttext = TTF_RenderText_Shaded(fuente,msg,fgcolor,bgcolor);
	SDL_BlitSurface(ttext,NULL,screen,&clip_rect);
	SDL_Flip(screen);
	i=i+1;
}
Luego lo que haces es pasar el aux al campo de la estructura.

Lo del clip_rect es porque declaro una posicion de pantalla que es la que se va a ir actualizando, para que a medida que se teclea se van poniendo en pantalla y no afecte al resto de la misma.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:30.