Efecto máquina de escribir (typewriter)... ¿Cómo?

Started by Ryo Suzuki, September 09, 2015, 10:10:55 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Ryo Suzuki

Estoy tratando de hacer el típico efecto de mostrar el texto como que se está escribiendo que aparece en tantos juegos del género aventura gráfica, visual, novel, etc...

Ya sabéis, que el texto aparezca de manera rápida y fluida en pantalla como si se estuviera escribiendo, que el jugador pueda ir leyéndolo e incluso confirmando que ha acabado un párrafo luego con un botón, etc...

Sé que quizás puede parecer algo muy simple y debería ser relativamente fácil de hacer, pero hasta ahora no lo he conseguido :P

He probado de varias formas. La idea que se me ha ocurrido -tal vez haya otra mejor- es coger una cadena y luego hacer un bucle en el que se vaya escribiendo cada carácter de esa cadena y dando un pequeño tiempo de espera hasta escribir el siguiente... El problema que tengo es que si lo hago con una variable me repite las letras cada vez que hay un cambio y si lo hago sin variable me "borra" la letra anterior cada vez que la escribe.

Este es uno de los códigos que he intentando de montar (en este caso sin variable), para que os hagáis una idea:

global
    string cadena="Pidiendo ayuda en el foro y tal";
    string subcadena;
end

process Main()

private
byte desplaza=10;
byte incremento;
end

begin
     for (incremento=0; incremento<32; incremento=incremento+1)
     graph=write_in_map(0,substr (cadena,incremento,1),0);
     x=desplaza;
     y=100;
    desplaza=desplaza+8;
    frame(500);
    end

loop
frame;
end
end


Disculpad si es una burrada, pero soy nuevo en esto y hago lo que puedo, jeje.

El efecto se consigue, pero como comentaba, la letra anterior de la cadena se borra con cada interacción así que no acabo de conseguir lo que tengo en mente.

Gracias por echarme un cable!

panreyes

Holas Ryo,

Una preguntilla. ¿Utilizas write_in_map por algún motivo?
Yo te recomendaría hacerlo de otra forma, con write estándar.


for (i=0; i<len(cadena); i++)
  delete_text(id_texto);
  subcadena=""+subcadena+cadena[i];
  id_texto=write(0,200,100,0,subcadena);
  frame(500);
end

Ryo Suzuki

Qué rápido! Y me funcionó perfectamente!!

Muchas gracias!

Utilizaba write_in_map porque había probado mil cosas y dado mil vueltas (write_var, write_string, etc)

Voy a repasarme bien tu código porque si te soy sincero no lo acabo de entender del todo como lo haces ;D


P.D: Sería mucho pedir, pero necesitaría que escribiese x caracteres por linea y fuese capaz de no cortar palabras. Miedo me da!!

Yawin

Vas a tener que hacerte a mano el salto de línea. En realidad es sencillito, pero es engorroso:

Elijes dónde empiezas a escribir la línea y vas añadiendo letras a una string hasta que cuentas tantas letras como caben. entonces escribes la línea y cambias la y para pasar a la siguiente línea.

Te pego aquí una función que uso para mostrar un cuadro de texto estilo RPG con tres líneas. Espereo que te sea de ayuda y siento no explicarme mejor xD

function mostrarmensaje(int textid)
    private
        string texto,aux;
        int contvuelta=0;
        int eof=false,nchar,salida;
        string linea1,linea2,linea3;
    end
    begin
        file=fpgs[0];
        x=ancho_pantalla/2;
        y=alto_pantalla-82;
        z=1;
        graph=5;
        texto=buscar(textid,7);
        nchar=0;
         
        write_string(fnts[1],33,alto_pantalla-132,3,&linea1);
        write_string(fnts[1],33,alto_pantalla-88,3,&linea2);
        write_string(fnts[1],33,alto_pantalla-37,3,&linea3);
         
        aux="";
        repeat
            linea1=linea2=linea3="";
            salida=false;
            contvuelta=nchar;
             
            for(linea1=aux;nchar<len(texto) && !salida;nchar++)
                for(aux="";nchar<len(texto) && texto[nchar]!=" ";nchar++)
                    aux+=texto[nchar];
                end
                aux+=" ";
                 
                if(nchar<contvuelta+75)
                    linea1+=aux;
                    aux="";
                    frame;
                else
                    salida=true;
                end
            end
            if(nchar>=len(texto) && salida==false)
                aux="";
            end
            salida=false;
             
            for(linea2=aux;nchar<len(texto) && !salida;nchar++)
                for(aux="";nchar<len(texto) && texto[nchar]!=" ";nchar++)
                    aux+=texto[nchar];
                end
                aux+=" ";
                 
                if(nchar<contvuelta+150)
                    linea2+=aux;
                    aux="";
                    frame;
                else
                    salida=true;
                end
            end
            if(nchar>=len(texto) && salida==false)
                aux="";
            end
            salida=false;
             
             
            for(linea3=aux;nchar<len(texto) && !salida;nchar++)
                for(aux="";nchar<len(texto) && texto[nchar]!=" ";nchar++)
                    aux+=texto[nchar];
                end
                aux+=" ";
                 
                if(nchar<contvuelta+224)
                    linea3+=aux;
                    aux="";
                    frame;
                else
                    salida=true;
                end
            end
            if(nchar>=len(texto) && salida==false)
                aux="";
            end
             
            while(key(_seleccionar)) frame; end
            repeat
                frame;
            until(key(_seleccionar))
            while(key(_seleccionar)) frame; end
        until(nchar>=len(texto))
    OnExit
        delete_text(0);
    end
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Ryo Suzuki

Ahora veo que mi error principal quizás era que lo planteaba mal, mal enfoque. Quería imprimir un caracter de la cadena, luego el siguiente, el otro... etc; cuando en realidad lo que ha hecho PiXeL es imprimir un caracter, luego ese y el siguiente, luego tres, etc..

Eso parece muy pro Yawin! Gracias por el cable!

Lo estudio y a ver si puedo implementarlo de alguna forma, es otro punto de vista como dices, coger texto hasta formar una cadena de x caracteres y luego mostrarla en pantalla y hacer el salto de linea 3 veces con 3 cadenas distintas (es justo lo que necesitaba yo, tres lineas de texto)

Lo que no sé es como lo haréis para que la función sea "inteligente" y no corte palabras si no le cogen en esa linea y las ponga en la otra (supongo que detecta los espacios y cuanto mide cada palabra para saber si le entran en esa linea)...

Hasta lo que pueda parecer sencillo tiene su miga!!