2013-02-02 1 views
0

Bonjour les gars j'ai un problème et aucune idée de comment le résoudre :(Quelqu'un peut-il me dire comment faireflash AS3: fonctions de constructeur doit être par exemple la méthode

fonctions de constructeur doivent être des méthodes d'instance

?.

Alors, voici mon code:.

package 
{ 
    import com.coreyoneil.collision.CollisionList; 
    import flash.events.Event; 
    import flash.display.Sprite;  

    public class terrain extends Sprite 
    { 
     private var wheel:Ball; 
     private var collisionList:CollisionList; 
     private var speed:Number; 

     private const GRAVITY:Number = .75; 
     private const FRICTION:Number = .98; 
     private const IMMOVABLE:Number = 10000; 


     public function terrain():void 
     { 
      if(stage == null) 
      { 
       addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true); 
       addEventListener(Event.REMOVED_FROM_STAGE, clean, false, 0, true); 
      } 
      else 
      { 
       init(); 
      } 
     } 

     private function init(e:Event = null):void 
     { 
      collisionList = new CollisionList(terrain); 

      wheel = new wheel(10); 
      wheel.mass = IMMOVABLE * 2; 
      addChild(wheel); 
      collisionList.addItem(wheel); 
      wheel.x = 30; 
      wheel.y = 10; 

      speed = 0; 

      terrain.graphics.lineStyle(15); 

      addEventListener(Event.ENTER_FRAME, updateScene); 
     } 


     private function updateScene(e:Event):void 
     {   
      var collisions:Array = collisionList.checkCollisions(); 

      if(collisions.length) 
      { 
       var collision:Object = collisions[0]; 
       var angle:Number = collision.angle; 
       var overlap:int = collision.overlapping.length; 

       var sin:Number = Math.sin(angle); 
       var cos:Number = Math.cos(angle); 

       var vx0:Number = wheel.vx * cos + wheel.vy * sin; 
       var vy0:Number = wheel.vy * cos - wheel.vx * sin; 

       // Unlike the other examples, here I'm choosing to calculate the amount 
       // of bounce based on the objects' masses, with a default mass of 10000 (IMMOVABLE) 
       // being used for the drawing the wheel is colliding with. As such, the only 
       // real variable in play here is the current vector of the wheel. 
       vx0 = ((wheel.mass - IMMOVABLE) * vx0)/(wheel.mass + IMMOVABLE); 
       wheel.vx = vx0 * cos - vy0 * sin; 
       wheel.vy = vy0 * cos + vx0 * sin; 

       wheel.vx -= cos * overlap /wheel.radius; 
       wheel.vy -= sin * overlap/wheel.radius; 

       wheel.vx += speed; 
      } 
      trace("down"); 
      wheel.vy += GRAVITY; 
      wheel.vy *= FRICTION; 
      wheel.vx *= FRICTION; 

      wheel.x += wheel.vx; 
      wheel.y += wheel.vy; 

      if(wheel.x > stage.stageWidth) wheel.x = stage.stageWidth; 
      if(wheel.x < 0) wheel.x = 0;          
      if(wheel.y > stage.stageHeight - (wheel.height >> 1)) 
      { 
       wheel.y = 10; 
       wheel.x = 30; 
       wheel.vx = wheel.vy = 0; 
      } 

     } 

     private function clean(e:Event):void 
     { 
      removeEventListener(Event.ENTER_FRAME, updateScene); 
     } 




    } 
    } 

il y a quelques commentaires dans le code .. il suffit de l'ignorer, je l'ai utilisé exemple

+0

Quelle est votre question? Qu'est-ce qui vous pose problème? – poepje

+0

Il n'est pas nécessaire d'effectuer la vérification 'if (stage == null)' dans le constructeur, car à ce moment, un nouvel objet sera créé qui ne pourra pas être ajouté à la scène avant que sa construction ne soit terminée. Ainsi, la propriété stage sera toujours nulle dans le constructeur. Ajouter simplement les auditeurs suffirait. L'autre partie ne sera jamais évaluée de toute façon. –

Répondre

3
collisionList = new CollisionList(terrain); 
terrain.graphics.lineStyle(15); 

Il s'agit de l'erreur 1026, également lancée si le constructeur est statique, privé ou dans votre cas utilisé comme identifiant. Utilisez this.graphics à la place de terrain.graphics ou simplement graphics.etc (supprimez le terrain) et passez aussi 'this' comme paramètre pour 'CollisionList'.
(non apparenté: Aussi, il est préférable de nommer des classes commençant par un «terrain» majuscule)

+0

Merci pour le conseil, mais si j'utilise ceci je reçois toujours la même erreur dans la ligne 3 (où je commence à importer des choses) – Andrey

+0

Oh ouais il y en a un autre: "collisionList = new CollisionList (terrain);", changez aussi le nouveau CollisionList (this). Fondamentalement, vous n'avez besoin d'utiliser un nom de classe comme identificateur que s'il a une propriété ou une méthode statique et d'une autre classe, sinon son 'ceci' ou rien de la classe. – chadiik

Questions connexes