Forums Développement Multimédia

Aller au contenu

le debut de ma class txtManager commence mal :§

class text langue CODE Actionscript

30 réponses à ce sujet

#1 nocraft

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 31 December 2012 - 11:18 AM

hello et pour tous et pour bientot une joyeux anneée 2013 :P

je me suis enfin lancer dans le system de class, pour ne pas tous avoir en vrac dans un seul code... mais bon ca commence mal :§

je cree une class qui sera un systeme de changement de langue charger via differrent xml

j'ai cree une sorte de shema;

txtManager.class
-------------------------
* array _text
-> fr,nl,en
* sprite _contentLang

=>fct eventmouse over / out
+ click
-> fais appel a la class changeLang

changeLang.class
--------------------------
*movieclip _allText
-> contiendra a chaque fois tous les textfields
*urlloader (xml)
-> charge le xml en fonction du e.target clic ( si clic sur fr charge le xml dans le dossier fr )

=>fct changeLang
-> charge la fonction effetText avec tween qui cache le txt
=>fct effetText
-> tween qui affiche le txt chargé par le xml

j'espere que ca serai asser clair

dans un fla (as3) ,' appel ma class

import com.text.txtManager;
var conteneur:Sprite = new Sprite();
conteneur.x = 200;
var textManager:txtManager = new txtManager();
conteneur.addChild ( textManager );
addChild ( conteneur );
 

voila pour ma class txtManager.class ( ici tous fonctionne , sauf appel a la class changeLang via le clic)

package com.text
{
import flash.display.Sprite;
import flash.display.Shape;
import flash.text.TextField ;
import flash.text.TextFormat ;
import flash.text.TextFormatAlign ;
import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.MouseEvent;
import com.text.txtManager.changeLang;

public class txtManager extends Sprite
{
  private var _contentLang = Sprite;
  public var _selectLang = Sprite;
  private var _text = Array;
  private var _textFormat = TextFormat;
  private var _textField = TextField;
  public var changeLang = changeLang;

  public function txtManager()
  {
   _text = new Array('fr', 'nl', 'en')
       
   for (var i:int = 0; i < _text.length; i++)
   {  
        _textField = new TextField()
        _textFormat = new TextFormat("verdana", 11)
        _textFormat.align = TextFormatAlign.CENTER;
 
        _contentLang = new Sprite();
        _contentLang.buttonMode = true;
        _contentLang.mouseChildren = false;
 
        _contentLang.addChild(_textField);
 
         _contentLang.x = (20*i-30)+45;
         _contentLang.y = 15;
 
         _textField.border = true;
         _textField.borderColor = 0x2B6DA4;
         _textField.width = 20;
         _textField.height = 20;
         _textField.selectable = false;
         _textField.defaultTextFormat = _textFormat;
         _textField.x= -10;
         _textField.y= -10;
       
         _textField.text = _text[i];
         
         _contentLang.name = _text[i];
 
       
         _contentLang.addEventListener(MouseEvent.MOUSE_OVER,overLang);
         _contentLang.addEventListener(MouseEvent.MOUSE_OUT,outLang);
         _contentLang.addEventListener(MouseEvent.CLICK,clicLang);
 
        //_text.pop();
 
        addChild(_contentLang);
   }  
  }

  private function overLang(e:MouseEvent):void
  {
   var myTweenMW2:Tween = new Tween(e.currentTarget, "width", Strong.easeOut, e.currentTarget.width, 25, .7, true);
   var myTweenMH2:Tween = new Tween(e.currentTarget, "height", Strong.easeOut, e.currentTarget.height, 25, .7, true);
  }

       
  private function outLang(e:MouseEvent):void
  {
   var myTweenMW2:Tween = new Tween(e.currentTarget, "width", Strong.easeOut, e.currentTarget.width, 20, .7, true);
   var myTweenMH2:Tween = new Tween(e.currentTarget, "height", Strong.easeOut, e.currentTarget.height, 20, .7, true);
  }

  private function clicLang(e:MouseEvent):void
  {
   // ancient invisible devient visible
   var myTweenSL:Tween = new Tween(_selectLang, "alpha", Strong.easeOut, 0, 1, 1, true);
   _selectLang.visible = true;
   // quand clique devient invisible et charge le texte dans la lang selectionner
         _selectLang = e.target as Sprite;
 
   _selectLang.addEventListener(Event.ENTER_FRAME, removeLang);
 
   // on appele la class et ca focntione changeLange ( qui change le xml )
   _selectLang.addEventListener(Event.ENTER_FRAME,changeLang);
  }

  private function removeLang(e:Event):void {
   var myTweenSL2:Tween = new Tween(_selectLang, "alpha", Strong.easeOut, 1, 0, 1, true);
   _selectLang.visible = false;
  }
}
}
 

et ici changeLang.class

