Forums Développement Multimédia

Aller au contenu

Manque de POO (de connaissances en)

CODE Actionscript

9 réponses à ce sujet

#1 William27wp

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 168 messages

Posté 12 January 2013 - 12:15 PM

Bonjour à Tous et bon week-end,

Pour décrire mon problème, je vais reprendre ce sur quoi je planche en ce moment, à savoir box2D.

Il était une fois un monde que j'ai peuplé avec un cube.
Pour ce faire, j'ai déclaré dans ma classe Main

PhysicValues.world = new b2World(new b2Vec2(0, 9.8), true);
 

Pour ceux qui voudraient savoir, voici la classe PhysicValues qui a en charge les critères spécifiques au monde

public class PhysicValues
{
  public static const SCALE:Number = 30;
  public static const RADTODEG:Number = 180 / Math.PI;
  public static const DEGTORAD:Number = Math.PI / 180;

  private static var _world:b2World;

  static public function get world():b2World
  {
   return _world;
  }

  static public function set world(value:b2World):void
  {
   _world = value;
  }

}
 
Afin de vraiment faire de la POO, j'ai donc ensuite rajouté une classe Actors dont le rôle est de créer à plus soif autant d'objets dynamiques que je le souhaite

public class Actors
{
  private var _body:b2Body;

  public function Actors(position:b2Vec2, isPolygon:Boolean, hx:Number, hy:Number)
  {
   var bodyDef:b2BodyDef = new b2BodyDef();
   bodyDef.position.Set(position.x / PhysicValues.SCALE, position.y / PhysicValues.SCALE);
   bodyDef.type = b2Body.b2_dynamicBody;
   bodyDef.userData = this;
 
   _body = PhysicValues.world.CreateBody(bodyDef);
 
   (isPolygon) ? doPolygon(hx, hy) : doCircle();
 
  }

  private function doCircle():void
  {
   trace('todo');
  }

  private function doPolygon(hx,hy):void
  {
   var shape:b2PolygonShape = new b2PolygonShape();
   shape.SetAsBox(hx / PhysicValues.SCALE, hy / PhysicValues.SCALE);
 
   var fixtureDef:b2FixtureDef = new b2FixtureDef();
   fixtureDef.shape = shape;
   fixtureDef.density = 1;
   fixtureDef.friction = .3;
   _body.CreateFixture(fixtureDef);
  }

}
 

puis de retour dans la classe Main, je crée mes objets

_allBodies.push(new Actors(new b2Vec2(stage.stageWidth >> 1, 120), true, 30, 30));
_allBodies.push(new Actors(new b2Vec2((stage.stageWidth >> 1) + 70, 120), true, 30, 30));
 

jusque là, tout fonctionne bien.
Maintenant, mon problème, c'est que j'ai besoin d'utiliser mes objets Actors comme des véritables b2Body et là, pas moyen.
J'ai essayé plusieurs transtypages tels que

var bodyA:b2body = _allBodies[_allBodies.length - 1] as b2Body;
 
mais la réponse est un échec de la contrainte entre Actors et b2Body.

Bon j'ai réussi à obtenir ce que je voulais en créant les objets dans Main sans passer par Actors mais j'aurai aimé garder cette approche POO.

Quelques avis ?

#2 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 12 January 2013 - 12:24 PM

Actors extends b2Body ( ou implements si c'est une interface ).
non ?

#3 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 12 January 2013 - 12:45 PM

Dans l'état actuel, je dirais que b2Body est une agrégation, et qu'il faudrait un getter pour le récupérer depuis la classe Actor
Word hard, play hard.

#4 William27wp

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 168 messages

Posté 12 January 2013 - 13:56 PM

J'avais effectivement pensé à étendre Actors à b2Body mais effectivement, il n'y a pas de contructeur. J'ai rapidement survolé le concept d'agrégation et je ne sais si b2Body est concerné, mais on y trouve tout un tas de méthodes avec des tas d'arguments.

#5 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 12 January 2013 - 18:20 PM

je ne connais pas la lib, mais si le constructeur n'est pas utilisé qu'est ce qui t'empêche de l'utiliser dans ta class ?

#6 William27wp

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 168 messages

Posté 12 January 2013 - 19:39 PM

Lorsque je tente d'étendre Actors avec b2Body, la compilation me réponds que ce n'est pas possible car il n'y a pas de constructeur dans b2Body. Mais c'est peut-être une réponse bateau qui cache une autre raison.
Sinon, je ne parviens toujours pas à faire hériter Actors des méthodes de b2Body dont j'ai besoin dans ma classe Main.
Le plus irritant est que Actors a en charge la création d'objets b2Body.

#7 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 12 January 2013 - 23:23 PM

Zip Zip le projet ( et le swc de b2D que tu utilises ), histoire que je regarde de plus prés ce qui ne va pas :)

#8 William27wp

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 168 messages

Posté 13 January 2013 - 12:04 PM

J'ai développé le projet sous Flash Develop.
Les objets créés par la classe Actors sont stockés dans un Array.
Les traces sur l'Array me confirment qu'il a bien stocké des objets Actors qui, selon ma logique, sont des objets b2Body.
Mon objectif est de récupérer les méthodes de la classe b2Body via les objets Actors.

Problèmes rencontrés :
1) Lorsque je tente d'étendre Actors avec b2Body, la compilation me retourne :
Error: No default constructor found in base class Box2D.Dynamics:b2Body.

2)Lorsque je saisis :

var bodyA:b2Body = _allBodies[0] as b2Body;
trace(bodyA);
 
J'obtiens null

3)Et lorsque je saisis :

var bodyB:b2Body = _allBodies[1];
trace(bodyB);
 
Je me retrouve avec une contrainte entre Actors et b2Body impossible.

Merci pour le temps que vous me consacrez.

Fichier(s) joint(s)

  • Fichier joint  Poo.zip   365.31 Ko   36 téléchargement(s)


#9 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 13 January 2013 - 14:05 PM

rajoute un getter sur la class Actors ( get body)

public function get body() : b2Body {
   return _body;
}
 

et puis :


   var bodyA : b2Body = (_allBodies[0] as Actors).body;
 


#10 William27wp

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 168 messages

Posté 13 January 2013 - 14:34 PM

J'ai compris et assimilé.
Merci sincèrement



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

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