Efecto typewriter (autotipeo)

ngPAWS (next generation Professional Adventure Writing System) es un sistema para crear aventuras de texto (también conocidas como ficción interactiva) que pueden jugarse en cualquier navegador actual (online u offline).

Moderador: Ejvg

Responder
teksait
Mensajes: 2
Registrado: 29 Mar 2024, 13:15

Efecto typewriter (autotipeo)

Mensaje por teksait »

¡Hola!

Comparto aquí el efecto typwriter que he conseguido para ngPaws. De momento lo tengo a lo bruto, usando flags propios para mi aventura y controlar el efecto... y machancado el runtime.js directamente. Sé que se puede hacer mucho mejor, sin tocar el core, sin usar flags de la aventura para ello, etc... pero de momento os comparto el código y ¡comentamos!

No he comentado el código, pero más o menos se puede entender...

La función writeText original:

Código: Seleccionar todo

function writeText(text, skipAutoComplete)
{
	if (typeof skipAutoComplete === 'undefined') skipAutoComplete = false;
	text = h_writeText(text); // hook
	$('.text').append(text);
	$('.text').scrollTop($('.text')[0].scrollHeight);
	addToTranscript(text);
	if (!skipAutoComplete) addToAutoComplete(text);
	focusInput();
}
El nuevo bloque JS para el efecto:

Código: Seleccionar todo

// Text Output functions
let isWriting = false;
let writeQueue = [];

function writeText(text, skipAutoComplete) {
	if (getFlag(67) == 1) { //Use Flag 67 (1,0) to use typewriter effect or not.
		return new Promise(resolve => {
			writeQueue.push({
				text,
				skipAutoComplete,
				resolve
			});

			if (!isWriting) {
				processQueue();
			}
		});
	} else {
		if (typeof skipAutoComplete === 'undefined') skipAutoComplete = false;
		text = h_writeText(text); // hook
		$('.text').append(text);
		$('.text').scrollTop($('.text')[0].scrollHeight);
		addToTranscript(text);
		if (!skipAutoComplete) addToAutoComplete(text);
		focusInput();
	}
}

function processQueue() {
	if (writeQueue.length > 0) {
		isWriting = true;
		$(".input").hide();
		const nextWrite = writeQueue.shift();
		typewriteText(nextWrite.text, nextWrite.skipAutoComplete)
			.then(() => {
				nextWrite.resolve();
				processQueue();
			});
	} else {
		isWriting = false;
		if (!inAnykey && !inPause){
			$(".input").show();
			document.getElementById('input').style.display='block';
			focusInput();
		}
	}
}

function typewriteText(text, skipAutoComplete) {
	return new Promise(resolve => {
		if (typeof skipAutoComplete === 'undefined') skipAutoComplete = false;
		text = h_writeText(text); // hook

		const newTextSpan = document.createElement('span');
		newTextSpan.className = 'typewriter-text';
		$('.text').append(newTextSpan);

		let currentCharacterIndex = 0;
		let currentHtml = '';

		function typeNextCharacter() {
			if (currentCharacterIndex < text.length) {
				$('.text').scrollTop($('.text')[0].scrollHeight);
				currentHtml += text.charAt(currentCharacterIndex);

				// Update the innerHTML with the current HTML, which includes parsed tags
				newTextSpan.innerHTML = currentHtml;

				currentCharacterIndex++;
				setTimeout(typeNextCharacter, 1); // Adjust typing speed here
			} else {
				// Typing finished, remove the typewriter class
				newTextSpan.classList.remove('typewriter-text');
				addToTranscript(text);
				if (!skipAutoComplete) addToAutoComplete(text);
				resolve(); // Resolve the promise to signal completion
			}
		}

		// Start typing the new content
		typeNextCharacter();
	});
}
Avatar de Usuario
tranqui69
Mensajes: 102
Registrado: 15 Abr 2023, 08:33
Contactar:

Re: Efecto typewriter (autotipeo)

Mensaje por tranqui69 »

Voy a estudiar esto a fondo porque me parece maravilloso. Yo traté de hacer algo similar y al final me di por vencido.



Incorporado con COPY-PASTE a lo loco en La Casi Original, tiene buena pinta.
En mi caso (MI CASO) tengo que hacer algunas modificaciones:
- Las descripciones no me convence que se muestren así, o, en su defecto, no deberían mostrarse así la segunda o posteriores veces que pasas por una localidad.
- Al usar códigos HTML en algunos de mis textos, el proceso se ralentiza, se podrían obviar los caracteres especiales (aquí es donde yo lo di por imposible)

Pero bueno, es un muy buen aporte que, si no para LAcO, seguro que para otro caerá.
Enhorabuena!
teksait
Mensajes: 2
Registrado: 29 Mar 2024, 13:15

Re: Efecto typewriter (autotipeo)

Mensaje por teksait »

Con este código chungo que he compartido, puedes decidir si usas el efecto o no con el flag67. Si lo pones a 1, hace el efecto, si lo pones a 0, funciona como habitualmente. :)
Avatar de Usuario
tranqui69
Mensajes: 102
Registrado: 15 Abr 2023, 08:33
Contactar:

Re: Efecto typewriter (autotipeo)

Mensaje por tranqui69 »

Cierto, de hecho, es lo que mejor me parece de todo el código (exagerando para enfatizar).
Yo en LAcO he creado un array con las localizaciones y varios valores que me interesan, entre ellos, hay uno que se llama "visitada".
De esta forma, si en
localidad[locno].visitada = 0 -> Empleo el typewritter porque es una nueva localidad.
localidad[locno].visitada != 0 -> Utilizo el sistema normal para describirla.

Lo dicho, tiene mucho potencial.
Uto
Mensajes: 15
Registrado: 16 Dic 2022, 10:36

Re: Efecto typewriter (autotipeo)

Mensaje por Uto »

El efecto es muy chulo, pero quería comentar algo: hace poco me puse a jugar a un juego de rol (PC) antiguo que me iba mostrando las misiones así. Lo abandoné, absolutamente insufrible tener que esperar a que salga el texto porque lees más rápido que escribe.

En definitiva, que no me parece mal como efecto, pero como jugabilidad mal. Al menos dejad que si se pulsa una tecla salga entero, o alguna opción de +/- velocidad.
Avatar de Usuario
tranqui69
Mensajes: 102
Registrado: 15 Abr 2023, 08:33
Contactar:

Re: Efecto typewriter (autotipeo)

Mensaje por tranqui69 »

Cierto. Yo en LaCo genero una pausa dependiendo del número de palabras que tiene un mensaje para que no se muestren de golpe.
La velocidad de "lectura" se puede programar con un valor de una bandera, así que sería posible hacer algo similar con el efecto de máquina de escribir. De todos modos, insisto en que, los mensajes mostrados no deberían volver a mostrarse así. Una y no más, santo Tomás.
Responder