package com.text.txtManager
{
import com.text.txtManager;
import flash.events.Event;
import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;
        import flash.net.URLLoader;
        import flash.net.URLRequest;
import flash.display.MovieClip;
public class changeLang extends Event
{

  private var _urlLoader:URLLoader=new URLLoader();
  private var _allText:MovieClip = new MovieClip();  public function changeLang()
  {
   _selectLang.removeEventListener(Event.ENTER_FRAME,changeLang);
   var myTweenA:Tween = new Tween(_allText, "alpha", Strong.easeOut, 1, 0, 1, true);
   myTweenA.addEventListener(TweenEvent.MOTION_FINISH, effetText);
   _allText.addEventListener(Event.COMPLETE, effetText);
 
   trace("1er trace = "+_selectLang.name);
  }
  private function effetText(e:Event):void{
   var myTweenA2:Tween = new Tween(_allText, "alpha", Strong.easeOut, 0, 1, 1, true);
   _urlLoader.load(new URLRequest("text/" + _selectLang.name + "/origine.xml"));
 
   trace("2eme trace = "+_selectLang.name);
  }

}}
 

et malheureusement j'obtient quand je clic sur n'import quel contentLang


TypeError: Error #2007: Parameter listener must be non-null.
at flash.events::EventDispatcher/addEventListener()
at com.text::txtManager/clicLang()

j'ai fais des recherches je suis tomber sur des probleme similaire mais je ne comprend pas vraiment :§

quelqu'un saurais t'il m'eclairer svp ! ? merci d'avance
les débuts en as3 sont vraiment perieux :( et perturbant

ps: un appercu de se que je voudrai realiser , ps ici tous le code est en vrac dans un fichier fla)



#2 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 31 December 2012 - 13:16 PM

Bonjour nocraft.

Je n'ai pas le temps d'entrer dans le code… mais je préfère réagir à ceci :

Citation

les débuts en as3 sont vraiment perieux :( et perturbant


sans doute parce que tu veux aller trop vite :
1 - dans le niveau de difficulté de tes projets
2 - dans leur réalisation

1 : parce que l'on apprends mieux sur des petits projets, voir même sur des tutos pour débutants qui montrent autant la bonne façon de s'y prendre que le bon vocabulaire
2 : parce que le plus important c'est la partie réflexion, qui doit être bien marquée avant la réalisation (l'écriture du code)

Au final, ça "doit" (ou devrait) être simple.

Pour moi, un gestionnaire de langue, c'est un traducteur. Donc un objet abstrait (non affiché) qui va savoir renvoyer la bonne traduction à chaque personne qui le demande. Si je veux que mon traducteur parle Anglais, je lui passe un dico d'anglais. Si je veux qu'il parle français, je lui passe un dico français…

Sur cette base, on peut faire ceci :
J'ai commenté autant que j'ai pu selon le temps de dispo, j'espère que ça pourra t'aider à séparer ton problème en plusieurs plus petits que tu sauras résoudre plus facilement.

Bon réveillon. :)

Fichier(s) joint(s)



#3 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 31 December 2012 - 13:50 PM

Salut,

Dans ton fonction clicLang, il te dit que _selectLang ne doit pas être null. Le soucis vient de cette ligne : _selectLang = e.target as Sprite; => e.target n'est pas de type Sprite ou descendant, donc sa valeur est null.

Aussi, si tu veux utiliser les possibilités du FlashPlayer, regarde du côté de la classe Capabilities et sa methode "lang" qui te renvoie la langue de l'utilisateur :),

Aussi fait attention, c'est pas forcément important si les classes sont uniquement pour toi, mais si tu veux les partager, les reprendre plus tard, les conventions de nommage sont très appréciées. => Le nom d'une classe commence par une Majuscule par exemple ( txtManager (A) ).

et enfin, je crois que tu confonds deux syntaxes totalement différentes, qui sont les bases de la POO dans n'importe quel langage, à savoir la définition, et l'instanciation :


private var _contentLang = Sprite;
  public var _selectLang = Sprite;
  private var _text = Array;
  private var _textFormat = TextFormat;
  private var _textField = TextField;
  public var changeLang = changeLang;
 

Je sais pas si c'est uniquement moi que ça choque, mais l'AS3 est un langage fortement typé, la bonne syntaxe est :

private var [NOM_VAR] : [TYPE] = new [TYPE]( [PARAMS] ) ( tout ce qui est entre [] est à remplacé à ta guise ;) )

Ce qui est avant le = est la déclaration de la variable. Ce qui est après est l'instanciation de celle-ci, sa naissance.
Word hard, play hard.

#4 nocraft

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 31 December 2012 - 16:30 PM

dIdIer,

oui sans doute, j avoue p e vouloir aller trop vite :§ pourtant les petit tuto et autres j'en ai tester pas mal ... mais j'ai remarquer que j'ai surtous un grand probleme de logique pour mes realisations :(

j'ai osculter ton system de langue via dico
je comprend le principe, mais c'est une autre methode de fonctionement avec la class 'Dictionary'
et moi je voulais faire mes changement via un xml (permetant la modification extern)

mais ici dans ma logique est se que mon principe semble etre bon ?

galacta

Citation

Dans ton fonction clicLang, il te dit que _selectLang ne doit pas être null. Le soucis vient de cette ligne : _selectLang =e.target as Sprite; => e.target n'est pas de type Sprite ou descendant, donc sa valeur est null.
tu me conseil de faire quoi ?
_selectLang =e.target as _contentLang;
(puisque ma var _contentLang est un sprite ?)

mais j'obtient une nouvelle erreur
TypeError: Error #1041: The right-hand side of operator must be a class.
at com.text::txtManager/clicLang()

