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
- 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.
- 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
.
- 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.
- 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_FRAME
Event
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.
Wie werden die Quadrate und Kreise erzeugt? Die Antwort wird davon abhängen. – Jezzamon
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? –