2016-05-21 3 views
1

Ich habe eine Klasse Square und eine Klasse Circle.ActionScript Klassen Referenz

Das ist meine Klasse Circle:

public class Circle extends MovieClip 
    { 
     var growthRate:Number = 2; 

     public function Circle() 
     { 

      addEventListener(Event.ENTER_FRAME, grow); 

     } 
     function grow(e :Event):void 
      { 
       e.target.width +=growthRate; 
       e.target.height +=growthRate; 
      } 

    } 

Ich brauche in einer Funktion aus Form wächst der Kreis zu stoppen.

public function Square() { 
      buttonMode = true; 
      addEventListener(MouseEvent.MOUSE_DOWN, down); 

     } 

     protected function down (event: MouseEvent):void 
     { 
     //here i need to stop the circle 
     } 

Ich weiß nicht, wie man eine Beziehung mit der Circle-Klasse macht, um den wachsenden Kreis zu stoppen.

Vielen Dank im Voraus.

+1

Wie werden die Quadrate und Kreise erzeugt? Die Antwort wird davon abhängen. – Jezzamon

+0

und was bedeutet _ "... innerhalb einer Funktion von Shape" _ genau? Befinden sich Ihre Codes in separaten MovieClips oder importieren Sie diese beiden Klassen in eine separate (dritte) Hauptklasse? –

Antwort

1

Ich weiß nicht, wie man eine Beziehung mit der Circle-Klasse herstellt, um den wachsenden Kreis zu stoppen.

Das liegt daran, dass Sie nicht mit dem Code haben können, den Sie gerade haben. Es gibt nichts in Ihrer Klasse, das von außen zugänglich ist (public), das das Wachstum stoppt. Aber es gibt nicht einmal etwas in Ihrer Klasse, das dies tut. Die Funktionalität ist einfach nicht da.

Also zuerst die gewünschte Funktionalität erstellen. und stellen Sie es zur Verfügung public.

Hier ist, wie Sie Ihre Circle Klasse aussehen könnte:

public class Circle extends Sprite 
{ 
    private var growthRate:Number = 2; 

    public function Circle() 
    { 
     // nothing here 

     // this is just to create a circle graphic, if you have artwork in your library symbol, you do not need this 
     graphics.beginFill(0xffffff * Math.random()); 
     graphics.drawCircle(0, 0, 10 + 30 * Math.random()); 
     graphics.endFill(); 
    } 

    public function startGrowing(rate:Number = 0):void 
    { 
     if(rate != 0) 
     { 
      growthRate = rate; 
     } 

     addEventListener(Event.ENTER_FRAME, grow); 
    } 

    public function stopGrowing():void 
    { 
     removeEventListener(Event.ENTER_FRAME, grow); 
    } 

    private function grow(e:Event):void 
    { 
     width += growthRate; 
     height += growthRate; 
    } 
} 

Achten Sie auf

  1. Konstruktor: Ich schaffe es einen Kreisgraphik mit Code. Wie der Kommentar sagt, wenn Circle eine Klasse ist, die einem Bibliothekssymbol zugeordnet ist, brauchen Sie das nicht, da Sie das Bildmaterial bereits im Symbol erstellt haben.
  2. die Super-Klasse: Es ist Sprite. Dies sollte Ihre Standard-Oberklasse sein. Der einzige wirkliche Grund, MovieClip zu verwenden, ist, wenn Sie eine Zeitachsenanimation haben. Es sieht nicht so aus als hättest du etwas von dem, was du gepostet hast, also empfehle ich Sprite.
  3. die beiden neuen öffentlichen Methoden: startGrowing und stopGrowing, die genau das tun, was ihre Namen bedeuten. startGrowing hat einen optionalen Parameter, um mit einer anderen Wachstumsrate zu wachsen.
  4. das Fehlen von e.target: was hier unnötig ist.

Eine einfache Demo dieser Code sieht wie folgt aus:

var circle:Circle = new Circle(); 
circle.x = 200; 
circle.y = 200; 
addChild(circle); 

circle.startGrowing(); 
//circle.startGrowing(1); // grow slowly 
//circle.startGrowing(5); // grow fast 

das Wachstum zu stoppen, stoppen die ENTER_FRAMEEvent hören.