sinon j'ai regarder autour Capabilities.languages effectivement ca pourais etre sympas de rajouter un detections du languages et de l'assigner automatiquement a _selectLang;
(mais je pencherai sur ceci plutard)

et effectivemetn comme tu dis j'ai mal commencer , car deja les conventions de nommage sur mes class ne sont pas bonne (MAJ pour chaque class ,je modifie ca)

Citation

Je sais pas si c'est uniquement moi que ça choque, mais l'AS3 est un langage fortement typé, la bonne syntaxe est :

private var [NOM_VAR] : [TYPE] = new [TYPE]( [PARAMS] ) ( tout ce qui est entre [] est à remplacé à ta guise ;) )


Ce qui est avant le = est la déclaration de la variable. Ce qui est après est l'instanciation de celle-ci, sa naissance.

oui je sais pas pourquoi je l'ai fais comme ceci dans txtManager alors que dans changeLang ,j'ai la bonne syntaxe ?

private var _urlLoader : URLLoader = new URLLoader();

merci encore pour la rapiditer , et les conseils
Bon réveillon.^^

#5 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 31 December 2012 - 17:12 PM

Voir le messagenocraft, le 31 December 2012 - 16:30 PM, dit :

je comprend le principe, mais c'est une autre methode de fonctionement avec la class 'Dictionary'
et moi je voulais faire mes changement via un xml (permetant la modification externe)
C'est un peu ça, ta difficulté à mon avis.
xml :> un format de données pour échanger
dictionary :> un format pour lier des donner

Ce sont des formats, des types, que l'on utilise selon le besoin.
Moi, je préfère regarder le besoin, et je choisis le type qui me semble le plus simple.
Et si possible, je gère un seul besoin par classe. Ou au moins, je crée une fonction spécifique au besoin.

Besoin de changer la langue :> un Traducteur
Besoin d'animer :> un Tween
Besoin d'échanger avec l'exterieur : un xml
Besoin de charger un élément externe : un loader

Effectivement, en suivant cette logique, tu aurais :
XML> pour stocker ta traduction à l'extérieur
Loader> chargement du xml
[…]
Traduction> besoin d'un dictionary

Entre les 2, le […], tu peux le voir comme un problème,
ou alors comme un besoin… besoin de transformer un xml en dictionary.
Tu peux créer une classe pour ça, ou simplement une fonction*…

C'est en décomposant mes gros problèmes en plusieurs petits que j'arrive a faire des ensemble complexes à partir de fragments simples.
L'avantage, c'est que les petits fragment simples, j'en voit le bout rapidement, je peux les tester proprement, et je pourrai les réutiliser plus tard dans d'autres projets… Bref, je me laisse moins envahir par la grandeur du projet complet.


(* en y réflechissant vite fait, je crois que je ferais une classe étendant Dictionary, qui chargerait un xml, le balayerait une fois chargé pour associer les phrases et les références.)

#6 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 01 January 2013 - 16:08 PM

Personnellement j'utilise un système proche de celui de Didier, c'est une classe ( Singleton, mais c'est pour plus tard :) ) avec un dictionnaire, dans lequel je stocke les identifiants de mes phrases chargées via un XML =>

Par exemple :


<Lang>
   <text id="welcome">Bienvenu</text>
   <text id="hello">Bonjour</text>
   ...etc
</Lang>
dans mon fichier strings_fr.xml
<Lang>
   <text id="welcome">Welcome</text>
   <text id="hello">Hello</text>
   ...etc
</Lang>
et dans le fichier strings_en.xml
 

Ainsi, en utilisant la classe "Capabilities" je suis en mesure de déterminer la langue pour le système d'exploitation du client (au sens PC) et charger le bon XML dans ma classe.

Si la langue est le Français, le dictionnaire contiendra
Le dictionnaire contiendra ["welcome"] = "Bienvenue" et ["hello"] = "Bonjour"

Je n'ai plus qu'à avoir une fonction avec un paramètre qui est l'identifiant de la phrase que je souhaite, et si cet identifiant est connu du dictionnaire, alors il me renvoie la phrase dans la bonne langue, chargée via XML, dynamiquement en fonction de la langue de l'utilisateur comme je le disais juste avant :)
Word hard, play hard.

#7 nocraft

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 02 January 2013 - 14:02 PM

Re salut, j’espère que votre réveillon fut exemplaire :P hehe
moi je m'y remet a peine, tjrs un peu la tête dans les vapes.

dIdIer,

encore une fois merci beaucoup pour cette belle explication et effectivement je commence a mieux cerné comment réellement réfléchir a la façon de concevoir un projet.

et apparemment vu que je pense que tu dois m avoir montrer le bonne route :P
cad le principe de ton systems via les dicos( et que galacta aprouve celui ci ),
je repars du "début", et vais me repencher sur ta demonstatrion.

en decomposant a chaque fois chaque "besoin" ( qui comme tu disais " Bref, je me laisse moins envahir par la grandeur du projet complet." )


Citation

(* en y réflechissant vite fait, je crois que je ferais une classe étendant Dictionary, qui chargerait un xml, le balayerait une fois chargé pour associer les phrases et les références.)
je vais reflechir a se besoin , qui me semble le bon.

galacta,

