Comment étendre un champ de texte déjà présent sur la scène en Flash (AS3)?
-
06-07-2019 - |
Question
Je cherche un moyen d'étendre un champ TextField déjà présent sur la scène en Flash (AS3). quelque chose comme ceci:
public class ChildTextField extends TextField
{
//code for childTextField comes here
}
J'ai placé un TextField avec le nom d'occurrence 'thetextfield' sur la scène. Maintenant, je voudrais dire à Flash que ce champ de texte est de type ChildTextField. Donc, dans ma classe de document, je déclare ce champ de texte en tant que ChildTextField:
public class DocumentClass extends Sprite()
{
public var thetextfield : ChildTextField;
}
Ceci renvoie une erreur de type coercition. Est-il possible de changer la classe utilisée pour un champ de texte dans l'IDE Flash, comme vous pouvez le faire avec les symboles de bibliothèque?
La solution
N'ayez pas peur. Vous devrez utiliser ActionScript si vous souhaitez ajouter votre classe de champ de texte étendu.
EDIT: il existe un moyen de bidouiller. source: http://board.flashkit.com/board/ archive / index.php / t-738887.html
En fait, j'ai rencontré cet exact problème avant. Dans mon cas, j'étais en essayant de créer un champ de texte avec comportements supplémentaires pour d'autres un autre artistes non codeurs à utiliser. Je dirai vous ma solution originale qui est tout as3, mais avait un défaut fatal, et mon solution actuelle, qui est un combinaison de as3 et jsfl.
La solution tout as3 est géniale sauf pour 2 choses: d'abord, ça se passe à runtime plutôt que le temps de construction. Cette signifie qu'il y a une petite mais réelle partie du temps où le film n'est pas correctement initialisé. Deuxièmement, il fait pas bien jouer s'il y a plusieurs images dans le film. L'idée de base est détecter les TextFields que vous voulez changer, construire des choses pour les remplacer avec, puis remplacez-les sur scène. Vous peut le faire avec soit en étendant TextField, ou construire une classe qui contient un TextField et gère le interface à elle. Disons que vous êtes faire le premier. Ajouter un constructeur à SmartTextField qui copie tous les les domaines qui vous intéressent:
public function SmartTextField(TextField tf)
{
this.text = tf.text; //continue with copy of anything relevant.
}
dans votre film principal ont un code qui détecte et remplace les TextFields vous voulez remplacer
var toreplace:Array = findTextFields();
var tf:TextField;
var stf:SmartTextField;
var where:int;
for (int i = 0; i < toreplace.length;i++)
{ tf = TextField(toreplace[i]);
stf = new SmartTextField(tf);
where = getChildIndex(tf);
addChildAt(stf,where);
removeChild(tf);
}
Cela fonctionne bien, sauf pour les points ci-dessus.
La solution JSFL est un peu trop complexe pour aller en détail, mais voici la les bases. Avoir une classe as3 qui enveloppe un champ de texte avec le nouveau comportement que vous vouloir. Ecrire un script jsfl qui itère sur les éléments sélectionnés, et si c'est un champ de texte, convertit en symbole avec une classe de base de votre nouveau classe d'emballage. Cela a les avantages qu'il se passe au moment de l'auteur, et des choses comme la position, instancename et d'autres choses est automatiquement conservé. Il a l'inconvénient que jsfl a beaucoup de petit ennuyeux bizarreries à résoudre.
edit: Bien sûr, s'il ne s'agit que d'un seul film, vous pouvez renoncer à la script convertisseur jsfl, et juste le faire par la main. convertir en symbole - > emballage classe de base.