2010-12-09 30 views
1

J'ai un problème ennuyeux. J'ai un peu googlé et je ne trouve pas vraiment de bonnes réponses, alors j'espère trouver de l'aide ici."upload" n'est pas une fonction

Je reçois cette erreur, qui semble être assez commun:

TypeError: Error #1006: update är inte en funktion. // = update is not a function (english) 
at se.qmd.spaceInvaders::ShipHandler/onEnterFrame() 

mise à jour est une fonction definently, donc je ne comprends vraiment pas ce que le problème est.

Ma configuration. J'utilise Flashdevelop. J'ai une classe principale, qui est définie en tant que classe de document dans mon fichier fla. J'ai une structure de package avec ma classe principale dans le dossier src, et mes sous-classes dans se.qmd.spaceInvaders et se.qmd.starLight. J'utilise également TweenMax et le garde dans la structure de paquet "normale" du dossier src.

Dans la classe principale ajouter à la scène une instance de la classe Legun - qui est aussi un « exporté » MovieClip dans le fichier fla, une instance de la classe StarHandler et une instance de la manœuvrier de classe. J'ai aussi un écouteur de clavier qui, à l'aide d'une fonction d'image, déplace mon instance de la classe LeGun. Fin, pas de problème. Le StarHandler fonctionne comme il se doit, et le ShipHandler fonctionne comme il se doit jusqu'à ce que j'appelle 1 ou 2 méthodes dans la classe Ship - qui est également un MovieClip "exporté" dans le fichier fla. La classe Ship est bien sûr la classe qui contient le Ship géré par ShipHandler.

J'inclus mes classes ShipHandler et Ship ci-dessous, et j'espère que cela ne rendra pas le post trop long. ShipHandler.as:

package se.qmd.spaceInvaders { 

import flash.display.MovieClip; 
import se.qmd.spaceInvaders.Ship; 
import flash.display.Stage; 
import flash.events.Event; 

public class ShipHandler extends MovieClip { 

    private var _shipArray:Array = []; 
    private const NUM_START_SHIPS:int = 25; 
    private var s:Stage = null; 

    private var _directionX:Number = 1; 
    private var _directionY:Number = 1; 
    private var _velocityX:Number; 
    private var _velocityY:Number; 

    private const YBORDER_TOP:int = 50; 
    private const YBORDER_BOTTOM:int = 525; 

    public function ShipHandler(o:Stage) { 

     s = o; // tar emot stage från main 
     createObjects(); 

     this.addEventListener(Event.ENTER_FRAME, onEnterFrame); 
    } 

    private function createObjects():void { 

     for (var i:int = 0; i < NUM_START_SHIPS; i++) { 

      var aShip:Ship = new Ship(); 
      aShip.x = Math.random() * (s.stageWidth - aShip.width) + aShip.width/2; 
      aShip.y = Math.random() * (s.stageHeight - aShip.height -135) + aShip.height/2 + 55; 
      this.addChild(aShip); 
      _shipArray.push(aShip); 
      aShip.startMove(Math.random(), Math.random()); 
     }   
    } 

    private function onEnterFrame(e:Event):void { 

     for (var i:int = 0; i < _shipArray.length; i++) { 

      var aShip:Ship = _shipArray[i] as Ship; 
      aShip.update(); 
     } 
    } 
} 
} 

Ship.as:

package se.qmd.spaceInvaders { 

import flash.display.MovieClip; 
import flash.events.Event; 

public class Ship extends MovieClip { 

    private var _directionX:Number = 1; 
    private var _directionY:Number = 1; 
    private var _velocityX:Number; 
    private var _velocityY:Number; 

    private const YBORDER_TOP:int = 50; 
    private const YBORDER_BOTTOM:int = 525; 

    public function Ship() { 

     //s = o; // tar emot stage 
     this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
    } 

    private function onAddedToStage(e:Event):void { 

     removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 

     this.width = 50; 
     this.height = 18;   
    } 

    public function update():void { 

     // x led vänster kant 
     if(this.x <= this.width/2) { 

      this.x = this.width/2; 
      _directionX *= -1; 
     } 

     // x led höger kant 
     if(this.x >= 800 - this.width/2) { 

      this.x = 800 - this.width/2; 
      _directionX *= -1; 
     } 

     // y led top kant 
     if(this.y <= YBORDER_TOP + this.height/2) { 

      this.y = YBORDER_TOP + this.height/2; 
      _directionY *= -1; 
     } 

     // y led botten kant 
     if(this.y >= YBORDER_BOTTOM - this.height/2) { 

      this.y = YBORDER_BOTTOM - this.height/2; 
      _directionY *= -1; 
     } 

     this.x += _velocityX * _directionX; 
     this.y += _velocityY * _directionY; 
    } 

    public function startMove(directionX:Number, directionY:Number):void { 

     trace(directionX, directionY); 
     _velocityX = 10; 
     _velocityY = 10; 

     if (directionX < 0.5) { 

      _directionX = -1; 
     } 

     if (directionY < 0.5) { 

      _directionY = -1; 
     } 
    } 

    public function changeDirection():void { 

     _directionX *= -1; 
     _directionY *= -1; 
    } 
} 
} 

Dès que j'appelle soit les méthodes startMove ou mise à jour de la manœuvrier, je reçois l'erreur je l'ai écrit ci-dessus. Apprécierait toute aide car il me semble que je dois faire quelque chose de fondamentalement faux ...

Répondre

2

Il me semble que Ship est juste un MovieClip (qui est une classe dynamique et donc le compilateur ne se plaint pas lorsque vous essayez d'accéder à une méthode qui n'existe pas à la compilation.) Les MovieClips n'ont pas de méthode update(), donc lorsque vous essayez de l'invoquer, il ne peut pas être trouvé sur l'instance Ship.

Le MovieClip de votre fichier FLA est-il réellement exporté sous la forme se.qmd.spaceInvaders.Ship (et pas seulement Ship)? Si c'est juste Ship, cela expliquerait pourquoi votre classe écrite n'est pas assignée comme la classe de vos graphismes de vaisseau, en laissant juste un simple MovieClip qui expliquerait cette erreur.

+0

solution si facile Eh bien, vous apprenez de tous les erreurs :) Merci! – Poppe76

0

J'ai essayé votre code original et cela fonctionne très bien pour moi. Je n'avais pas besoin de changer quoi que ce soit.

Compilez-vous à partir de l'IDE Flash? Dans ce cas, essayez de nettoyer le cache avec Contrôle> Supprimer les fichiers ASO comme ceci:

alt text


Essayez la coulée du navire à la place comme ceci:

private function onEnterFrame(e:Event):void { 

    for (var i:int = 0; i < _shipArray.length; i++) { 

      var aShip:Ship = Ship(_shipArray[i]); 
      if(aShip) 
       aShip.update(); 
      else 
       throw Error("ship is null at position " + i) 
    } 
} 

Ou utiliser au lieu Vector de Tableau:

var _shipArray : Vector.<Ship> = new Vector.<Ship>(); 
+0

Obtenir la même erreur si je tente votre premier exemple :( Je ne sais pas encore comment utiliser les vecteurs, et j'utilise un tableau de manière très similaire dans ma classe StarHandler, et ça marche là-bas .. . – Poppe76

+0

-vous obtenez la même erreur lorsque vous utilisez mon code ou que vous obtenez l'erreur personnalisée (navire est nulle à la position x)? – Mattias

+0

Je reçois la même erreur :( – Poppe76