Fecha y hora actual: Martes 02 Sep 2014 03:48
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Impresion de caracteres utilizando recortes de imagen [SDL]

Responder al Tema

Índice del Foro > Programación de juegos o videojuegos > Impresion de caracteres utilizando recortes de imagen [SDL]

Autor Mensaje
supermario64



Registrado: 21 Mar 2012
Mensajes: 7

Mensaje Publicado: Viernes 30 Mar 2012 15:43

Título del mensaje: Impresion de caracteres utilizando recortes de imagen [SDL]

Responder citando

Hola,tios soy nuevo en este foro
espero que puedan ayudarme.El problema
que tengo es que quiero mostrar en pantalla
caracteres (especialmente numeros), sin utilizar
SDL_TTF,osea que de una imagen que contenga todos
los caracteres, recorto el caracter y luego lo imprimo
en pantalla.la funcion que se encargaria de esto,
pediria una cadena de caracteres o variables int.Cuando
digo que especialmente numeros es por que la idea
principal es mostar el puntaje del juego en pantalla.

Agradesco a aquel que pueda ayudarme

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 2896
Ubicación: y*width+x

Mensaje Publicado: Viernes 30 Mar 2012 20:07

Título del mensaje: Re: Impresion de caracteres utilizando recortes de imagen [S

Responder citando

Usando SDL_TTF lo que debes hacer es convertir los datos numéricos en caracteres.
Código:
...
int numeros=123;

char cadenaNumerica[50];
   
sprintf(cadenaNumerica,"%d",numeros);
...


Ahora, si por capricho quieres hacerlo deberás usar un SDL_BlitSurface, osea un bitmap de SDL. El cual deberás recortar, como si cogieras unas tijeras y recortaras las letras de un periódico, pero previamente debes obtener las coordenadas precisas para hacerlo. En la formula para resolver eso puedes hacer lo siguiente. Crea una imagen que tenga de alto el alto en pixeles de la fuente que usarás, y de largo el ancho por 10, que corresponden a los números 0,1,2,3,4,5,6,7,8,9. Entonces para obtener el número, deberás parsear la cadena numérica, porque te será más fácil si la esos números los pasas a texto que tomarlos nativamente, y luego comprubas digito a digito y lo resuelves el recorte así:

Código:
        SDL_Rect recortaNumero;
        bitmapRect.x=numero*anchoNumero;
        bitmapRect.y=0;
        bitmapRect.w=(numero*anchoNumero)+anchoNumero;
        bitmapRect.h=SDL_BlitSurfaceDeLosNumeros->h;
...

y le aplicas el recorte... la función para recortar una imagen la puedes extraer de aquí:
Código:
...
SDL_Surface *crop(SDL_Surface *tobecropped, SDL_Rect *r){
   SDL_Surface *temp,*cropped;
   /* New surface of the cropped size */
   cropped=SDL_CreateRGBSurface(tobecropped->flags,r->w, r->h,
       tobecropped->format->BitsPerPixel,tobecropped->format->Rmask,tobecropped->format->Gmask,
       tobecropped->format->Bmask, tobecropped->format->Amask);

   /* Copy the cropped piece */
   SDL_BlitSurface(tobecropped,r,cropped,NULL);
   return cropped;
}
...


Referencia:
http://www.uam.es/personal_pdi/ciencias/fchamizo/infor/c/crop.c

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
supermario64



Registrado: 21 Mar 2012
Mensajes: 7

Mensaje Publicado: Sábado 31 Mar 2012 17:15

Título del mensaje: Re: Impresion de caracteres utilizando recortes de imagen [S

Responder citando

Olle pero yo intente hacerlo con SDL_ttf pero cuando dibujaba la variable en pantalla solo salia el valor inicial de la variable y se quedaba estatico y no variaba, osea, siempre se quedaba en cero.En cuanto al fragmento de codigo que pusiste intentare hacerlo haber que me sale ,pero prodrias decirme cuales son las causas de que la variable siempre quede en siempre en cero?.

Gracias¡¡¡ por tu respuesta

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 2896
Ubicación: y*width+x

Mensaje Publicado: Sábado 31 Mar 2012 19:07

Título del mensaje: Re: Impresion de caracteres utilizando recortes de imagen [S

Responder citando

Muestra el código que usas para pasar una variable entera a la función. Posiblemente te da cero porque no coincide con los tipos, por eso te indicaba al principio del comentario anterior que usaras sprintf(), que te genera el tipo necesario para trabajar con las funciones TTF.

Código:

// TTF_Init() must be called before using this function.
// Remember to call TTF_Quit() when done.
void drawText(SDL_Surface* screen,
char* string,
int size,
int x, int y,
int fR, int fG, int fB,
int bR, int bG, int bB)
{
TTF_Font* font = TTF_OpenFont("ARIAL.TTF", size);
SDL_Color foregroundColor = { fR, fG, fB };
SDL_Color backgroundColor = { bR, bG, bB };
SDL_Surface* textSurface = TTF_RenderText_Shaded(font, string,
foregroundColor, backgroundColor);
SDL_Rect textLocation = { x, y, 0, 0 };
SDL_BlitSurface(textSurface, NULL, screen, &textLocation);
SDL_FreeSurface(textSurface);
TTF_CloseFont(font);
}


Mas referencias utiles:
http://aaroncox.net/tutorials/2dtutorials/sdl_text.pdf
http://www.aprendeaprogramar.com/mod/resource/view.php?id=184

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
supermario64



Registrado: 21 Mar 2012
Mensajes: 7

Mensaje Publicado: Sábado 31 Mar 2012 22:18

Título del mensaje: Re: Impresion de caracteres utilizando recortes de imagen [S

Responder citando

Olle white itentare hacer lo que pones hay ,voy meterle cabeza a esto haber si me sale algo.pondre el codigo aqui si me resulta algo bueno. Gracias por tu respuesta.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
supermario64



Registrado: 21 Mar 2012
Mensajes: 7

Mensaje Publicado: Domingo 01 Abr 2012 00:11

Título del mensaje: Re: Impresion de caracteres utilizando recortes de imagen [S

Responder citando

Olle whiteskull hice lo que pille en tu codigo, todo esta bien,osea se hace la conversion bien y se imprime la variable int pero si te fijas yo hice que la variable que se convierte a char varie en cada interaccion (number=number+1) el valor inicial de "number" es : 4548 y cuando lo aumento solo aumenta una unidad (4549) entoces se supone que cuando varie la variable,tambien varie la impresion en la pantalla.Se que estoy cerca pero me pierdo. que esta mal?. Aqui te dejo el codigo para que lo pruebes y me digas que es lo que pasa porfavor.



Código:



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

SDL_Surface *screen;
SDL_Surface *text;
SDL_Rect text_rect;
SDL_Event event;
bool quit = false;
char title[]="Mostrar variables en pantalla";
TTF_Font *font = NULL;
SDL_Color colortxt = { 255, 255, 0 };

int number = 4548;
char char_number[6];

int main(int argc, char *argv[])
{
   number=number+1;
   SDL_Init( SDL_INIT_VIDEO );
   TTF_Init();
   SDL_WM_SetCaption( title, NULL );
   screen = SDL_SetVideoMode(640,480,24,SDL_HWSURFACE);
   sprintf(char_number,"%d",number);

   while( quit == false )
    {
      while( SDL_PollEvent( &event ) )
        {
         if( event.type == SDL_QUIT ){ quit = true; }
         if(event.key.keysym.sym == SDLK_ESCAPE ){ quit = true;}
      }
      
      
      font = TTF_OpenFont( "cour.ttf", 17 );
      text = TTF_RenderText_Solid( font, char_number , colortxt );
      text_rect.x = 10;
      text_rect.y = 10;
      text_rect.w = text->w;
      text_rect.h = text->h;
      SDL_BlitSurface(text, NULL, screen, &text_rect);
      SDL_FreeSurface(text);
      TTF_CloseFont(font);
      
      SDL_Flip(screen);
      
   }
   TTF_Quit();
   SDL_Quit ();

return 0;
}


Volver arriba
Ver perfil del usuario Enviar mensaje privado
Manuel González
Usuario Activo


Registrado: 05 Jun 2011
Mensajes: 429
Ubicación: Venezuela-Miranda

Mensaje Publicado: Martes 03 Abr 2012 03:32

Título del mensaje: Re: Impresion de caracteres utilizando recortes de imagen [S

Responder citando

Hola ! Bienvenido Guiño

Te comento varias cosas que ví en tu codigo...

SDL_Event es una union no una estructura, como sabras cuando es una union todos los miembros comparten la misma memoria por lo tanto no se debe acceder a el valor de un miembro sin antes comprobar que este contiene lo que uno quiere... o sino accederemos a una parte de la memoria que contiene un dato que no es el que uno quiere, incluso podemos solo coger una parte de esa informacion...

En fin... SDL_Event tiene (como casi todas las veces cuando es una union) un miembro llamado "type" que se utiliza para saber el tipo de evento que estamos tratando, para tu hacer esto:
Código:
if(event.key.keysym.sym == SDLK_ESCAPE ){ quit = true;}

necesitas primero verificar si el tipo de evento es del tipo "SDL_KEYDOWN" así,
Código:
if(event.type == SDL_KEYDOWN)(...)


las razones de porque verificar te las di antes Guiño

segundo, la actualizacion de tu variable "number" la haces al inicio de main, para tu actualizarla en cada ciclo necesitas colocarlo despues de el bucle "while"

la apertura de fuentes se hacen siempre antes de los ciclos, sino afectaria el rendimiento de tu aplicacion ya que internamente se llama a la funcion ""malloc" y como sabras eso lleva trabajo dependiendo de la pc, luego la cierras tambien en el mismo ciclo (eso es logico sino estarias dejando basura) eso tambien lleva trabajo...En resumen, te recomiendo que abras las fuentes,imagenes,inicies lo que tengas que iniciar, antes de los ciclos y cierres lo que tengas que cerrar despues de los ciclos =)

ahora despues que actualizas la variable "number" tienes que actualizar tu variable "char_number".

lo del tiempo...

Si tienes alguna otra duda comentala y te sabremos ayudar Guiño


“pero si estudias computación deberías saber usar todos los programas”
conclusion:Usuario no es gente.

mi blog Ordenador
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo Visitar sitio web del autor
supermario64



Registrado: 21 Mar 2012
Mensajes: 7

Mensaje Publicado: Sábado 07 Abr 2012 14:43

Título del mensaje: Re: Impresion de caracteres utilizando recortes de imagen [S

Responder citando

Olle pero lo que quisiera es que si pudieras darme un codigo de ejemplo ya que no tengo mucha experiencia haciendo juegos con SDL y quiero apreder esto, que es lo basico.Lo que quiero es mostrar el valor de la variable "number" en pantalla, cada vez que varie su valor, osea que constantemente se actualize su valor en pantalla.por favor si puedes podrias darme un codigo de ejemplo donde se muestre esto o podrias modificar el codigo que puse anteriormente.Te lo agradeceria mucho.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
supermario64



Registrado: 21 Mar 2012
Mensajes: 7

Mensaje Publicado: Martes 10 Abr 2012 22:54

Título del mensaje: Re: Impresion de caracteres utilizando recortes de imagen [S

Responder citando

oigan por fin descubri que es lo que pasaba.lo que pasaba era que tenia que poner la variable que le sumaba el valor dentro del bucle while para que se actualize en cada interracion.jjjejeje que estupido fui.bueno ya no los molestare mas gracias a todos ustedes por sus aportes.ahora porfin podre terminar mi juego.buscare la forma de ponerlo en el foro cuando lo tenga terminado.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 2896
Ubicación: y*width+x

Mensaje Publicado: Lunes 16 Abr 2012 16:12

Título del mensaje: Re: Impresion de caracteres utilizando recortes de imagen [S

Responder citando

Ok supermario Ok

Suele ocurrir eso a cualquiera, no te preocupes Risa

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Manuel González
Usuario Activo


Registrado: 05 Jun 2011
Mensajes: 429
Ubicación: Venezuela-Miranda

Mensaje Publicado: Martes 17 Abr 2012 04:31

Título del mensaje: Re: Impresion de caracteres utilizando recortes de imagen [S

Responder citando

Reir

hombre por otro lado yo en mi bomberman implemente unas funciones para imprimir por imagenes... claro la que esta en el foro no esta implementada por mi pero en una nueva version que tengo si y es mucho mas sencilla ya que se da por hecho que las letras ya estan ordenadas de tal forma que cada una ocupa un espacio constante... (ademas la nueva version ocupa menos memoria )

como ya resolvistes el problema en este momento no te sirva aunque si la quieres dime y te pego aqui el code y unas imagenes fuentes para que las pruebes Risa

no dudes en colocar otras dudas =) Ok Ok


“pero si estudias computación deberías saber usar todos los programas”
conclusion:Usuario no es gente.

mi blog Ordenador
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo Visitar sitio web del autor
Responder al Tema
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Problema Imagen de control deslizante para su p...

sigmund CMS 0 Miércoles 09 Abr 2014 19:42 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Como leer una imagen y guardar una imagen en mi...

Borge Java 1 Domingo 06 Abr 2014 22:36 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Curso iniciación a Videojuegos utilizando Cocos...

netonjm Programación de juegos o videojuegos 0 Jueves 20 Mar 2014 14:00 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Expresion regular para validar caracteres espec...

weirdmix JavaScript 4 Viernes 07 Mar 2014 01:58 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Pagina web tienda + impresion (¿Cómo?)

WhiteSkull PHP 5 Lunes 17 Feb 2014 14:44 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,