PDA

Volledige versie bekijken : Twee textfields +conflict


Solus
%Europe/Berlin %556 %2008, 13:21
Hallo allemaal,

Onderstaand is een stuk dat mij nu bijna er toe zet om m'n laptop uit het raam te gooien, hoop dat jullie kunnen helpen. (Met het probleem, niet de laptop uit het raam te gooien!)

Ik ben op het moment bezig met een flash game.

Links bovenin hou ik de score bij met een textField. Deze textfield heet "score" & wordt aangemaakt binnen een functie. Zie voorbeeld hier onder.

function score(){
if(isNaN(this._parent.hoofdkarakter.punten)){
this._parent.hoofdkarakter.punten = 0;
}
_root.createTextField("score", 10, 10, 10, 150, 150);
_root.score.multiline = true;
_root.score.wordWrap = true;
_root.score.autoSize = "left";
_root.score.textColor = 0xFFFFFF;
_root.score.html = true;
_root.score.border = false;
_root.score.htmlText = "<font size=\"16\"><b>Score: " + this._parent.hoofdkarakter.punten + "</b></font>";
}

Het tweede textField wordt aangemaakt via een verschillende AS bestanden. Er is een functie genaamd set_createTextField() die alle waardes vast stelt behalve de content er van.

Deze content wordt aangemaakt in het karakter waarmee het hoofdkarakter een conversatie mee zal hebben.(Uiteraard worden de waardes ge-include vanuit het externe bestand (globaal.as))

Dit maakte het makkelijker om voor overige karakters snel een conversatie systeem te bouwen.

Echter, zodra het conversatie textField genaamd "test_txt" wordt aangemaakt, verdwijnt mijn score. Terwijl er geen enkele verwijzing is naar het textField "score". Onderstaand de code die de conversatie aanmaakt.

// Maak een textfield aan.
this.set_createTextField( 10, this._parent.Xpositie, this._parent.Ypositie, this._parent.breedte, this._parent.hoogte ); // text-indent, breedte_lijn, hoogte_lijn, breedte, hoogte

// Definieer de tekst & verwijder deze na 4 seconden
this._parent.test_txt.htmlText = "<font size=\"16\"><b>Tekst tekst tekst.</b></font>";

// Tijd in (mili)seconden waarop de interval en timeout wacht om uitgevoerd te worden.
var tijd:Number = 4000;
// Functie om de aangemaakte tekst weer te verwijderen.
var createTextField:Number = _global['setTimeout'](this, "set_remove", tijd);

De set_createTextField ziet er als volgt uit:

// Maakt een nieuw Tekst veld aan met de waarden die uit de karakter of achtergrond.as bestand word opgegeven.
function set_createTextField( textindent, breedte_lijn, hoogte_lijn, breedte, hoogte )
{
var textindent; // Variabele voor de tekst indent.
var breedte_lijn; // Variabele voor de linker marge.
var hoogte_lijn; // Variabele voor de hoogte marge.
var breedte; // Variabele breedte aanmaken.
var hoogte; // Variabele hoogte aanmaken.

this._parent.createTextField("test_txt", textindent, breedte_lijn, hoogte_lijn, breedte, hoogte);
this._parent.test_txt.multiline = true;
this._parent.test_txt.wordWrap = true;
this._parent.test_txt.autoSize = "left";
this._parent.test_txt.textColor = 0xFFFFFF;
this._parent.test_txt.html = true;
this._parent.test_txt.border = false;
}


Het probleem is dus dat zodra de functie set_createTextField wordt aangeroepen, verdwijnt de textfield "score".

Als er meer informatie nodig is dan hoor ik 't wel. Alvast bedankt voor jullie aandacht.

Dauntless
%Europe/Berlin %574 %2008, 13:47
Het tweede argument van createTextField is de depth, niet de 'indent'. De depth is een nummer dat elk object op de stage meekrijgt en adhv dat nummer wordt bepaald welk element het meest naar boven ligt.

Waarschijnlijk gebruik je nu telkens dezelfde depth waardoor het vorige object dat daar stond overschreven wordt...

Gebruik bv 'this._parent.getNextHighestDepth()' om een correcte depth te krijgen.

Solus
%Europe/Berlin %576 %2008, 13:49
Dank je, dat was het inderdaad. Had niet verwacht dat de depth hierover kon zeuren aangezien het niet op dezelfde plaats stond. Naja, het werkt nu in ieder geval. Dus bedankt!

Jan
%Europe/Berlin %578 %2008, 13:52
_root.createTextField("score", 10, 10, 10, 150, 150);
Die eerste 10 is de depth van je textField. Op elke depth kan maar 1 object bestaan.
Kijk trouwens eens goed naar de jusite parameters van de method createTextField van de MovieClip class:createTextField (MovieClip.createTextField method)
public createTextField(instanceName:String, depth:Number, x:Number, y:Number, width:Number, height:Number) : TextField
//tweede parameter is de unieke depth

function set_createTextField( textindent, breedte_lijn, hoogte_lijn, breedte, hoogte )
{
this._parent.createTextField("test_txt", textindent, breedte_lijn, hoogte_lijn, breedte, hoogte);
}jij geeft als depth (want dat is de tweede parameter van createTextField) op: de textindent.

this.set_createTextField( 10, this._parent.Xpositie, this._parent.Ypositie, this._parent.breedte, this._parent.hoogte ); // text-indent, breedte_lijn, hoogte_lijn, breedte, hoogte
je geeft dus 10 mee als indent aan je eigen gemaakte functie set_createTextField en deze plaatst jouw indent 10 op de plaats waar ze hoort: de depth() die uniek moet zijn en wat had je op die depth al staan:
_root.createTextField("score", 10, 10, 10, 150, 150);
de eerste parameter na de instance naam is de depth().

Edit: te laat. no wonder... :(

Groeten,
Jan

Solus
%Europe/Berlin %580 %2008, 13:55
In ieder geval bedankt Jan.

Met indent bedoel ik ook depth uiteindelijk. Zo gaf de help file het in ieder geval aan.