AS3 dos efekt ispis slova s kursorom

pokusavam slozit multiline text koji bi se ispisivao slovo po slovo (kao da netko tipka), a da kursor prati zadnje slovo … uspio sam dobiti efekt kod jednolinijskog teksta, ali kad ima vise linija, kursor se drzi krajnjeg desnog ruba, ne prati slova u novoj liniji …

evo kod, a u attachu je .fla fajl

function type()
{
	var textArray:Array = new Array();
	var tekst:String = tekst_txt.text;
	var counter:Number = 0;
		
	textArray = [];
	textArray.length = 0;
	textArray = tekst.split("");
	//trace(textArray);
	
	var txtTimer:Timer = new Timer(30, textArray.length);
	
	tekst_txt.text = "";
	
	txtTimer.addEventListener(TimerEvent.TIMER, typeTekst);
	txtTimer.addEventListener(TimerEvent.TIMER_COMPLETE, stopTimer);
	txtTimer.start();
	
	function typeTekst(event:TimerEvent):void
	{
		simbol_mc.stop();
		//trace (textArray[counter]);
		if (textArray[counter] == ">")
		{
			tekst_txt.appendText("\n");
		}
		else
		{
			tekst_txt.appendText(textArray[counter]);
		}
		counter++;
		//trace(tekst_txt);
		simbol_mc.x = tekst_txt.textWidth+30;
		simbol_mc.y = tekst_txt.textHeight+5;
	}
	
	function stopTimer(event:TimerEvent):void
	{
		txtTimer.stop();
		simbol_mc.play();
	}
	

}

type();

evo rješenje

“getCharBoundaries” metoda daje podatke o koordinatama pojedinog slova

a podatak o poziciji svakog slova u “array-u” se krije iza “caretIndex” svojstva

… iako mi se pojavio zbunjujuci bug - ako za vrijeme ispisa (izvršenja koda) kliknem mišem bilo gdje na ispisani tekst, kursor (movie clip) se pozicionira tamo i ne miče se do samog kraja … hmmm

no, evo funkcionalnog koda za sada …

dodatak: kako je podatak o koordinatama svakog slova u array-u u slucaju sljedeceg reda teksta vraca kao “null” trebalo je ubacit jos jedan loop ne bil li koordinate kursora otisle u nerealni minus, tj. van stage-a

function type()
{
	var textArray:Array = new Array();
	var tekst:String = tekst_txt.text;
	var counter:Number = 0;
		
	textArray = [];
	textArray.length = 0;
	textArray = tekst.split("");
	//trace(textArray);
	
	var txtTimer:Timer = new Timer(30, textArray.length);
	
	tekst_txt.text = "";
	
	txtTimer.addEventListener(TimerEvent.TIMER, typeTekst);
	txtTimer.addEventListener(TimerEvent.TIMER_COMPLETE, stopTimer);
	txtTimer.start();
	
	function typeTekst(event:TimerEvent):void
	{
		simbol_mc.stop();
		//trace (textArray[counter]);
		if (textArray[counter] == ">")
		{
			tekst_txt.appendText("\n");
		}
		else
		{
			tekst_txt.appendText(textArray[counter]);
		}
		counter++;
		//trace(tekst_txt);
		
		var koord = String(tekst_txt.getCharBoundaries(tekst_txt.caretIndex-1));
		//trace(koord);
		var brojevi:RegExp = /(\d+)/;
		var koordDim:Array = koord.split(brojevi);
		//trace (koordDim);
		
		if (koordDim[0] == "null")
		{
		}
		else
		{		
		var xKoordSlova:Number = koordDim[1]
		var yKoordSlova:Number = koordDim[3]
		simbol_mc.x = xKoordSlova+20;
		simbol_mc.y = yKoordSlova+10;
		}
	}
	
	function stopTimer(event:TimerEvent):void
	{
		txtTimer.stop();
		simbol_mc.play();
	}
	

}

type();

evo rješenja …

izbacio sam korištenje “caretIndex”-a jel je i originalno zamisljeno da ocitava fokus, tj. sta je aktivno, u slucaju klika misem fokus se premjesta sa trenutnog ispisanog slova na mjesto gdje je kliknuto …a to nije dobro …

pa sam u glavni loop ispisivanja slova ubacio ocitavanje polozaja slova po trenutnom indexu po kojem se ispisuje unutar text fielda, mis nema utjecaja i stvar radi !:kuc:

a i malo sam optimiziro onaj slucaj kad je vrijednost array-a null da kursor ne pobjegne na krivo mjesto …

btw forum je super, samo nastavite tako !

var textArray:Array = new Array();
var tekst:String=tekst_txt.text;
var counter:Number=0;

textArray=[];
textArray.length=0;
textArray=tekst.split("");
//trace(textArray);

var txtTimer:Timer=new Timer(30,textArray.length);

tekst_txt.text="";

txtTimer.addEventListener(TimerEvent.TIMER, typeTekst);
txtTimer.addEventListener(TimerEvent.TIMER_COMPLETE, stopTimer);
txtTimer.start();

function typeTekst(event:TimerEvent):void 
{
	simbol_mc.stop();
	//trace (textArray[counter]);
	if (textArray[counter]==">")
	{
		tekst_txt.appendText("\n");
	}
	else 
	{
		tekst_txt.appendText(textArray[counter]);
		var koord=String(tekst_txt.getCharBoundaries(counter));
		var brojevi:RegExp=/(\d+)/;
		var koordDim:Array=koord.split(brojevi);
		if (koordDim[0]!="null") 
		{
			var xKoordSlova:Number=koordDim[1];
			var yKoordSlova:Number=koordDim[3];
			simbol_mc.x=xKoordSlova+20;
			simbol_mc.y=yKoordSlova+10;
		}		
	}
	counter++;
}

function stopTimer(event:TimerEvent):void 
{
	txtTimer.stop();
	simbol_mc.play();
}

Copyright © 2020 WM Forum - AboutContact - Sponsored by: Mydataknox & Webmaster.Ninja