merci pour ta précision , sur la class Singleton (j'ai été voir un peu ca de plus pres, (ps d'allieur ici un tres bon tuto))
et ton exemple pour le chargement via xml.

aller je me fais un bon café et j'essaye de vous montrer quelque chose pour se soir ^^

peace et merci encore a vous 2 (dure dure le réveillon)

#8 nocraft

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 03 January 2013 - 22:14 PM

salut,

je me suis donc relancer dans la modification de ma logique , en reprennant la base du systeme de langue que tu m'avais emit dIdIer (j'ai eu entre temps , un contre temps ^^)
donc me voici apres quelque heure bloquer sur qlq chose de simple ?

j'essayer d'accerder a " public var _selectLang = Sprite; " depuis ma class XmlLoader
en realiter c'est pour recupere le nom de _selectLang
( urlLoader.load(new URLRequest("text/"+_selectLang.name+"/origine.xml" )

voila ou j'en suis

dans le fla
Spoiler

la class langManager (qui remplacerai tes bouton fr en)
Spoiler

la class XmlLoader
Spoiler

la class Traducteur (que tu m avais emise)
Spoiler

et donc après ceci j avais imaginer (d’après t'es conseil)

- un class TransformeXml (qui extand Dictionnary)
xml => dico

- et peu être aussi un class dico ?
qui lie le dico au bouton ? (a la place de l'avoir sur une frame dans le fla)

est se que je me lance sur la bonne route ?

mais en premier temps, comment résoudre mon problème de var public appeler dans un autre class ?

Un grand merci d'avance ,pour tous

ps:vais dodo, la nuit est de bonne réflexion.

#9 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 04 January 2013 - 11:57 AM

Citation

j'essayer d'accerder a " public var _selectLang = Sprite; " depuis ma class XmlLoader
Non. Ceci est faux.
Et c'est sans doute pour cela que tu n'y arrives pas.
Tu ne tentes pas d'accéder à _selectLang depuis la classe XmlLoader mais depuis une occurrence de cette classe.
De plus, ta variable _selectLang appartient à une occurrence de la classe langManager (et pas à cette classe, des fois que tu penserais cela aussi).

Pour que ça fonctionne, il faudrait au choix :
- que l'occurrence langManager connaisse l'occurrence de XMLLoader et lui transmette ta variable à chaque fois qu'elle la modifie
ou
- que l'occurrence de XMLLoader connaisse l'occurrence de langManager pour lui piquer sa variable (mais comment sera-t-elle prévenue si la variable change ?)
ou
- que quelqu'un de responsable surveille le changement d'état de l'occurrence de langManager et alerte l'occurrence de XMLLoader en conséquence. Pour moi, ce boulot devrait être sous la responsabilité du traducteur.

En fait, c'est une sorte de pyramide des responsabilités.
Il faut bien faire le tri des responsabilités : on a envie au début que les objets soient responsables d'eux même. Mais on se retrouve ensuite coincé comme toi parce que les objets sont isolés. Une des solutions, mais qui complique encore la situation, ce serait d'utiliser des événements personnalisés et de poser des écouteurs dans tous les sens… ça a des avantages, quand on a un bon niveau.
Sinon, le plus simple c'est de bien penser cette pyramide en donnant les responsabilités liées à l'objet à un tuteur.
Dans ton cas : il te faut un tuteur qui connaisse les 2 occurrences et soit chargé (ou au minimum prévenu) des changements de langue.


Petits conseils :
- prends le temps de typer tes variables
- prends le temps de typer tes fonctions
- ne tombe pas dans l'exces : tu as à mon avis maintenant trop de classes pour ton niveau. Une ou 2 classes suffiraient pour que tu apprennes à les faire travailler de concert efficacement.

De façon générale :
- dans ton main, occupe toi de l'affichage, écoute les objets graphiques, et traduis les en ordres pour des objets virtuels (non affichés)
- oublie (pour l'instant) les tweens qui te compliquent énormément la vie, occupe toi de faire un truc qui marche, et enrichit-le ensuite.
Par exemple, il se pourrait qu'animer tes boutons soit un "besoin", et qu'il vaille mieux faire une classe genre "Animateur" chargée de faire grossir et réduire les boutons… Une fois que tu aurais fait cette classe elle pourrait te servir pour tous tes boutons. Pas juste pour tes drapeaux. Et ça n'alourdirait pas ton Traducteur qui pourait te resservir pour un projet ou tu préféreras jouer sur l'alpha plutôt que la taille (ce n'est qu'un exemple, bien sûr).

En bonus, une petite mise à jour de ma classe Traducteur.
Elle gère maintenant le chargement de dictionnaires externes en XML, pour pas beaucoup de lignes e code en plus.
En prime, elle mémorise les langues déjà chargées pour ne pas les recharger une autre fois…

Le code est commenté, il paraît simple, mais c'est assez costaud à comprendre pour un débutant, amha…

Fichier(s) joint(s)

  • Fichier joint  langue.zip   16.38 Ko   25 téléchargement(s)


#10 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 04 January 2013 - 13:01 PM

Ca avance c'est cool :)

Comme le dit Didier, il faut que tu arrives à plus dissocier tes classes entres elles, dis toi que chaque classe fait quelque chose de précis. XMLLoader charge un XML et le met à disposition via un getter par exemple. LangManager s'occupe de dire à XMLLoader quel fichier XML chargé, récupère le contenu du XML et gère la récupération des chaînes via un id.

L'affichage pouvant ayant des interactions avec l'utilisateur il est Observable, et LangManager peut donc l'Observer, je te conseil de jeter un coup d'oeil au Design Pattern Observateur, afin de lier tes deux classes sans utiliser des liens forts entre elles.

L'idée étant que LangManager peut très bien apparaitre dans une fenetre A mais aussi dans une fenetre B d'une seconde application. En utilisant l'Observateur, tu n'a plus à te soucier de la manière donc tes classes seront liées entre elles, le pattern Observateur fait le lien entre les deux :)

Ca peut être une amélioration très intéressante !

Courage !
Word hard, play hard.

#11 nocraft

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 04 January 2013 - 18:08 PM

Hello les gars !

j'ai essayer toute l'aprem de comprendre toute vos sugestions et j'avoue encore avoir un peu les idee embrouilli

dIdIer,
j'ai prix en compte tes petit conseil ,j'ai donc typer mon code et oublier ma class XMLLoader, vu que ta superbe modif de la class Traducteur integre le chargement du xml <--- super merci !

j'ai un ptit truc dans ta nouvelle version que je ne comprend pas, dans le main tu fais

drapeaux.uk.dico = "_uk";// Le dico est associé à la langue (via son drapeau)
drapeaux.fr.dico = "_fr";
dico , je vois pas d ou il vient, tu serai m'eclairés ?

sinon apparement pour toi serai quand meme se choix

Citation

- que quelqu'un de responsable surveille le changement d'état de l'occurrence de langManager et alerte l'occurrence de XMLLoader en conséquence. Pour moi, ce boulot devrait être sous la responsabilité du traducteur.

mais enfaite, comment m'y prendre pour surveiller le changement d'etat de l'occurence dans un autre class?

Citation

Sinon, le plus simple c'est de bien penser cette pyramide en donnant les responsabilités liées à l'objet à un tuteur.
quand tu mentionne 'tuteur' , tu veux dire comme ici ta class Traducteur? ,
faudrai une autre class qui connaitrais que les 2 occurrences et qui serai chargé des changements de langue. ?

sinon j'ai retravaillé ma class LangManager (j'ai retirer les tween over out)
et j'ai commencer a prepare comme tu me le suggerai une autre class Animateur qui me servirai
a grossir/reduire et aussi afficher/desafficher les texte au momment du changement.

maintenant je voulais faire quelque chose du genre mais justement l'histoire du dico me bloque
_contentLang.dico = "_textLang[i]"; // le dico est associé à la langue (via l'array)
et dans la fonction clicLang
_traducteur.loadDico(e.target.dico); // On transmet le dico du drapeau cliqué au traducteur

il me dis qu'il ne trouve pas se fameux dico

ReferenceError: Error #1069: Property dico not found on flash.display.Sprite and there is no default value.
at langues::LangManager/clicLang()

Galacta,
comme je disais j'oublie donc la class XMLLoader vu le petit cadeau que ma fais dIdIer(la modif)
je vais aller me renseigner sur le Design Pattern Observateur
d'apres ta description le principe alair simpas ^^

encore merci pour tous
ps je rajoute la derniere modif de la class

LangManager.as
Spoiler

Animateur.as
Spoiler


#12 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 04 January 2013 - 18:24 PM

Personnellement LangManager je ne le vois pas comme un élément d'affichage, c'est une classe qui gère des fichier XML, et qui renvoie des strings en fonction d'un id, s'tout.

L'affichage ce fait dans une classe d'affichage, pas de gestion de la langue :P
Word hard, play hard.

#13 nocraft

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 04 January 2013 - 18:42 PM

pourrais tu me préciser un peu plus ton idee ?

car en realité je voulais que la class LangManager soi élément visible pour sélectionner la langue (remplace les drapeau)
comme dans le projet de dIdIer, sont clip "drapeaux" qui contient les langues "fr" "uk" et qui est l élément visible.

ou c'est moi qui fais quelque chose di-logique ?

#14 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 04 January 2013 - 19:27 PM

Citation

drapeaux.uk.dico = "_uk";// Le dico est associé à la langue (via son drapeau)
NB : le commentaire date de ma version précédente et il pourrait te tromper.
Je ne stocke plus dans drapeau, le dico lui-même mais une simple référence à la langue de type String.
Pourquoi ça marche ?
Parce que le type de mes drapeaux est un MovieClip.
Ce type est "dynamique", c'est à dire qu'on peut lui attribuer des propriétés à la vollée.
… ce qui ne peut pas se faire avec un type Sprite, car il n'est pas dynamique.



Désolé, je commenterai le reste plus tard, ma tribu vient de rentrer de vacances :-)

#15 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 04 January 2013 - 19:29 PM

C'est juste une méthode d'organisation en POO, tu sépares les traitements de l'interface utilisateurs.

Tu as ton interface qui reçoit les évènements utilisateurs, qui affiche la scène en d'autres termes. LangManager elle (la classe) n'est la que pour charger un XML en fonction d'une langue, et récupérer des chaines en fonction d'un id.
Word hard, play hard.

#16 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 04 January 2013 - 19:40 PM

Tiens un exemple de truc.

En soit d'un coté on charge les données, toi tu pense xml, mais, on peut aussi utiliser un autre format ( json .... ) du coup on s'en fou du chargement, chacun son loader :)

On peut, pour tester utiliser un objet du style :

   var obj:Object = {
        'myVarName':{
         'fr':'Bonjour',
         'en':'Hello'
        },
        'myVarName2':{
         'fr':'Accueil',
         'en':'Home'
        }
   };
 

Maintenant occupons nous, de notre objet qui va recevoir les données (Translator), lui il fait quoi ?
simplement il te retourne un texte dans une langue specifier.
Mon objet a donc besoin de :
1 la langue a utiliser
2 les données

Il faut aussi que l'on puisse changer la langue pendant la navigation (et oui c'est le but)
donc on va ajouter une function style monObjet.locale = 'fr' ou monObjet.locale = 'en'.

