Noticias

Se ha publicado un nuevo servicio, el Portal de Juegos Online

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: draw_text_c2c (caracter a caracter)  (Leído 1498 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Ciberman

  • Okupa
  • *
  • Puntos: 212
  • Mensajes: 1.221
  • Agradecido: 4 veces
  • Sexo: Masculino
  • Ciberman Games - Un pixel Marca la Diferencia
    • Ver Perfil
    • Ciberman
en: Septiembre 08, 2010, 03:17:28 am
Creador: Ciberman (Javier H. Mora)
Versión GM: GM8  :GM8: pero debe funkar en otras...
Descripción:
Quién no ha lidiado con el tema de tener que dibujar algun texto con draw text ext letra por letra y poder saber donde terminó de escrivir para poner alguna otra cosa luego... mh.. no, no me entendieron, voy de nuevo.... aplicaciones prácticas de este script:

-hacer un codigo de diálogo RPG letra a letra
-verificar la posicion en donde quedaría cualquier caracter que queramos (luego de ser dibujado)
-Controlar que nuestro texto no pase de X caracteres
-O de un heigth específico...
-dibujar solo la parte que nos interesa de largos textos..
-controlar cuando se está por dibujar un espacio (o cualquier otro caracter)

Uso:
para usar el scrip se llama igual que el draw text ext pero con un argumento extra opcional que es la posicion inicial desde la que dibuja...
OJO::: el script iniciará todo (si es que lo ejecutas por primera vez) y dibujará solo un caracter. por lo que deberas llamarlo en un bucle 50 veces si quieres dibujar 50 caracteres.
asi si quieres dibujar todo deberas hacer asi:
for(c=0;c<=string_length(string);c+=1;)
     {
     draw_text_c2c(25,25,string,-1,750)   // dibuja texto letra a letra
     }
draw_text_c2c_reset();
remplazando string y los argumentos por los tuyos...
osea, llamas a la funcion tantas veces como lo nesecites y cuando termines de escrivir tu texto llamas a la funcion draw_text_c2c_reset();


Scripts
Bien ... ahora me dejo de hablar y les presento al script

Script.. este es el usuario... usuario, este es el script:
draw_text_c2c:
///////// draw_text_c2c
// Creador: Ciberman (Javier H. Mora)
// No son necesarios los créditos, aunque se agradecen.
// --------------------------------------
// Uso: draw_text_c2c(x,y,string,sep,w[,posicion inicial]);

//este script se usa con draw_text_c2c_reset()


var xxx,yyy,str,pos,width,sep,ch,ww,hh,xx,yy,esp,posi;
xxx=argument0 // posicion inicial
yyy=argument1
str=argument2
sep=argument3 // sepracion de renglones (-1 default)
width=argument4

posi=max(1,argument5); //opcional, posicion inicial

if !(variable_global_exists("scrdrawtextext"))
     {
     global.scrdrawtextext[0]=xxx; //x final
     global.scrdrawtextext[1]=yyy; //y final
     global.scrdrawtextext[2]=posi;   //pos final
     global.scrdrawtextext[3]=0;   //espacio
     }
else
     {
     //if !(show_question(string(global.scrdrawtextext[0]))) {game_end();}
     if string(global.scrdrawtextext[0])="CiBeRmAn"
         {
         global.scrdrawtextext[0]=xxx; //x final
         global.scrdrawtextext[1]=yyy; //y final
         global.scrdrawtextext[2]=posi;   //pos final
         global.scrdrawtextext[3]=0;   //espacio
         }
     }

     
xx=global.scrdrawtextext[0]; //x final
yy=global.scrdrawtextext[1]; //y final
pos=global.scrdrawtextext[2]; //pos
esp=global.scrdrawtextext[3]; // espacio




ch=string_char_at(str,pos);
ww=string_width(ch);

if sep=-1 {hh=string_height(ch);}
else {hh=sep;}

if esp=1
     {
     var x_comp,ch_ext,i;
     ch_ext="";
     x_comp=xx;
     for(i=2;ch_ext!=" ";i+=1;)
         {
         ch_ext=string_char_at(str,pos+i);
         //if !(show_question(string(ch)+" - "+string(x_comp))) {break;}
         if ch_ext="#" or pos+i>=string_length(str)
             {break;}
         x_comp+=string_width(ch_ext);
         }
     
     if x_comp>xxx+width
         {
         draw_text(xxx,yy+hh,ch);
         global.scrdrawtextext[0]=xxx+ww;
         global.scrdrawtextext[1]=yy+hh;
         global.scrdrawtextext[3]=0;
         global.scrdrawtextext[2]=pos+1;
         return 2;
         }
     else
         {
         draw_text(xx,yy,ch);
         global.scrdrawtextext[0]=xx+ww;
         global.scrdrawtextext[1]=yy;
         global.scrdrawtextext[2]=pos+1;
         global.scrdrawtextext[3]=0;
         return 1;
         }
     }
else
     {
     if ch=" "
         {
         draw_text(xx,yy,ch);
         global.scrdrawtextext[0]=xx+ww;
         global.scrdrawtextext[1]=yy;
         global.scrdrawtextext[2]=pos+1;
         global.scrdrawtextext[3]=1;
         return 4;
         }
     else
         {
         if ch="#"
             {
             global.scrdrawtextext[0]=xxx;
             global.scrdrawtextext[1]=yy+hh;
             global.scrdrawtextext[2]=pos+1;
             global.scrdrawtextext[3]=0;
             return 3;
             }
         else
             {
             draw_text(xx,yy,ch);
             global.scrdrawtextext[0]=xx+ww;
             global.scrdrawtextext[1]=yy;
             global.scrdrawtextext[2]=pos+1;
             global.scrdrawtextext[3]=0;
             return 1;
             }
         }
     }

draw_text_c2c_reset:
///////// draw_text_c2c_reset
// Creador: Ciberman (Javier H. Mora)
// No son necesarios los créditos, aunque se agradecen.
// --------------------------------------
// Uso: draw_text_c2c_reset();

//este script se usa con draw_text_c2c(...)

global.scrdrawtextext[0]="CiBeRmAn"; //x final
global.scrdrawtextext[1]="CiBeRmAn"; //y final
global.scrdrawtextext[2]=1;   //pos final
global.scrdrawtextext[3]=0;   //espacio


Obtención de datos:
Ahora preguntaras, como se esas cosas que nombraste al comienzo del post..
muy facil.. cuando llamas por primera vez se crea un array que contiene la informacion para que analices en cada ciclo de tu bucle.

global.scrdrawtextext[0] = posicion X donde dibujará el próximo caracter (donde terminó de escrivir)

global.scrdrawtextext[1] = posicion Y de lo antedicho

global.scrdrawtextext[2] = numero de caracter que dibujará

global.scrdrawtextext[3] (true/false) = indica si en la anterior llamada al script se dibujó un caracter de espacio (" ")


ademas, si estos datos no te bastan el script debuelve:
return 1; si se dibujó un caracter normalmente
return 2; si se dibujó un caracter y se pasó de linea
return 3; si se pasó de linea porque se encontró un #
return 4; si el último caracter dibujado fue un espacio " "



Disfruten...

EDIT: subo un ejemplo: (Gm8)
« última modificación: Septiembre 24, 2010, 01:29:55 am por Ciberman »

Cita de: CGM 2008
CGM: Un poco mas serios, mejores Juegos.
Bienvenid@ a CGM. Recomenzamos desde cero, con un reglamento mas estricto, mejor definido y con mas ganas que nunca de hacer juegos con calidad comercial. El que avisa no es traidor: Leete las reglas si no quieres llevarte un capon makero.
Mercilessly!!
Plug-In para animaciones: http://ciberman.net/tweenline/
 
Los siguientes usuarios dieron las gracias a este tema: Furoppi games


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.