g9:uebungen:klassen_anwenden:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | g9:uebungen:klassen_anwenden:start [2024/08/31 10:03] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Vorhandene Klassen nutzen ====== | ||
+ | Bevor wir eigene Klassen programmieren lernen wir, wie wir Objekte zu bereits bestehenden Klassen erzeugen können. Wir beginnen mit Grafikklassen wie '' | ||
+ | |||
+ | |||
+ | ===== Objekte instanzieren ( = erzeugen) ===== | ||
+ | Im folgenden Programm erzeugen wir zwei Circle-Objekte und ein Rectangle-Objekt. In Java verwendet man dazu den Operator '' | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | new Circle(400, 200, 100); // Kreis mit Mittelpunkt (300, 200) und Radius 100 | ||
+ | new Circle(400, 400, 50); // Kreis mit Mittelpunkt (300, 400) und Radius 50 | ||
+ | |||
+ | new Rectangle(50, | ||
+ | // 100 breit, 160 hoch</ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | {{ : | ||
+ | <WRAP center round info 60%> | ||
+ | Durch die Anweisung '' | ||
+ | **Beachte: | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | <div style=" | ||
+ | </ | ||
+ | ===== Methoden aufrufen ===== | ||
+ | {{ : | ||
+ | Wir wollen die Füllfarbe eines Kreises, seine Größe, Position usw. verändern indem wir Methoden des '' | ||
+ | <code learnj> | ||
+ | | ||
+ | </ | ||
+ | Der Datentyp der Objektvariable '' | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Circle k = new Circle(250, 200, 100); | ||
+ | k.setFillColor(Color.red); | ||
+ | k.move(100, -50); | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Führe das Programm in Einzelschritten aus ("Step over": {{: | ||
+ | |||
+ | <WRAP center round tip 80%> | ||
+ | Der Editor hilft Dir beim Tippen, indem er Dir basierend auf Deinen Eingaben laufend Vorschläge macht ([[https:// | ||
+ | |||
+ | {{ : | ||
+ | </ | ||
+ | |||
+ | ==== Beispiel 1: Rakete ==== | ||
+ | Mit dem Gelernten können wir jetzt schon kleine Animationen erstellen: | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Triangle spitze = new Triangle(400, | ||
+ | spitze.setFillColor(Color.white); | ||
+ | Rectangle tank = new Rectangle(380, | ||
+ | tank.setFillColor(Color.lightblue); | ||
+ | Triangle triebwerk1 = new Triangle(385, | ||
+ | triebwerk1.setFillColor(Color.gray); | ||
+ | Triangle triebwerk2 = new Triangle(415, | ||
+ | triebwerk2.setFillColor(Color.gray); | ||
+ | |||
+ | for(int i = 0; i < 600; i++) { | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | ==== Verbesserung: | ||
+ | Dass im obigen Programm die Bestandteile der Rakete einzeln verschoben werden müssen, ist sehr ungünstig. Bei langsamer Ausführungsgeschwindikeit sieht man die Teile sogar einzeln vorwärtsruckeln. Und stell' Dir vor, wir wollten die Rakete um ihren Schwerpunkt drehen: Was würde passieren, wenn ab Zeile 11 steht: | ||
+ | <code learnj> | ||
+ | spitze.rotate(2); | ||
+ | tank.rotate(2); | ||
+ | triebwerk1.rotate(2); | ||
+ | triebwerk2.rotate(2); | ||
+ | </ | ||
+ | Probier' | ||
+ | Die Lösung der Probleme besteht darin, die einzelnen Objekte zu gruppieren, genauso wie in vektororientierten Zeichenprogrammen. Zu diesem Zweck gibt es die Klasse '' | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Triangle spitze = new Triangle(400, | ||
+ | spitze.setFillColor(Color.white); | ||
+ | Rectangle tank = new Rectangle(380, | ||
+ | tank.setFillColor(Color.lightblue); | ||
+ | Triangle triebwerk1 = new Triangle(385, | ||
+ | triebwerk1.setFillColor(Color.gray); | ||
+ | Triangle triebwerk2 = new Triangle(415, | ||
+ | triebwerk2.setFillColor(Color.gray); | ||
+ | |||
+ | Group rakete = new Group(); | ||
+ | rakete.add(spitze, | ||
+ | |||
+ | for(int i = 0; i < 600; i++) { | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Beispiel 2: gedrehte Rechtecke ==== | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | new World(800, 600); | ||
+ | for(int i = 0; i < 36; i++){ | ||
+ | | ||
+ | | ||
+ | | ||
+ | }</ | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | Jedes der 36 Rechtecke hat initial dieselbe Position. Das erste wird um 10° um mit Drehpunkt (400,300) gedreht, das zweite um 20°, das dritte um 30° usw. Hier eine Schemadarstellung: | ||
+ | {{ : | ||
+ | |||
+ | ==== Beispiel 3: Sinuskurve ==== | ||
+ | < | ||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | new World(800, 600); | ||
+ | for(int i = 0; i < 80; i++){ | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Die Parameter beim Instanzieren von '' | ||
+ | |||
+ | ==== Beispiel 4: Farbige Rechtecke ==== | ||
+ | < | ||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | for(int zeile = 0; zeile < 10; zeile++) { | ||
+ | | ||
+ | | ||
+ | Rectangle r = new Rectangle(spalte * 50 + 30, zeile * 50 + 30, 40, 40); | ||
+ | | ||
+ | double alpha = Math.abs(zeile - spalte) / 3.0; | ||
+ | r.setFillColor(new Color(zeile * 25, 0, spalte * 25), alpha); | ||
+ | r.rotate((zeile + spalte) * 10); | ||
+ | |||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | ==== Aufgabe 1: " | ||
+ | {{ : | ||
+ | Schreibe ein Programm, das ein einfaches Auto (siehe Bild rechts) zeichnet und es dann von links nach rechts fahren lässt! | ||
+ | < | ||
+ | <div style=" | ||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | // Auto-Aufgabe: | ||
+ | </ | ||
+ | |||
+ | <script type=" | ||
+ | ## Tipp 1: | ||
+ | - Du brauchst zwei Objekte der Klasse `Kreis` und ein Objekt der Klasse `Rechteck`. | ||
+ | - Damit das Auto sich ruckelfrei bewegt solltest Du wie im verbesserten Raketenprogram oben die Klasse `Group` verwenden. | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | <script type=" | ||
+ | new World(800, 600); | ||
+ | for(int i = 0; i < 30; i++){ | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | --> | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
g9/uebungen/klassen_anwenden/start.txt · Zuletzt geändert: 2024/08/31 10:03 von 127.0.0.1