2009-11-29 9 views
0

Je suis en train de construire le mécanisme de dégâts pour mon jeu. Deux classes gèrent cela, la classe 'blessé' et la classe 'collision'. La classe blessée passe une instance de lui-même à la méthode 'hurtCollision' de la classe de collision, de sorte que la classe de collision peut détecter une collision entre le joueur et cette instance de blessé (qui est un objet d'affichage). Lorsque je tente d'accéder à cette fonction cependant, je reçois cette erreur:Pourquoi une erreur se produit-elle lorsque j'essaie d'accéder à une fonction publique d'une classe? (Actionscript 3)

1061: Call to a possibly undefined method hurtCollision through a reference with static type Class. 

Voici les deux classes:

La classe de collision (vous pouvez juste ctrl f à hurtCollision):

package 

{

import flash.display.MovieClip; 

public class Collision extends MovieClip 
{ 
    private var e:*; 
    static public var _playerX:*; 
    static public var _playerY:*; 
    private var HIT_BOTTOM_1X:Number; 
    private var HIT_BOTTOM_2X:Number; 
    private var HIT_BOTTOM_3X:Number; 
    private var HIT_TOP_1X:Number; 
    private var HIT_TOP_2X:Number; 
    private var HIT_TOP_3X:Number; 
    private var HIT_R_1X:Number; 
    private var HIT_R_2X:Number; 
    private var HIT_R_3X:Number; 
    private var HIT_L_1X:Number; 
    private var HIT_L_2X:Number; 
    private var HIT_L_3X:Number; 
    private var HIT_BOTTOM_1Y:Number; 
    private var HIT_BOTTOM_2Y:Number; 
    private var HIT_BOTTOM_3Y:Number; 
    private var HIT_TOP_1Y:Number; 
    private var HIT_TOP_2Y:Number; 
    private var HIT_TOP_3Y:Number; 
    private var HIT_R_1Y:Number; 
    private var HIT_R_2Y:Number; 
    private var HIT_R_3Y:Number; 
    private var HIT_L_1Y:Number; 
    private var HIT_L_2Y:Number; 
    private var HIT_L_3Y:Number; 

    public function Collision(enginePass:*) 
    {  
    e = enginePass; 
    } 
    public function detectCollisions(object:*):void 
    { 
     _playerX = e._player.x; 
     _playerY = e._player.y; 
     HIT_BOTTOM_1X = object.x - object.width/2; 
     HIT_BOTTOM_2X = object.x; 
     HIT_BOTTOM_3X = object.x + object.width/2; 
     HIT_TOP_1X = object.x - object.width/2; 
     HIT_TOP_2X = object.x; 
     HIT_TOP_3X = object.x + object.width/2; 
     HIT_R_1X = object.x + object.width/2; 
     HIT_R_2X = object.x + object.width/2; 
     HIT_R_3X = object.x + object.width/2; 
     HIT_L_1X = object.x - object.width/2; 
     HIT_L_2X = object.x - object.width/2; 
     HIT_L_3X = object.x - object.width/2; 

     HIT_BOTTOM_1Y = object.y + object.height/2; 
     HIT_BOTTOM_2Y = object.y + object.height/2; 
     HIT_BOTTOM_3Y = object.y + object.height/2; 
     HIT_TOP_1Y = object.y - object.height/2; 
     HIT_TOP_2Y = object.y - object.height/2; 
     HIT_TOP_3Y = object.y - object.height/2; 
     HIT_R_1Y = object.y + object.height/2 - object.height/4; 
     HIT_R_2Y = object.y; 
     HIT_R_3Y = object.y - object.height/2 + object.height/4; 
     HIT_L_1Y = object.y + object.height/2 - object.height/4; 
     HIT_L_2Y = object.y; 
     HIT_L_3Y = object.y - object.height/2 - object.height/4; 

     if(e._ground.hitTestPoint(HIT_BOTTOM_1X,HIT_BOTTOM_1Y,true) || e._ground.hitTestPoint(HIT_BOTTOM_2X,HIT_BOTTOM_2Y,true) 
     || e._ground.hitTestPoint(HIT_BOTTOM_3X,HIT_BOTTOM_3Y,true)) 
     { 
      e._touchGround = true; 
      if(e._vy < 0) 
      { 
       e._vy = 0; 
      } 
     } 
     if(e._ground.hitTestPoint(HIT_TOP_1X,HIT_TOP_1Y,true) || e._ground.hitTestPoint(HIT_TOP_2X,HIT_TOP_2Y,true) 
     || e._ground.hitTestPoint(HIT_TOP_3X,HIT_TOP_3Y,true)) 
     { 
      e._jump = false; 
      e._vy = -(e._vy) - 5; 
     } 

     if(e._ground.hitTestPoint(HIT_R_1X,HIT_R_1Y,true) || e._ground.hitTestPoint(HIT_R_2X,HIT_R_2Y,true) 
     || e._ground.hitTestPoint(HIT_R_3X,HIT_R_3Y,true)) 
     { 
      if(e._vx > 0) 
      { 
       e._vy += e._vx; 
      } 
      if(e._ground.hitTestPoint(HIT_TOP_3X, HIT_TOP_3Y, true)) 
      { 
       if(e._vx > 0) 
       { 
       e._vx = -(e._vx) *2; 
       } 
      } 
     } 
     if(e._ground.hitTestPoint(HIT_L_1X,HIT_L_1Y,true) || e._ground.hitTestPoint(HIT_L_2X,HIT_L_2Y,true) 
     || e._ground.hitTestPoint(HIT_L_3X,HIT_L_3Y,true)) 
     { 
      if(e._vx < 0) 
      { 
       e._vy += Math.abs(e._vx); 
      } 
      if(e._ground.hitTestPoint(HIT_TOP_1X, HIT_TOP_1Y, true)) 
      { 
       if(e._vx < 0) 
       { 
       e._vx = -(e._vx) *2; 
       } 
      } 
     } 
     if(e._ground.hitTestPoint(HIT_TOP_3X, HIT_TOP_3Y, true) && e._ground.hitTestPoint(HIT_BOTTOM_3X, HIT_BOTTOM_3Y, true)) 
     { 
      e._vy += 20; 
     } 
     if(e._ground.hitTestPoint(HIT_TOP_1X, HIT_TOP_1Y, true) && e._ground.hitTestPoint(HIT_BOTTOM_1X, HIT_BOTTOM_1Y, true)) 
     { 
      e._vy += 20; 
     } 
     if(e._ground.hitTestPoint(e._player.x,e._player.y, true)) 
     { 
      e._vy = -(e._vy); 
      e._vx = -(e._vx); 
     } 
     else 
     { 
      if(!(e._ground.hitTestPoint(HIT_BOTTOM_1X,HIT_BOTTOM_1Y,true) || e._ground.hitTestPoint(HIT_BOTTOM_2X,HIT_BOTTOM_2Y,true) 
     || e._ground.hitTestPoint(HIT_BOTTOM_3X,HIT_BOTTOM_3Y,true))) 
      { 
      e._vy -= 1; 
      e._touchGround = false; 
      } 
     } 
    } 

    public function hurtCollision(hurtObject:*) 
    { 
     if(hurtObject.hitTestPoint(HIT_BOTTOM_1X,HIT_BOTTOM_1Y,true) || hurtObject.hitTestPoint(HIT_BOTTOM_2X,HIT_BOTTOM_2Y,true) 
     || hurtObject.hitTestPoint(HIT_BOTTOM_3X,HIT_BOTTOM_3Y,true)) 
     { 
      e.hurtPlayer(); 
     } 
     if(hurtObject.hitTestPoint(HIT_TOP_1X,HIT_TOP_1Y,true) || hurtObject.hitTestPoint(HIT_TOP_2X,HIT_TOP_2Y,true) 
     || hurtObject.hitTestPoint(HIT_TOP_3X,HIT_TOP_3Y,true)) 
     { 
      e.hurtPlayer(); 
     } 

     if(hurtObject.hitTestPoint(HIT_R_1X,HIT_R_1Y,true) || hurtObject.hitTestPoint(HIT_R_2X,HIT_R_2Y,true) 
     || hurtObject.hitTestPoint(HIT_R_3X,HIT_R_3Y,true)) 
     { 
      e.hurtPlayer(); 
     } 
     if(hurtObject.hitTestPoint(HIT_L_1X,HIT_L_1Y,true) || hurtObject.hitTestPoint(HIT_L_2X,HIT_L_2Y,true) 
     || hurtObject.hitTestPoint(HIT_L_3X,HIT_L_3Y,true)) 
     { 
      e.hurtPlayer(); 
     } 
    } 
} 

}

La classe mal:

package 

{ flash.display.MovieClip d'importation; import flash.events.Event; import Collision;

public class Hurt extends MovieClip 
{ 
    public function Hurt() 
    { 
     addEventListener(Event.ENTER_FRAME, enterFrame); 
    } 
    private function enterFrame(e:Event) 
    { 
     Collision.hurtCollision(this); 
    } 
} 

}

EDIT: Juste pour vous le savez tous, e.hurtPlayer est juste la méthode de classe de document qui contrôle la santé du joueur.

+0

Si vous indentez tous vos espaces de code 4, il sera formaté correctement, fyi. – rfunduk

Répondre

4

Votre problème est ici:

Collision.hurtCollision(this); 

hurtCollision n'est pas une méthode de classe, il est une méthode d'instance. Si vous voulez que Collision ressemble plus à une classe utilitaire (par opposition à devoir créer des instances pour utiliser les méthodes), alors vous voulez probablement faire public static function ... au lieu de seulement public function.

Lisez les méthodes de classe pour en savoir plus.

En lisant votre code de plus près, vous l'avez conçu de telle sorte que le constructeur prenne un paramètre que vous utilisez dans les méthodes. Cela soit besoin d'être repensées (passer cette chose dans les méthodes elles-mêmes, peut-être?) Ou vous pouvez simplement aller la route par exemple:

new Collision(e).hurtCollision(this); 

... Vous pouvez garder l'instance autour de plus que juste pour le seul appel si vous l'utilisez beaucoup, bien sûr.

+0

Merci pour la réponse. La modification de la méthode en statique supprime l'erreur, mais toutes les propriétés que j'utilise deviennent indéfinies. Donc, si la fonction est statique, je ne peux accéder à aucune des propriétés de cette classe? Je ne sais pas si c'est ce que vous touchez dans votre deuxième paragraphe ... – Miles

+0

Permettez-moi de clarifier un peu. J'ai besoin de passer à la fois l'instance de la classe blessée et l'instance de la classe moteur dans la méthode hurtCollision. Je ne vois pas comment je pourrais éventuellement passer ces paramètres dans la classe de collision à partir de deux classes distinctes tandis que hurtCollision est statique? Quand ce n'était pas statique, je pouvais déjà utiliser les propriétés qui avaient été transmises depuis la classe moteur. Y at-il une autre solution de contournement? – Miles

+0

Oui, eh bien, vous n'appelez jamais le constructeur, donc les variables d'instance ne peuvent pas être définies (vos propriétés). Comme je l'ai dit au deuxième paragraphe, vous devriez être en mesure de transmettre directement ce que vous êtes en train de transmettre à votre constructeur. Il existe d'autres façons, mais ils deviennent complexes, le meilleur pour acheter un livre AS3 ou quelque chose pour couvrir toutes les bases dans ce cas. – rfunduk