So weit so gut, jetzt zu Ihrer eigentlichen Frage:

wie eine Beziehung mit der Circle-Klasse

protected function down (event: MouseEvent):void 
{ 
    //here i need to stop the circle 
} 

Sie denken, dass Sie diese Verbindung in Ihrem Square machen sollten Klasse, aber du liegst falsch. Es ist sehr schlechte Übung, um zwei Klassen auf diese Weise zu verbinden. Sie möchten, dass die Klassen so individuell wie möglich sind.

Denken Sie darüber nach wie Telefone. Hat Ihr Telefon einen direkten Weg zu einem bestimmten anderen Telefon? Nein. Es hat die Fähigkeit, sich mit jedem Telefon zu verbinden, was es universeller nützlich macht als ein Telefon, das mit einem anderen Telefon fest verdrahtet ist.

Sie stellen die Verbindung außerhalb beider Klassen mit Ereignissen her. Das ist so, als würde Ihr Telefon mit einer Nummer, die es anrufen möchte, an das Netzwerk anrufen. Das Netzwerk ermittelt dann, wie das andere Telefon mit dieser Nummer zu finden ist und wie die Verbindung aufgebaut wird.

Als kurzes Zwischenspiel, und so dass wir es auf der gleichen Seite sind, hier ist die Square Klasse, die ich verwende:

public class Square extends Sprite 
{ 
    public function Square() 
    { 
     // nothing here 

     // this is just to create a circle graphic, if you have artwork in your library symbol, you do not need this 
     graphics.beginFill(0xffffff * Math.random()); 
     graphics.drawRect(0, 0, 100, 100); 
     graphics.endFill(); 
    } 
} 

Wie Sie sehen können, es hat nur einen Konstruktor, in dem ich programmatisch ein Rechteck zeichnen. Wenn Sie das gewünschte Bildmaterial in Ihrem Bibliothekssymbol haben, brauchen Sie das nicht. In diesem Fall wäre der Konstruktor leer und die gesamte Klassendatei wäre leer. In diesem Fall benötigen Sie nicht einmal eine Klassendatei. Ordnen Sie das Bibliothekssymbol einfach dem Namen zu. Die Square ist nur ein Grafik-Asset, ohne dass ein Code daran angehängt ist.

Hier ist ein vollwertiges Dokumentenklasse beiden Klassen:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.MouseEvent; 

    public class Main extends Sprite 
    { 
     private var circle:Circle; 

     public function Main() 
     { 
      circle = new Circle(); 
      circle.x = 200; 
      circle.y = 200; 
      addChild(circle); 

      circle.startGrowing(1); 

      var square:Square = new Square(); 
      addChild(square); 

      square.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); 
     } 

     private function onMouseDown(e:MouseEvent):void 
     { 
      circle.stopGrowing(); 
     } 
    } 
} 

Wie Sie sehen können, der Ereignis-Listener wird in der Dokumentenklasse hinzugefügt und auch die Funktion, die ausgeführt wird, wenn das Ereignis in Main auftritt.

Hier ist eine Variante davon ohne das Quadrat. Dieses Mal, wenn Sie auf den Kreis klicken, um stoppen sie wächst:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.MouseEvent; 

    public class Main extends Sprite 
    { 
     private var circle:Circle; 

     public function Main() 
     { 
      circle = new Circle(); 
      circle.x = 200; 
      circle.y = 200; 
      addChild(circle); 

      circle.startGrowing(1); 

      circle.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); 
     } 

     private function onMouseDown(e:MouseEvent):void 
     { 
      circle.stopGrowing(); 
     } 
    } 
} 

Wie Sie sehen können, so dass die Verbindung außerhalb beider Klassen mit Ereignissen gibt Ihnen eine Menge an Flexibilität Draht Dinge auf eine andere Art und Weise auf. Genauso wie ein Telefon, das direkt an ein Netzwerk anstatt an ein anderes Telefon angeschlossen wird.

+0

vielen dank !!!! – Gina

+0

Dies ist eine fabelhafte Antwort! Ein großes Lob für die Menge an Details und die Vollständigkeit des Beispielcodes. Das ist die Art von Antwort, die mich wünschen lässt, es gäbe einen "Mega Upvote" Button! – Brian

Verwandte Themen