Pour les textfields on va déléguer la tache à un autre objet (TranslatorHelper), cette objet, dispose d'une function scan(container:DisplayObjectContainer) permettant de scanner les textfields present sur la scene il va les garder dans un tableau (fields).
Ensuite on a une function update() qui elle va simplement mettre a jour les textfields.
Mais comment dire que tel textfield doit afficher tel texte ??? servons nous du name du textField :)




App

package
{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.text.TextField;
import flash.ui.Keyboard;

public class App extends Sprite
{
  private var fieldsManager:TranslatorHelper;
  private var translator:Translator;
  public function App()
  {
   trace(this);
   if(stage)handleAddedToStage();
   else addEventListener(Event.ADDED_TO_STAGE,handleAddedToStage);
  }
  protected function handleAddedToStage(event:Event=null):void
  {
   trace(this,'handleAddedToStage',event);
   if(event)removeEventListener(Event.ADDED_TO_STAGE,handleAddedToStage);
 
   // set stage properties
   stage.align = StageAlign.TOP_LEFT;
   stage.scaleMode = StageScaleMode.NO_SCALE;
 
   //draw textfields
 
   var tx:TextField = new TextField();
   tx.name ="myVarName";
   addChild(tx);
 
   var child:Sprite = new Sprite();
   var subChild:Sprite = new Sprite();
   var subChildTx:TextField = new TextField();
 
   subChildTx.name ="myVarName2";
   subChild.addChild(subChildTx);
 
   child.addChild(subChild);
   addChild(child);
   child.y = 300;
   //set data
 
   var obj:Object = {
        'myVarName':{
         'fr':'Bonjour',
         'en':'Hello'
        },
        'myVarName2':{
         'fr':'Accueil',
         'en':'Home'
        }
   };
   //
   translator = new Translator('fr',obj);
   //
   fieldsManager = new TranslatorHelper(this,translator);
   //
   stage.addEventListener(KeyboardEvent.KEY_UP,handleKeyboard);
 
  }

  protected function handleKeyboard(event:KeyboardEvent):void
  {
   trace(this,'handleKeyboard',event);
   switch(event.keyCode)
   {
        case Keyboard.F:
        {
         translator.locale = 'fr';
         fieldsManager.update();
         break;
        }
        case Keyboard.E:
        {
         translator.locale = 'en';
         fieldsManager.update();
         break;
        }
   }
  }
}
}
 



