Forums Développement Multimédia

Aller au contenu

- - - - -

Lister les propriétés d'un objet et lire leurs noms...

AS3 PROPRIETE PARAMETRES VARIABLES

8 réponses à ce sujet

#1 RolyMix

    Ceinture Orange

  • Members
  • PipPipPip
  • 48 messages

Posté 25 April 2014 - 09:16 AM

Bonjour à tous !

Contexte :
Dans mon jeu, je crée des perso aléatoires. Je veux leur donner des caractéristiques différentes (santé, force, vitesse, ...). J'ai un certain nombre de point à distribuer sur ces capacités.

Question :
Je voudrais aléatoirement accéder à ces propriétés ou alors prendre chacune d'elle et lui donner une valeur. je veux même comparer le nom de cette propriété à une variable et agir en fonction de ce qu'elle représente.

Est-ce possible ? Sinon, comment faire la même chose autrement ?

J'ai cherché avec le "for each" ou "for in"... ce n'est pas ce que je veux (apparemment).

Je vois bien une usine a gaz avec des switch (ça fonctionnerai) mais ce serait tellement plus beau de pouvoir lister ces propriétés et d'agir dessus.

Merci d'avance pour votre aide

#2 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 25 April 2014 - 09:32 AM

La solution la plus propre c'est sans doute d'utiliser une "interface" commune pour tous tes personnages.
Avec au moins une fonction : get_caracteristiques.

Cette fonction retournerait un objet, d'un type que tu dois créer toi même pour qu'il soit adapté, permettant de lister les caractéristiques, voire de les modifier, d'en ajouter…

C'est assez complexe à mettre en œuvre, ça dépend de ton niveau (connaissance des patterns, par exemple). Ça demande beaucoup de réflexion et de construction avant de se lancer à coder la première ligne. En tous cas tu ne trouveras rien de propre et de simple à la fois…
Le for in et for each me semblent très très loin de la réponse. Non pas qu'il ne faudrait pas en utiliser mais parce que ce sont des outils de codage alors que tu as un problème de conception, de structure d'objets.

#3 Benzouye

  • Members
  • PipPipPipPipPipPipPipPip
  • 583 messages

Posté 25 April 2014 - 13:49 PM

Bonjour,

N'y aurait-il pas plutôt un moyen d'agir lors de la création de tes objets ?
Je suppose que quand tu instancies un personnage, tu détermines en même temps ses caractéristiques.
N'as-tu pas moyen de "calculer" les caractéristiques avant de les passer en paramètre lors de l'instanciation de ta classe personnage ?

En gros construire un tableau rempli des valeurs souhaitées sur lequel tu boucles pour instancier tes personnages ...
Du coup ton problème devient : écrire un code de détermination de ces valeurs souhaitées ...
Benzouye
Travaille avec FlashDevelop 4 + Flex SDK 4.6 open source

#4 yvon

    Ceinture Blanche

  • Members
  • Pip
  • 12 messages

Posté 26 April 2014 - 09:20 AM

Bonjour,

Citation

J'ai cherché avec le "for each" ou "for in"... ce n'est pas ce que je veux (apparemment).

Ca ne marche pas un truc comme cela : ?

for (var prop:String in obj)
                        {
                         trace  (prop + " ->" + obj[prop] );
                        }

Arfany

#5 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 26 April 2014 - 17:30 PM

Je ne crois pas. Peut-être les variables dynamiques mais c'est tout.

Une méthode, c'est de récupérer les infos de la classe de l'objet vis la fonction globale describeType.
Elle renvoie un xml contenant toutes les infos qu'il faut ensuite parcourir. Attention : ça ne marche qu'avec la Class de l'objet, par avec l'objet lui-même.
Mais franchement, vu la complexité et la complexité d'usage par la suite, il me semble vraiment plus intéressant d'apprendre à utiliser les interface et une bonne conception.


var infos : Array = new Array();
var description:XML=describeType(MovieClip);
for each (var variable:XML in description..variable) {
infos.push((variable.@name).toString());
}
for each (var accesseur:XML in description..accessor) {
infos.push((accesseur.@name).toString());
}
trace (infos);
 


#6 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6955 messages

