api:documentation:gng:start
no way to compare when less than two revisions
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | api:documentation:gng:start [2024/08/31 10:03] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Graphics' | ||
+ | <WRAP center round info 70%> | ||
+ | Die Autoren der [[https:// | ||
+ | * Die Vorlagen für die Buchaufgaben finden Sie [[https:// | ||
+ | * Hier die [[http:// | ||
+ | |||
+ | 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! | ||
+ | * Falls Sie unten Fehler finden oder Verbesserungsbedarf, | ||
+ | </ | ||
+ | |||
+ | ===== Turtle -> GTurtle ===== | ||
+ | <WRAP center round important 80%> | ||
+ | Leider gibt es zwei Namensüberschneidungen zwischen der API der Online-IDE und der Graphics and Games-API. | ||
+ | * Die Klasse '' | ||
+ | * Die Klasse '' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Aktivieren der API in der Online-IDE ===== | ||
+ | Da die Klassen der Graphics and Games-API stark unterschiedlichen Konventionen folgen wie die Standardklassen der Online-IDE (Bezeichner von Methoden großgeschrieben, | ||
+ | - Rechtsklick auf den Workspace -> Einstellungen | ||
+ | - Es öffnet sich ein Modales Fenster, das alle möglichen optionalen APIs zeigt. Hier den Haken bei " | ||
+ | |||
+ | ===== Aktivieren der API in der Embedded-IDE ===== | ||
+ | Möchte man die Graphics and Games-Bibliothek in den Programmierkästen der **Embedded-IDE** nutzen, so muss bei den Einstellungen das Array " | ||
+ | <code html> | ||
+ | <div class=" | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | }"> | ||
+ | <script type=" | ||
+ | int anzahl = Input.readInt(" | ||
+ | for(int i = 0; i < anzahl; i++){ | ||
+ | println(" | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Koordinatensystem ===== | ||
+ | <WRAP center round info 80%> | ||
+ | Das Koordinatensystem der Graphics and Games-API ist 800 Pixel breit und 600 Pixel hoch. Die x-Achse zeigt nach rechts, die y-Achse zeigt nach **unten**. Der Hintergrund ist immer hellgrau gefärbt. | ||
+ | </ | ||
+ | |||
+ | ===== Grundformen ===== | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Rechteck r = new Rechteck(); | ||
+ | r.Verschieben(500, | ||
+ | Dreieck d = new Dreieck(); | ||
+ | d.Verschieben(350, | ||
+ | Kreis k = new Kreis(); | ||
+ | k.Verschieben(200, | ||
+ | GText t = new GText(); // Schreibt links oben ganz klein: " | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP center round info 80%> | ||
+ | Die Klassen '' | ||
+ | * 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 '' | ||
+ | * Die Eckpunkte des **Dreiecks** haben die Koordinaten '' | ||
+ | * Das Text-Objekt schreibt initial " | ||
+ | |||
+ | \\ | ||
+ | **Gemeinsame Methoden der Grundformen: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | | ||
+ | **Gemeinsame Attribute der Grundformen: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | </ | ||
+ | |||
+ | ==== Besondere Attribute/ | ||
+ | === Rechteck, Dreieck === | ||
+ | Die Klassen **Rechteck** und Dreieck besitzen die Attribute '' | ||
+ | === Kreis === | ||
+ | Die Klasse **Kreis** besitzt das Attribut '' | ||
+ | === GText === | ||
+ | Die Klasse **GText** besitzt die Attribute '' | ||
+ | |||
+ | ===== Mögliche Farbbezeichner ===== | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | |||
+ | ===== Die Klasse GTurtle ===== | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | GTurtle t = new GTurtle(); | ||
+ | t.FarbeSetzen(" | ||
+ | t.Gehen(200); | ||
+ | t.Drehen(45); | ||
+ | t.FarbeSetzen(" | ||
+ | t.Gehen(200); | ||
+ | t.WinkelSetzen(0); | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP center round info 80%> | ||
+ | Die Klasse '' | ||
+ | Die Turtle wird durch ein gleichschenkliges Dreick dargestellt, | ||
+ | **Methoden der Turtle:** | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | | ||
+ | **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: 2024/08/31 10:03 von 127.0.0.1