Septiembre 08, 2010, 03:17:28 AM Ultima modificación: Septiembre 24, 2010, 01:29:55 AM por Ciberman
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:
[gml]
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();
[/gml]
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:
[gml]
///////// 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;
           }
       }
   }

[/gml]
draw_text_c2c_reset:
[gml]
///////// 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

[/gml]

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)
Cita de: CGM 2008CGM: 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/