Mover texto creado con write_in_map

Started by Outlaw, December 04, 2010, 02:51:01 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Outlaw

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!!!
"Life is cheap when the bounty is high"

DCelso

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

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

el move_text funciona bien... y tampoco lo veo en tu codigo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

: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]
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Outlaw

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





"Life is cheap when the bounty is high"

DCelso

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
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Outlaw

AAaaa nooo!!! Me abriste los ojos DCelso!! Que error mas bobo he tenido... Mil gracias por tu ayuda! karma++
"Life is cheap when the bounty is high"