PDA

Volledige versie bekijken : Buttons met MC & Dynamic Tekst


Krielkip
%Europe/Berlin %753 %2010, 18:05
Ey,

Ik zit met een klein probleempje. In dit flash actionscript 3 file wil ik 3 knopjes laden met daarop meegegeven tekst in actionscript.

MC is een grijsblokje met daarop een text (dynamisch met naam: antwoord_text)

De actionscript erachter is:
Game.as
// (knipje voor)
// Array voor de knoppen (3)
private var knoppen : Array;
private static const BUTTONS : int = 3;

private function startQuiz() : void {
start_btn.visible = false;

knoppen = new Array();
var knop : Vraagbutton;

for(var i : int = 0;i < BUTTONS;++i) {

if ( i == 0 ) {
knop = new Vraagbutton (120, 200);
}
else if ( i == 1 ) {
knop = new Vraagbutton (120, 400);
}
else {
knop = new Vraagbutton (120, 600);
}
knoppen.push(knop);
addChild(knop);
}
// rest knip
De knoppen worden geladen uit: Vraagbutton.as
package nl.avans.cmd.game {
import flash.display.MovieClip;
import flash.events.*;
import flash.text.TextField;

public class Vraagbutton extends MovieClip {

private var antwoord_text : TextField;
private var pressed : Boolean = false;

function Vraagbutton( x:Number, y: Number ):void {
this.buttonMode = true;
this.mouseChildren = false;
this.useHandCursor = true;
this.addEventListener(MouseEvent.ROLL_OVER, onRollOverHandler);
this.addEventListener(MouseEvent.MOUSE_UP, onReleaseHandler);
this.x = x;
this.y = y;
}
function onRollOverHandler(myEvent:MouseEvent) {
trace("onRollOver");
trace(pressed);
}
function onReleaseHandler(myEvent:MouseEvent) {
trace("onRelease");
trace(this.name);

this.pressed = true;
trace ( pressed );
}

public function ispressed () : Boolean {
return this.pressed;
}

public function unpress ( ) : void {
this.pressed = false;
}

}
}
Alleen krijg ik de volgende foutmelding:
ReferenceError: Error #1056: Cannot create property antwoord_text on nl.avans.cmd.game.Vraagbutton.
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
at nl.avans.cmd.game::Vraagbutton()
at nl.avans.cmd.game::Game/startQuiz()
at nl.avans.cmd.game::Game/onStart()Als ik het op static tekst zet. Dan is het oke, maar dan krijg ik geen tekst er op. (tekst er opladen en dan weer de knop vragen ofdat hij gedrukt is in Game.as wordt het volgende probleem :X)

Kan iemand mij helpen?
Alvast bedankt

PsK
%Europe/Berlin %971 %2010, 23:18
Als ik je verhaal goed begrijp heb je in je fla een knop met daarin een dynamic textfield met instance name antwoord_text. Je knop link je aan een externe class VraagButton. In je externe class declareer je nogmaals je een textfield met dezelfde naam antwoord_text.
Dat is het punt waar het fout gaat. Je probeert dan 2dezelfde objecten met dezelfde name te creëren. De reden waarom het goed gaat als je er een static textfield van maakt is omdat je er dan geen instancename aan hoeft te geven je dus geen duplicaat kan maken.
Een oplossing is om je antwoord_text in je externe class anders te noemen. Om toch invloed te kunnen uitoefenen aan je textfield in je fla kun je een getChildByName gebruiken en deze te casten naar een textfield.

antwoordText = getChildByName("antwoord_text") as Textfield;
De reden waarom je het object moet casten naar een Textfield is omdat je een displayObject terug krijgt van de getChildByName functie.

Een tipje. :)
Je loopje kan je korter en netter. Zoals je het nu hebt hoef je eigenlijk geen loopje te maken. En omdat je een MovieClip extend kan je deze properties met een setter zetten en hoef je ze niet mee te geven in de constructor.

for(var i:int = 0; i < BUTTONS; i++)
{
knop = new VraagButton();
knop.x = 120;
knop.y = (200*i)+200;
}

Succes met je quiz

Krielkip
%Europe/Berlin %516 %2010, 12:24
Dank je voor je reactie PsK.

Ik snap je verhaal wat je bedoeld met dubbele naam.
Ik heb jouw actie dus toegepast en dus op dit uitgekomen:
package nl.avans.cmd.game {
import flash.display.MovieClip;
import flash.events.*;
import flash.text.TextField;

public class Vraagbutton extends MovieClip {

private var pressed : Boolean = false;
private var antwoordText : TextField;

function Vraagbutton( x:Number, y: Number ):void {
this.buttonMode = true;
this.mouseChildren = false;
this.useHandCursor = true;
this.addEventListener(MouseEvent.ROLL_OVER, onRollOverHandler);
this.addEventListener(MouseEvent.MOUSE_UP, onReleaseHandler);
this.x = x;
this.y = y;
antwoordText = getChildByName("antwoord_text") as TextField;
}
function onRollOverHandler(myEvent:MouseEvent) {
trace("onRollOver");
trace(pressed);
}
function onReleaseHandler(myEvent:MouseEvent) {
trace("onRelease");
trace(this.name);

this.pressed = true;
trace ( pressed );
}

public function ispressed () : Boolean {
return this.pressed;
}

public function unpress ( ) : void {
this.pressed = false;
}

}
}



Echter hij geeft nog steeds de melding:
ReferenceError: Error #1056: Cannot create property antwoord_text on nl.avans.cmd.game.Vraagbutton.
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
at nl.avans.cmd.game::Vraagbutton()
at nl.avans.cmd.game::Game/startQuiz()
at nl.avans.cmd.game::Game/onStart()