Translator

package
{
import flash.utils.Proxy;
import flash.utils.flash_proxy;

dynamic public class Translator  extends Proxy {

  public var locale:String = 'fr';
  public var data:Object;

  public function Translator(locale:String = "fr",data:Object = null)
  {
   trace(this,'update');
   this.locale = locale;
   this.data = data!=null?data:{};
  }

  flash_proxy override function getProperty(name:*):* {
   return data[name][locale];
  }


  override flash_proxy function callProperty(methodName:*, ... args):* {
   var res:*;
   switch (methodName.toString()) {
        case 'locale':
         locale = args[0];
         break;
   }
   return res;
  }
  public function toString():String
  {
   return '[Translator]';
  }
}
}
 


TranslatorHelper

package
{
import flash.display.DisplayObjectContainer;
import flash.text.TextField;
public class TranslatorHelper extends Object
{
  public var data:Object = null;
  public var fields:Array = [];

  public function TranslatorHelper(container:DisplayObjectContainer,data:Object = null)
  {
   trace(this);
   this.data = data!=null?data:{};
   scan(container);
   update();
  }

  public function update():void
  {
   trace(this,'update');
   var label:Object ;
   for(label in fields)if(data[(fields[label] as TextField).name])(fields[label] as TextField).text = data[(fields[label] as TextField).name]label;
  }

  public function scan(container:DisplayObjectContainer):void
  {
   trace(this,'scan',container);
   var i:int = 0;
   var child:*;
   for(i;i<container.numChildren;i++){
        child  = container.getChildAt(i)
        if(child is TextField)fields.push(child);
        else if(child is DisplayObjectContainer)scan(child as DisplayObjectContainer);
   }
  }
}
}
 




- Afficher le SWF -
Fichier joint  App.swf   2.34 Ko   26 téléchargement(s)

touche F = fr et E = en :)
des questions ?

#17 nocraft

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 04 January 2013 - 21:01 PM