Posté 26 April 2014 - 18:28 PM

Salut,

Citation

Dans mon jeu, je crée des perso aléatoires. Je veux leur donner des caractéristiques différentes (santé, force, vitesse, ...). J'ai un certain nombre de point à distribuer sur ces capacités

Je comprend pas un truc, tes personnages tu connais par avance leurs caractéristiques, non ?
Ce sont toujours les mêmes quelque soit le type de personnage, en dehors de certaines caractéristiques spéciales (qu'on peu aussi retrouver à l'état non active pour tous les personnages).

Donc d'après moi tous tes personnages sont sur le même modèle, et tu cherches à faire varier ces caractéristiques de manière aléatoires pour avoir des persos différents, me trompe-je ?

Du coup il te suffirait d'une classe mère "personnage" qui défini tous ces paramètres, puis autant de classes filles que de types différents à gérer (humain, oiseau, canidé, ...).

Citation

Je voudrais aléatoirement accéder à ces propriétés ou alors prendre chacune d'elle et lui donner une valeur.

Quand tu crée ton perso, tu peux valoriser aléatoirement ses caractéristiques dans le constructeur de la classe, en lui passant si tu veux un certain nombre de points à distribuer et un minima pour certaines caractéristiques, puis utiliser des accesseurs pour faire varier les caractéristiques quand tu en as besoin (ce dont tu auras de toute façon en cours de partie si tu veux faire évoluer tes personnages).

Du coup, pourquoi pas un truc du genre :

package {

    public class Personnage extends MovieClip {
       
        // caracteristiques
        private var _taille:Number;
        private var _poids:Number;
        private var _vitesse:Number;
        private var _sante:Number;
        private var _dexterite:Number;
        private var _chance:Number;
        private var _force:Number;
        private var _intelligence:Number;
       
        // constructeur
        public function Personnage(points:int) {
            // valorisation aléatoire des caractéristiques
            // en fonction des points à distribuer
        }
       
        //accesseurs
        public function get taille() { return _taille);
        public function set taille(t:int) { _taille = t);

    }
}

Tu peux utiliser une interface pour t'assurer que tous tes personnages respecterons bien le minimum requis (propriétés et méthodes).

Citation

je veux même comparer le nom de cette propriété à une variable et agir en fonction de ce qu'elle représente.

monPerso.sante += maValeur;

Non ?

Avec les accesseurs je ne vois pas de cas où tu as besoin de comparer le nom de la propriété à une variable.

Ou alors j'ai raté un truc...
Mais je ne comprend pas pourquoi tu as besoin de lister les propriétés de tes objets.
Normalement tu les connais, il te suffit juste de t'assurer que l'objet est du bon type avant d'essayer de modifier ses propriétés (par exemple s'assurer qu'il s'agit bien d'un objet de type "personnage" et pas "meuble" avant d'essayer de faire varier sa caractéristique "force").

#7 RolyMix

    Ceinture Orange

  • Members
  • PipPipPip
  • 48 messages

Posté 26 April 2014 - 18:34 PM

Salut à tous !

J'ai lu ce que vous avez apporté comme réponse et je vous remercie tous pour le temps que vous avez pris pour me répondre.

