Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Outlaw on December 04, 2010, 02:51:01 AM

Title: Mover texto creado con write_in_map
Post by: Outlaw on December 04, 2010, 02:51:01 AM
Hola a todos, estoy tratando de averiguar como hacer para que un proceso que se encarga de mostrar texto en pantalla, sea tambien capaz (o con la ayuda de otro proceso) de poder mover ese texto por la pantalla, lo he intentado con move_text pero solo lo hace una vez, luego probe con escribirlo con write_in_map pero no lo puedo conseguir, aca esta el codigo:



Import "mod_string";
Import "mod_key";
Import "mod_text";
Import "mod_video";
Import "mod_proc";
Import "mod_scroll";

Global
Struct acum_txt[100];
string txt;      
End
string objetivos[]="2",
  "Prueba del primer str.............................................................................",
  "Esto es una prueba de la longitud de string que puede imprimir este proceso, si se puede hacer por renglones en vez de por cantidad de caracteres sería lo mejor,ahora viene la segunda parte, es decir, vamos a ver si puede seguir pegando una string cortada en renglones por debajo de la anterior";
End

Process Main()
Begin
Set_mode(800,600,32);
While (not(key(_esc)))
Imprime_objetivos(10,200,90,offset objetivos);
Frame;
End
End

// Este proceso imprime una tabla de varios elementos, sirve para imprimir los objetivos en el inventario
// Tiene tres dependencias: Struct acum_txt_objetivos[100] string objetivos[] y Recorta_string()
Process Imprime_objetivos(x,y,int long_renglon,string pointer lis_txt)
Private
int n;
int m=10;
int n_veces;
int p,b,acum,cant_renglones;
int pos_en_acum=0;
int id_txt[100];
int choto;
End                                
Begin
//ctype=c_scroll;
n_veces=itoa(Objetivos[0]);
from b=1 to n_veces;
acum=acum + len(lis_txt[b]);
End
cant_renglones=acum / long_renglon;
If ((acum mod long_renglon) <> 0)
 cant_renglones=cant_renglones+1;
End
from p=1 to n_veces;
Recorta_string(lis_txt[p],long_renglon,pos_en_acum);
If ((len(lis_txt[p])) < long_renglon)
pos_en_acum=pos_en_acum+1;
Else
pos_en_acum=(len(lis_txt[p])) / long_renglon;
End
end
From n=0 to (cant_renglones);
//id_txt[n]=Write_var(0,x,y+m,0,acum_txt[n].txt);
graph=Write_in_map(0,acum_txt[n].txt,0);
y=y+10;
//m+=10;
Frame;
End
While (exists(father))
If (key(_right)) x=x+5; End
Frame;
End
//From n=0 to (n_veces);
// Delete_text(id_txt[n]);
//End
End

Process Recorta_string(string cadena,int long_linea, int pos) // recorta la string que se la pasa en los pedazos que haga falta y la guarda en la struct "acum_txt" una por una
Private
int long_cadena;
string acum;
int pos_inicio_copia=0;
Begin
long_cadena=len(cadena);
While (pos_inicio_copia < long_cadena)                
acum=substr(cadena,pos_inicio_copia,long_linea); // aca long_linea es la cant que copia;          substr = strmid de g***x
acum_txt[pos].txt=acum;
pos++;
pos_inicio_copia+=long_linea;
End
End





Es decir, lo que quiero hacer es que una vez "impreso" el texto en pantalla, pueda el usuario moverlo para arriba o para abajo, por si se da el caso que el texto se sale de la pantalla, es decir poder "scrollearlo"...Gracias!!!
Title: Re: Mover texto creado con write_in_map
Post by: DCelso on December 04, 2010, 12:07:27 PM
A ver, no llego a entender del todo el código, pero parece que te complicas mucho para moverlo, si lo metes en un graph, lo único que tienes que mover es el graph. En el ejemplo de la wiki de bennu de write_in_map tienes como hacerlo moviendo el ratón, aqui te pego uno de como hacerlo con las teclas, intenta adaptar tu código a esto.


import "mod_video"
import "mod_key"
import "mod_draw"
import "mod_proc"
import "mod_map"
import "mod_grproc"
import "mod_text"

Global

End


process mi_texto(x,y,String texto)
private
begin
        Set_text_color(rgb(222,195,140));
graph = Write_in_map(0,texto,4);
while (!key(_esc) )
if (key(_up)) y--; end
if (key(_down)) y++; end
if (key(_left)) x--; end
if (key(_right)) x++; end
Frame;
end
unload_map(0,graph);
end

Begin
set_mode(640,480,32);
set_fps(25,0);

mi_texto(40,40,"hola");
    while (!key(_esc))
if (key(_f))
    full_screen = !full_screen;
end
        frame;
end
let_me_alone();
end

Title: Re: Mover texto creado con write_in_map
Post by: SplinterGU on December 04, 2010, 12:32:24 PM
el move_text funciona bien... y tampoco lo veo en tu codigo.
Title: Re: Mover texto creado con write_in_map
Post by: DCelso on December 04, 2010, 02:07:26 PM
:D, pues sí, más mejor, así te ahorras crear un proceso para el texto y puedes cambiar su contenido rápidamente y todo :D.

import "mod_video"
import "mod_key"
import "mod_draw"
import "mod_proc"
import "mod_map"
import "mod_grproc"
import "mod_text"

Global
     id_text;
     string cadena;
     pos_texto_x=40;
     pos_texto_y=40;
End


Begin
         
set_mode(640,480,32);
set_fps(25,0);
        cadena = "hola";

id_text = write_var(0,pos_texto_x,pos_texto_y,0,cadena);
    while (!key(_esc))
if (key(_f))
    full_screen = !full_screen;
set_mode(640,480,32);
end
                if (key(_up)) pos_texto_y--; move_text(id_text,pos_texto_x,pos_texto_y);end
if (key(_down)) pos_texto_y++; move_text(id_text,pos_texto_x,pos_texto_y);end
if (key(_left)) pos_texto_x--; move_text(id_text,pos_texto_x,pos_texto_y);end
if (key(_right)) pos_texto_x++; move_text(id_text,pos_texto_x,pos_texto_y);end
if (key(_h))
    cadena="hola";
end
if (key(_a))
    cadena="adios";
end
        frame;
end
        delete_text(id_text);
end

[/coe]
Title: Re: Mover texto creado con write_in_map
Post by: Outlaw on December 04, 2010, 07:52:33 PM
Dcelso Y Splinter: El proceso "Imprime_objetivos" sirve para imprimir en pantalla los objetivos del prota, que se van agregando a medida que adquiere "quests" o misiones a realizar. Estas misiones se guardan una por una, por orden de aparición, en la tabla de string "Objetivos" (global). Sucede que al momento de imprimir en pantalla, si el texto es muy largo se sale de pantalla, entonces uso una funcion que recorta esa cadena de texto, llamada convenientemente "Recorta_string" que utiliza la string a recortar, la corta en tantos pedazos segun sea el numero de caracteres que se desee que tenga por renglon, guarda todos los renglones o cadenas recortadas en la struct global "acum_txt". Desde esa variable, el proceso "Imprime_objetivos" se dedica a imprimir con un For, todas las cadenas recortadas, guardando a su vez sus id de texto para usar luego con Move_text. Gracias a uds. me di cuenta de unas cosillas, pude mover el texto, pero con errores, como por ej. que al moverlo, no se borra de su ubicación anterior, salvo cuando lo he realizado 3 veces consecutivas. Prueben el ejemplo que les adjunto, no usa recursos externos, asi que es compilar y ejecutar. Gracias por todo!



Import "mod_string";
Import "mod_key";
Import "mod_text";
Import "mod_video";
Import "mod_proc";
Import "mod_scroll";

Global
Struct acum_txt[100];
string txt;       
End
string objetivos[]="2",
   "Prueba del primer str.............................................................................",
   "Esto es una prueba de la longitud de string que puede imprimir este proceso, si se puede hacer por renglones en vez de por cantidad de caracteres sería lo mejor,ahora viene la segunda parte, es decir, vamos a ver si puede seguir pegando una string cortada en renglones por debajo de la anterior";
End

Process Main()
Begin
Set_mode(800,600,32);
While (not(key(_esc)))
Imprime_objetivos(10,200,90,offset objetivos);
Frame;
End
End

// Este proceso imprime una tabla de varios elementos, sirve para imprimir los objetivos en el inventario
// Tiene tres dependencias: Struct acum_txt_objetivos[100] string objetivos[] y Recorta_string()
Process Imprime_objetivos(x,y,int long_renglon,string pointer lis_txt)
Private
int n;
int m=10;
int n_veces;
int p,b,acum,cant_renglones;
int pos_en_acum=0;
int id_txt[100];
End                               
Begin
n_veces=itoa(Objetivos[0]);
from b=1 to n_veces;
acum=acum + len(lis_txt[b]);
End
cant_renglones=acum / long_renglon;
If ((acum mod long_renglon) <> 0)
  cant_renglones=cant_renglones+1;
End
from p=1 to n_veces;
Recorta_string(lis_txt[p],long_renglon,pos_en_acum);
If ((len(lis_txt[p])) < long_renglon)
pos_en_acum=pos_en_acum+1;
Else
pos_en_acum=(len(lis_txt[p])) / long_renglon;
End
end
From n=0 to cant_renglones;
id_txt[n]=Write(0,x,y+m,0,acum_txt[n].txt);
m+=10; // interlineado
Frame;
End
While (exists(father))
If (key(_right))
While (key(_right)) Frame; End;
From n=0 to cant_renglones;
Move_text(id_txt[n],x,y+m);
m+=10;
Frame;
End
End
Frame;
End
From n=0 to (n_veces);
Delete_text(id_txt[n]);
End
End

Process Recorta_string(string cadena,int long_linea, int pos) // recorta la string que se la pasa en los pedazos que haga falta y la guarda en la struct "acum_txt" una por una
Private
int long_cadena;
string acum;
int pos_inicio_copia=0;
Begin
long_cadena=len(cadena);
While (pos_inicio_copia < long_cadena)               
acum=substr(cadena,pos_inicio_copia,long_linea); // aca long_linea es la cant que copia; substr = strmid de g***x
acum_txt[pos].txt=acum;
pos++;
pos_inicio_copia+=long_linea;
End
End





Title: Re: Mover texto creado con write_in_map
Post by: DCelso on December 04, 2010, 08:10:39 PM
Va perfect, salvo por el fallacaco que tienes de poner en el bucle del main el Imprime_objetivos que hace que cree infinitos procesos de Imprime_objetivos. prueba esto:

Process Main()

Begin

Set_mode(800,600,32);

Imprime_objetivos(10,200,90,offset objetivos);

While (not(key(_esc)))

Frame;

End

End
Title: Re: Mover texto creado con write_in_map
Post by: Outlaw on December 04, 2010, 08:28:28 PM
AAaaa nooo!!! Me abriste los ojos DCelso!! Que error mas bobo he tenido... Mil gracias por tu ayuda! karma++