re dIdIer
ok je comprend mieux pk ca ne fonctionnais pas (car c'etait un Sprite)
j'ai donc modifier ma class LangManager en MovieClip , maintenant ca foctionne j'arrive a acceder au xml via
_contentLang.dico = "_" + _textLang[i]; // le dico est associé à la langue (via l'array)

mais le changement de text(dico) dans ma fonction clic n est pas correct ? ou ne s'execute pas ?
_traducteur.loadDico(e.target.dico); // On transmet le dico du drapeau cliqué au traducteur

comment ca se fais ?
je rajoute un .rar


Galacta,
oui ok, je comprend , donc ma class LangManager est pas reelement un objet visible
comme tu dis elle a juste des fonctions , charger xml / recuperer id ...


hello Goabonga,
tous d'abord un ptit salut, c'est gentil a toi de te joindre a mon probleme.

j'ai lu ton introduction par rapport au json ( que je connais pas encore ), mais c'est deja aller dans une autre directions ? :§ sinon le system

Citation

Pour les textfields on va déléguer la tache à un autre objet (TranslatorHelper), cette objet, dispose d'une functionscan(container:DisplayObjectContainer) permettant de scanner les textfields present sur la scene il va les garder dans un tableau (fields).
Ensuite on a une function update() qui elle va simplement mettre a jour les textfields.
me semble de bonne interet ! mais je pense metre ceci de coter , pour clairement pe l'utilisier par la suite.
je t'avoue que ca m'embrouille un petit peu
et je vien de regarder ton code et tester le swf ( qui fonctionne pas? , cad quand je press f ou e , y a rien qui se passe).

en tous cas merci pour les information supplementaire.
je repasserai tous a l heure, bonne ap

Fichier(s) joint(s)

  • Fichier joint  langue.rar   19.73 Ko   26 téléchargement(s)


#18 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 04 January 2013 - 21:32 PM

J'pense que le SWF de Goa ne fonctionne pas car tu n'as pas le focus dessus, affiche le, puis clique dessus après, afin de faire gagner le focus au player. Chez moi ça fonctionne bien :).

Goa utilise des fonctionnalités assez complexes, comme la classe Proxy, qui permet de faire (pour faire simple) des redéfinitions d'opérateurs comme en C++. la méthode getProperty correspond par exemple à l'opérateur [], ainsi il peut faire translatorHelper["myVarName"] pour récupérer la valeur de myVarName dans l'objet data qui contient les chaines.

Essaye de faire très simple au début, comme je te le disais, tu charges un XML pour une langue définie, tu le parses, tu stockes chaque clé => valeurs dans un Object, ou un Dictionary, comme tu le souhaites, puis tu crées une méthode getText(id:String):String qui te renvoie la chaine dans la langue en fonction de l'id que tu lui passes.

Une fois que tu auras réussi ça, on passera à l'étape suivante, gérer le changement de langue, puis gérer les différents formats de stockages des langues, puis la liaison avec une ihm etc... Petit bout par petit bout :)
Word hard, play hard.

#19 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 04 January 2013 - 22:15 PM

Fichier joint  data.xml   288 octets   32 téléchargement(s)
Fichier joint  data.txt   99 octets   42 téléchargement(s)


- Afficher le SWF -
Fichier joint  App.swf   4.35 Ko   31 téléchargement(s)

Fichier joint  App.as   3.93 Ko   27 téléchargement(s)
Fichier joint  Translator.as   982 octets   29 téléchargement(s) Fichier joint  TranslatorHelper.as   977 octets   32 téléchargement(s)
Fichier joint  TranslatorJSON.as   1020 octets   27 téléchargement(s)
Fichier joint  TranslatorXML.as   2.05 Ko   31 téléchargement(s)

Voila une version qui marche avec du xml http://en.wikipedia.org/wiki/XLIFF du json et un objet as :)

#20 nocraft

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 05 January 2013 - 09:04 AM