Effectivement il y a un problème de structure, et non pas bien, j'ai commencé à coder sans faire d'UML (enfin j'arrive pas à structurer avec ce genre de graphique... il me faudrait une formation...)

Donc en attendant, je suis allé sur la voie à Benzouye.

Premièrement :

J'ai créé une classe (Effect) qui regroupe toute les catégories avec des constante String comme suis :

  private static const _ACCURACY:String  = "ACCURACY";
  private static const _MANA:String   = "MANA";
  private static const _CRITICAL:String  = "CRITICAL";
  private static const _ARMOR:String   = "ARMOR";
  private static const _SIGHT:String   = "SIGHT";
 
et l'ensemble de ces caractéristiques, je les ai rangées dans un tableau :


  private static const _LST_EFFECT:Array = new Array( _LIFE,   _POWER,   _RESIST_BRUT,  _RESIST_WATER,  _RESIST_AIR,
                            _RESIST_ICE,  _RESIST_FIRE,  _RESIST_ACID,  _RESIST_POISON, _DODGE,  
                            _SPEED_WALK,  _SPEED_ACTION,  _SPEED_REGEN,  _SPEED_MANA,  _ACCURACY,  
                            _MANA,    _CRITICAL,   _ARMOR,   _SIGHT,   _DAMAGE_WATER,
                            _DAMAGE_AIR,  _DAMAGE_ICE, _DAMAGE_FIRE,  _DAMAGE_ACID,  _DAMAGE_POISON,
                            _DISCRETION, _DAMAGE_BRUT, _DETECT);
 
que j'ai mis en accès GET.

Deuxièmement :

Quand je crée mon personnage, je lance un init qui remplit son propre tableau de caractéristique :

   // création des compétences : 4 pt pour chacunes
   var nb:int = Effect.LST_EFFECT.length;
   for (var i:int = 1; i < nb; i++) {
    feature.push( { name:Effect.LST_EFFECT[i], value:4 } );
   }
 
Je donne donc un nom et une avleur à chaque effet.

Troisièmement :
Création des fonction d'accès aux données :


  public function getFeature(n:String):int {
   var nb:int = feature.length;
   var val:int;
 
   for (var i:int = 1; i < nb; i++) {
    (feature[i].name = n) ? val = feature[i].value : val;
   }
 
   return val;
 
  }
 
  public function setFeature(n:String, v:int, add:Boolean = true):void {
   var nb:int = feature.length;
 
   for (var i:int = 1; i < nb; i++) {
    (feature[i].name = n) ? ((add) ? feature[i].value += v : feature[i] = v) : nb;
   }
  }
 

Et pour l asuite, quand j'utiliserait des objet modificateur de compétances, comme j'aurais défini dans ces utilisateur le même standard (Effect) je passerais le nom en parametre et hop ! ca va rouler :D

Voilà. Vous aurez remarqué que je ne parle pas d'interface... J'en utilise ailleurs mais là j'ai trouvé ca plus simple d'un coup :D (et plus à ma portée de petit programmeur débutant).

ps : Promis, quand le jeu sera jouable, je vous ferai essayer ;)

#8 RolyMix

    Ceinture Orange

  • Members
  • PipPipPip
  • 48 messages

Posté 26 April 2014 - 18:41 PM

M Spi, j'ai pas vu ton message avant de poster.

En fait je veux que ca reste modulable car je voudrais penser que les évolutions futures n'impliquent pas de recoder certaines choses.

Et justement, la base c'est qu'on ne sais pas vraiment toute les caractéristiques qu'on pourrait avoir sur un personnage (ca doit évoluer facilement).

en tout cas ta solution est pas mal.

Je me rend compte qu'en fait, en relisant, je vais certainement créer une interface car la méthode get_caractéristique (et merci Dldler car il en a parlé le premier et j'avais pas compris) sera commune à tous :)

La solution que j'utilise me semble pas trop mal en terme de conception, et pas gourmande car les get set (qui scanne les caractéristiques) ne seront pas utilisées trop fréquemment.

Mais je suis vraiment content de vous avoir trouvé sur ce forums, tous autant que vous êtes, car j'avance à une vitesse folle depuis ^^

Merki tout plein :P

#9 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6955 messages

Posté 26 April 2014 - 23:43 PM

Citation

Et justement, la base c'est qu'on ne sais pas vraiment toute les caractéristiques qu'on pourrait avoir sur un personnage (ca doit évoluer facilement).

Pour moi, c'est là qu'est l'os ;-)
A mon sens les personnages ont tous toutes les caractéristiques (une feuille de caractéristiques) qui sont valorisées de null à X.
L'obtention d'un nouvelle caractéristique se fait par la valorisation de cette dernière (0 = caractéristique acquise, X = niveau max).
Donc tu connais toutes les caracs possibles quel que soit le personnage, il suffit de voir si elle est valide ou pas (null = non acquise).
Pour moi, il y a donc une classe mère "Personnage", qui intègre une feuille de caractéristiques commune à tous les personnages.
Si en cours de développement tu décide d'ajouter une nouvelle caractéristique il te suffit de modifier la classe "Personnage".
Du moins je serais parti comme ça...




Répondre à ce sujet



  

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

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

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP