api:documentation:gng:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
api:documentation:gng:start [2022/06/08 15:50] – [Grundformen] Martin Pabst | api:documentation:gng:start [2023/06/11 15:09] (aktuell) – Martin Pabst | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Graphics' | ====== Graphics' | ||
- | <WRAP center round info 80%> | + | <WRAP center round info 70%> |
- | Die Autoren der [[https:// | + | Die Autoren der [[https:// |
* Die Vorlagen für die Buchaufgaben finden Sie [[https:// | * Die Vorlagen für die Buchaufgaben finden Sie [[https:// | ||
* Hier die [[http:// | * Hier die [[http:// | ||
- | Im Folgenden eine Beschreibung, | + | Im Folgenden eine Beschreibung, |
* Eine einführende Beschreibung der API ist mir nicht bekannt. Falls Sie eine kennen, schreiben Sie mir bitte, ich verlinke sie gerne! | * Eine einführende Beschreibung der API ist mir nicht bekannt. Falls Sie eine kennen, schreiben Sie mir bitte, ich verlinke sie gerne! | ||
- | * Falls Sie unten Fehler finden oder Verbesserungsbedarf, | + | * Falls Sie unten Fehler finden oder Verbesserungsbedarf, |
</ | </ | ||
Zeile 52: | Zeile 52: | ||
< | < | ||
- | <div class=" | + | <div class=" |
<script type=" | <script type=" | ||
Zeile 70: | Zeile 70: | ||
* Das **Rechteck** ist 100 Pixel breit, 100 Pixel hoch und achsenparallel. Seine Linke obere Ecke befindet sich bei (10/10). Drehpunkt ist sein Diagonalenschnittpunkt. Die Methode '' | * Das **Rechteck** ist 100 Pixel breit, 100 Pixel hoch und achsenparallel. Seine Linke obere Ecke befindet sich bei (10/10). Drehpunkt ist sein Diagonalenschnittpunkt. Die Methode '' | ||
* Der **Kreis** hat einen Radius von 50 Pixel, sein Mittelpunkt (= Drehpunkt) befindet sich bei (60/60). Die Methode '' | * Der **Kreis** hat einen Radius von 50 Pixel, sein Mittelpunkt (= Drehpunkt) befindet sich bei (60/60). Die Methode '' | ||
- | * Die Eckpunkte des **Dreiecks** haben die Koordinaten '' | + | * Die Eckpunkte des **Dreiecks** haben die Koordinaten '' |
* Das Text-Objekt schreibt initial " | * Das Text-Objekt schreibt initial " | ||
Zeile 102: | Zeile 102: | ||
Die Klasse **GText** besitzt die Attribute '' | Die Klasse **GText** besitzt die Attribute '' | ||
+ | ===== Mögliche Farbbezeichner ===== | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
===== Die Klasse GTurtle ===== | ===== Die Klasse GTurtle ===== | ||
< | < | ||
- | <div class=" | + | <div class=" |
<script type=" | <script type=" | ||
Zeile 129: | Zeile 146: | ||
* '' | * '' | ||
* '' | * '' | ||
- | * '' | + | * '' |
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | \\ | ||
+ | **Attribute der Klasse GTurtle: | ||
+ | * ' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
</ | </ | ||
+ | |||
+ | ===== Mögliche Parameterwerte der Methode SondertasteGedrückt ===== | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | |||
+ | |||
+ | ===== Die Klasse Figur ===== | ||
+ | <WRAP center round tip 60%> | ||
+ | Ein Objekt der Klasse '' | ||
+ | Ein Objekt der Klasse Figur kann - in Maßen - auch animiert werden. Dazu ist es jedoch nötig, für jeden Animationsschritt alle Bestandteile der Figur zu löschen und neu zu zeichnen. \\ \\ | ||
+ | Die Idee hinter der Klasse '' | ||
+ | </ | ||
+ | |||
+ | ==== Beispiel: Mit den Cursortasten steuerbares Männchen ==== | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | SystemTools.setSpeed(-1); | ||
+ | println(" | ||
+ | var m = new Männchen(); | ||
+ | m.nachLinksSchauen(); | ||
+ | |||
+ | |||
+ | class Männchen extends Figur { | ||
+ | |||
+ | void nachLinksSchauen() { | ||
+ | EigeneFigurLöschen(); | ||
+ | FigurteilFestlegenRechteck(-20, | ||
+ | FigurteilFestlegenEllipse(-40, | ||
+ | FigurteilFestlegenDreieck(0, | ||
+ | FigurteilFestlegenEllipse(-20, | ||
+ | } | ||
+ | |||
+ | void nachRechtsSchauen() { | ||
+ | EigeneFigurLöschen(); | ||
+ | FigurteilFestlegenRechteck(-20, | ||
+ | FigurteilFestlegenEllipse(-40, | ||
+ | FigurteilFestlegenDreieck(0, | ||
+ | FigurteilFestlegenEllipse(20, | ||
+ | } | ||
+ | |||
+ | void verschieben(int dx, int dy) { | ||
+ | PositionSetzen(XPositionGeben() + dx, YPositionGeben() + dy); | ||
+ | } | ||
+ | |||
+ | | ||
+ | { | ||
+ | if(taste == 37) | ||
+ | { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | | ||
+ | { | ||
+ | verschieben(0, | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | if(taste == 39) | ||
+ | { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | | ||
+ | { | ||
+ | verschieben(0, | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | ==== Attribute der Klasse Figur ==== | ||
+ | |||
+ | <WRAP center round info 80%> | ||
+ | * **int winkel**: Blickrichtung der Figur in Grad. 0° entspricht nach rechts, 90° nach oben usw. | ||
+ | * **int größe**: " | ||
+ | * **boolean sichtbar**: ist genau dann true, wenn die Figur sichtbar ist. | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Methoden der Klasse Figur ==== | ||
+ | |||
+ | <WRAP center round info 80%> | ||
+ | * **void GrößeSetzen(int größe)**: Setzt die Größe der Figur (d.h. streckt sie entsprechend). '' | ||
+ | * **void Drehen(int winkel)**: Dreht die Figur um den angegebenen Winkel im Grad. Positive Werte bewirken eine Drehung entgegen dem Uhrzeigersinn. | ||
+ | * **void Gehen(int länge)**: Verschiebt die Figur um die angegebene Länge (in Pixeln) in die aktuelle Blickrichtung. Die initiale Blickrichtung ist nach rechts. Sie kann durch die Methode Drehen verändert werden. | ||
+ | * **void PositionSetzen**: | ||
+ | * **void ZumStartpunktGehen()**: | ||
+ | * **void WinkelSetzen(int winkel)**: Dreht die Figur so, dass der Blickwinkel der Figur in die angegebene Richtung zeigt. 0° => nach rechts (initial), 90°: => nach oben, usw.. | ||
+ | * **int WinkelGeben()**: | ||
+ | * **int XPositionGeben()**: | ||
+ | * **int YPositionGeben()**: | ||
+ | * **void SichtbarkeitSetzen(boolean sichtbarkeit)**: | ||
+ | * **void GanzNachVornBringen()**: | ||
+ | * **void GanzNachHintenBringen()**: | ||
+ | * **void NachVornBringen()**: | ||
+ | * **void NachHintenBringen()**: | ||
+ | * **void EigeneFigurLöschen()**: | ||
+ | * **boolean Berührt()**: | ||
+ | * **boolean Berührt(string farbe)**: Gibt genau dann true zurück, wenn die Figur mit einem graphischen Objekt der angegebenen Farbe kollidiert. | ||
+ | * **boolean Berührt(Object objekt)**: Gibt genau dann true zurück, wenn die Figur mit dem übergebenen graphischen Objekt kollidiert. | ||
+ | * **void FigurteilFestlegenDreieck(int x1, int y1, int x2, int y2, int x3, int y3, String farbe)**: Erzeugt ein neues, dreieckiges Element und fügt es der Figur hinzu. x1/y1, x2/y2 und x3/y3 sind die drei Eckpunkte des Dreiecks. Die Koordinaten sind relativ zum ' | ||
+ | * **void FigurteilFestlegenEllipse(int x, int y, int breite, int höhe, String farbe)**: Erzeugt eine Ellipse und fügt sie der Figur hinzu. x/y ist die linke obere Ecke der bounding box der Ellipse (d.h. des kleinsten achsenparallelen umgebenden Rechtecks), '' | ||
+ | * **void FigurteilFestlegenRechteck(int x, int y, int breite, int höhe, String farbe)**: Erzeugt ein achsenparalleles Rechteck und fügt es der Figur hinzu. x/y ist die linke obere Ecke des Rechtecks. Die Koordinaten sind relativ zum ' | ||
+ | * **void AktionAusführen()**: | ||
+ | * **void TasteGedrückt(char taste)**: Diese Methode wird aufgerufen, wenn der Benutzer eine Nicht-Sondertaste drückt. Übergeben wird das Zeichen, das der gedrückten Taste entspricht. Diese Methode kann überschrieben und so mit eigenen Anweisungen gefüllt werden, damit das eigene Programm auf Tastendrucke reagieren kann. | ||
+ | * **void SonderTasteGedrückt(int taste)**: Diese Methode wird aufgerufen, wenn der Benutzer eine Sondertaste drückt. Übergeben wird das Zeichen, das der gedrückten Taste entspricht. Diese Methode kann überschrieben und so mit eigenen Anweisungen gefüllt werden, damit das eigene Programm auf Tastendrucke reagieren kann. Zur Kodierung der Sondertasten sie Abschnitt ' | ||
+ | * **void MausGeklickt(int x, int y, int anzahl)**: Diese Methode wird aufgerufen, wenn die linke Maustaste (irgendwo im Zeichenbereich, | ||
+ | </ | ||
+ | |||
+ | ===== Zeichenfenster, | ||
+ | <WRAP center round tip 80%> | ||
+ | Das Zeichenfenster besitzt statische Methoden zur Steuerung des Taktgebers, zum Auslesen der geometrischen Daten der Malfläche und zum Registrieren von Aktionsempfängern, | ||
+ | </ | ||
+ | |||
+ | ==== Methoden der Klasse Zeichenfenster ==== | ||
+ | <WRAP center round info 80%> | ||
+ | * **static int MalflächenBreiteGeben()**: | ||
+ | * **static int MalflächenHöheGeben()**: | ||
+ | * **static void TaktgeberStarten()**: | ||
+ | * **static void TaktgeberStoppen()**: | ||
+ | * **static void TaktdauerSetzen(int dauer)**: Setzt die Taktdauer des Zeitgebers in Millisekunden | ||
+ | * **static void AktionsEmpfängerEintragen(AktionsempfaengerNeu)**: | ||
+ | * **static void AktionsEmpfängerEntfernen(Aktionsempfaenger alt)**: Trägt einen Aktionsempfänger wieder aus (Observer-Pattern) | ||
+ | </ | ||
+ | |||
+ | ==== Beispiel 1: Einfacher Timer durch Implementieren des Interfaces Aktionsempfänger ==== | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | SystemTools.setSpeed(-1); | ||
+ | Zeichenfenster.AktionsEmpfängerEintragen(new Zeitanzeige()); | ||
+ | Zeichenfenster.TaktdauerSetzen(1000); | ||
+ | Zeichenfenster.TaktgeberStarten(); | ||
+ | println(" | ||
+ | while(true); | ||
+ | |||
+ | |||
+ | class Zeitanzeige implements Aktionsempfaenger { | ||
+ | |||
+ | GText textfeld = new GText(); | ||
+ | int zeit = 0; | ||
+ | boolean running = true; | ||
+ | |||
+ | | ||
+ | textfeld.TextGrößeSetzen(100); | ||
+ | textfeld.TextSetzen(" | ||
+ | } | ||
+ | |||
+ | public void Ausführen() { | ||
+ | if(running) { | ||
+ | zeit++; | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | public void Taste(char taste) { | ||
+ | if(taste == ' | ||
+ | | ||
+ | } | ||
+ | | ||
+ | | ||
+ | } else { | ||
+ | println(" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | public void SonderTaste(int taste) { | ||
+ | //TODO: Methode füllen | ||
+ | } | ||
+ | |||
+ | public void Geklickt(int x, int y, int anzahl) { | ||
+ | //TODO: Methode füllen | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Beispiel 2: Einfacher Timer durch Erben von der Klasse Ereignisbehandlung ==== | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | SystemTools.setSpeed(-1); | ||
+ | Zeichenfenster.TaktdauerSetzen(200); | ||
+ | Zeichenfenster.TaktgeberStarten(); | ||
+ | |||
+ | Test t = new Test(); | ||
+ | |||
+ | while (true); | ||
+ | |||
+ | |||
+ | |||
+ | class Test extends Ereignisbehandlung { | ||
+ | |||
+ | int n = 0; | ||
+ | |||
+ | | ||
+ | println(n++); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Die folgenden drei Methoden können bei Bedarf ebenfalls | ||
+ | * überschrieben werden: | ||
+ | */ | ||
+ | | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | |||
+ | } | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
api/documentation/gng/start.txt · Zuletzt geändert: 2023/06/11 15:09 von Martin Pabst