(personnellement je n'arrive pas a faire fonctionner le swf de Gaobonga) et ps j'ai bien cliquer dessu avant pour avoir le focus au player ,...
sans succès (je suis sur w8, qui sais)

mais comme tu le dis galacta , (je vais mettre ca sur le coter) et me re-concentrer sur le début

Citation

Essaye de faire très simple au début, comme je te le disais, tu charges un XML pour une langue définie, tu le parses, tu stockes chaque clé => valeurs dans un Object, ou un Dictionary, comme tu le souhaites, puis tu crées une méthode getText(id:String):String qui te renvoie la chaine dans la langue en fonction de l'id que tu lui passes.

donc la j'en suis a avoir :
-un XML pour une langue définie
-le parses d'un style css + le xml vers un htmltext
-un Dictionary qui stockes chaque clé

donc me manque
une méthode getText(id:String):String qui te renvoie la chaine dans la langue en fonction de l'id ?
ca serai qlq chose de se genre la ?

public function getText(id:String, text:String):String
{
                _id = id;
                _text = text;
}

enfin je fais quelque teste , je repasserai cette aprem
je m embrouille un peu...


Goabonga,

je regarderai ca cette aprem, mais j'ai tjrs un souci que rien ne s'effectue quand je clique sur O J X F E , alors que j'ai bien le focus du player ?! ( tu aurais une idee ? , comme je disais je suis sur w8, clavier BE)

sinon merci du partage je suppose que ca pourra certainement interesser des gens de meilleur niveau que moi.

bonne matinée

derniere modif Traducteur.as ( j'ai rajouter le parse css + htmltxt)
Spoiler


#21 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 05 January 2013 - 14:26 PM

Salut,

Non la fonction getText serait plutot de ce style :


public function getText(id:String):String{
           return _dictionnaire[id];
}
 

Word hard, play hard.

#22 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 05 January 2013 - 14:59 PM

Slt,
Galacta les swf tournent chez toi ? ( peut être que l'ami n'a pas accés aux fichiers ?, peut être un problème d'administration du forum ? )

Aussi non noCraft, essayes d'analyser ce que fait mon code, à part la class Proxy le reste est simple, et logique :)

#23 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 05 January 2013 - 16:12 PM

Ouep aucun soucis chez moi Goa, ça fonctionne bien.

J'pense pas que ce soit un soucis lié au forum, y aura déjà eu des retours si c'était le cas, enfin je pense.

Tu utilises quel navigateur nocraft ?
Word hard, play hard.

#24 nocraft

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 05 January 2013 - 16:25 PM

hello

Galacta,

(google crome)

sinon a propos de la function getText
cette fonction est deja presente dans la class Traducteur ? la function observe

public function observe(textField:TextField,id:String):void {
_recuperer_id[textField] = id;// On stocke l'id en utilisant le textField comme clé
traduire(textField);// Puis, on applique la traduction
}

je dois aussi faire pareil dans ma class LangManager ?
sauf que la on enregistre l'id dans un dico ?

Goabonga,
j'analyse ton systeme
sinon tjrs pas de resulta quand press les touches ,..

LangManager.as
Spoiler


#25 nocraft

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 05 January 2013 - 20:26 PM

Goabonga,
ps autant pour moi ca fonctionne ton swf ,.. apres un reboot du pc ,.. étrange
je continue l'analyse de ton system a+ tard

#26 nocraft

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 09 January 2013 - 17:26 PM

hello,

je me suis donc pencher quelque jours sur la solution de Goabonga,
et je n'ai garder que le translator xml (engros que les 3 fonctions X, F, E)

mais voila que dans TranslatorHelper.as
ligne 23

for(label in fields)if(data[(fields[label] as TextField).name])(fields[label] as TextField).text = data[(fields[label] as TextField).name]label;
me renvoye une erreur -> 1084 : Erreur de syntaxe : semicolon est attendu devant label.

j'ai donc rajouter un point devant label
for(label in fields)if(data[(fields[label] as TextField).name])(fields[label] as TextField).text = data[(fields[label] as TextField).name].label;

mais quand j'appuye sur X, j'obtiens ceci en log (bloquer a [object TranslatorHelper] update, la ou j'ai rajouter le point avant label)
Spoiler

pouriez vous me dire d'ou viens l'erreur svp? (car deja ca me semblais bizard , qu'il manquait se point devant label dans ton code, qui fonctionne apparement)

merci d'avance

#27 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 09 January 2013 - 19:14 PM

salut :)

je cherche pas à lire le plumpuding o.O, je me contente "traduire" le message d'erreur si ça peut t'aider

Property label not found on String and there is no default value.

ça dit qu'il n'y a pas de propriété label dans la classe string, ça implique que 'data[(fields[label] as TextField).name]' renvoie une chaine ;)
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#28 nocraft

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 09 January 2013 - 21:10 PM

hehe merci Nataly,
super tu ma debug ,.. meme si c'etais si simple :(

et sinon voila j'ai reussi , j'ai donc mon systeme de selecteur de lang (LangManager) qui charge la lang voulu via le Translator de Goabonga !
(super merci a toi)

maintenant je vais rajouter mes effects via une autre class (Animateur) pour grossir/amincir et aussi pour faire afficher/masquer le texte avec un alpha.

merci pour tous :P

Fichier(s) joint(s)



#29 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 09 January 2013 - 23:33 PM

Yep slt,
t'as capté que c'est le Helper qui redéfini le texte dans les champs de texte ?

#30 nocraft

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 10 January 2013 - 08:33 AM

yopla,

oui enfin je croix ,

this.data = data!=null?data:{};

#31 nocraft

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 10 January 2013 - 14:42 PM

Bonjours,

je suis maintenant avec ma class 'Animateur' qui me servira pour les teews grossir/aminicir sur les boutons des Langs et aussi pour cacher/rendreVisible le texte.

Animateur.as
Spoiler

pour commencer je voulais ,rajouter l'effet grossir/aminicir sur mes boutons Langs
mais je m'y prend mal ?

dans ma class (main)
//j'importe la class Animateur
import sa.Animateur;
// je l'identifie
private var animateur:Animateur = new Animateur();

//je rajoute un ecouter mouse_ouver
langManager.addEventListener(MouseEvent.MOUSE_OVER,langOver);

//je cree la fonction langOver, qui irra charger la fonction grossir de la class Animateur
private function langOver(event:MouseEvent):void
{
event.currentTarget.animateur(grossir);   <--- mon probleme
}

je suis dans le jus... :§
-est ce que ma class Animateur est-elle correct ?
-j'appel mal la fonction 'grossir' de la class Animateur?

merci d'avance



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)