ef:arcadeintroduction

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
ef:arcadeintroduction [2022/11/29 13:03] lehmannref:arcadeintroduction [2022/11/29 14:02] (aktuell) – [Akteure (Spieler, Gegner etc. hinzufügen (Sprites und Spritelists)] lehmannr
Zeile 2: Zeile 2:
 Nachdem man die Arcade-Bibliothek eingebunden hat (mittels ''import Arcade'') kann man die Objekte und Funktionen verwenden, die uns dadurch zur Verfügung gestellt werden. Nachdem man die Arcade-Bibliothek eingebunden hat (mittels ''import Arcade'') kann man die Objekte und Funktionen verwenden, die uns dadurch zur Verfügung gestellt werden.
 Zentral dabei sind vor allem die folgenden Funktionen: Zentral dabei sind vor allem die folgenden Funktionen:
- 
- 
- 
 <sxh python> <sxh python>
 import arcade import arcade
Zeile 29: Zeile 26:
 arcade.run() arcade.run()
 </sxh> </sxh>
 +
 +===== Der klassische Game-Loop =====
  
 Mit dem oben verwendeten Prinzip könnte man Grafiken in einem Fenster erstellen - dafür gibt es in Arcade auch etliche Funktionen (siehe [[https://api.arcade.academy/en/latest/api/drawing_primitives.html]] für die Zusammenstellung aller Zeichenfunktionen. Doch für ein echtes Spiel benötigen wir weitere Dinge: Mit dem oben verwendeten Prinzip könnte man Grafiken in einem Fenster erstellen - dafür gibt es in Arcade auch etliche Funktionen (siehe [[https://api.arcade.academy/en/latest/api/drawing_primitives.html]] für die Zusammenstellung aller Zeichenfunktionen. Doch für ein echtes Spiel benötigen wir weitere Dinge:
-  * Das Spiel soll mit x FPS (Frames pro Sekunde) immer neu gezeichnet werden (Game-Loop) 
-  * Im Spiel sollen verschiedene Akteure (Spieler, Gegner etc.) vorhanden sein (Sprites) 
-  * Das Spiel soll Events erkennen und darauf reagieren (Tastatureingaben, Mausbewegungen etc.) 
  
-Ein erstes Template, welches die erwähnten Aspekte beinhaltet, ist unten aufgelistet. Dabei ist zu beachtendass man eine neue Klasse definiert (hier ''MyGame''), die von der Klasse ''Arcade.Window'' abgeleitet wird und daher all ihre Methoden und Eigenschaften erbt. Im Konstruktor dieser Klasse (''__init__'') wird mit ''__super__'' der Konstruktor der Elternklasse ''Arcade.Window'' aufgerufen, welche das Fenster erstellt.+  * Das Spiel soll mit x FPS (Frames pro Sekunde) laufen (Game-Loop) 
 +  * Bei jedem "Tick" soll die Spielewelt neu berechnet und gezeichnet werden 
 + 
 +Um diese Funktionalitäten zu erreichenerstellt man eine neue Klasse (z.B, ''myGame''), die von der Klasse ''Arcade.Window'' abgeleitet wird und daher all ihre Methoden und Eigenschaften erbt. Im Konstruktor dieser Klasse (''__init__'') wird mit ''__super__'' der Konstruktor der Elternklasse ''Arcade.Window'' aufgerufen, welche das Fenster erstellt.
  
 In der neuen Klasse ''MyGame'' werden einige Standard-Methoden definiert, die für das Funktionieren des Spiels zentral sind:  In der neuen Klasse ''MyGame'' werden einige Standard-Methoden definiert, die für das Funktionieren des Spiels zentral sind: 
Zeile 41: Zeile 40:
 |< 1200px 200px  1000px>| |< 1200px 200px  1000px>|
 ^Befehl ^ Beispielbefehl/Erklärung ^ ^Befehl ^ Beispielbefehl/Erklärung ^
-| ''__init__'' | Der Konstruktor, er wird aufgerufen, wenn ein Objekt erstellt wird. Hier sollte der Konstruktor der Elternklasse aufgerufen werden mit ''__super__()'' |+| '' __init__ '' | Der Konstruktor, er wird aufgerufen, wenn ein Objekt erstellt wird. Hier sollte der Konstruktor der Elternklasse aufgerufen werden mit ''__super__()'' |
 | ''setup'' | ''setup'' ist sehr ähnlich wie der Konstruktor - hier werden die grundlegenden Dinge erledigt, wenn ein Spiel beginnt. Der Grund, warum man zum Konstruktor noch eine setup-Methode hinzufügt, ist, dass man z.B. nach dem Ende eines Spiels ein neues Spiel mit ''setup'' starten kann. | | ''setup'' | ''setup'' ist sehr ähnlich wie der Konstruktor - hier werden die grundlegenden Dinge erledigt, wenn ein Spiel beginnt. Der Grund, warum man zum Konstruktor noch eine setup-Methode hinzufügt, ist, dass man z.B. nach dem Ende eines Spiels ein neues Spiel mit ''setup'' starten kann. |
-| ''on_draw''Jedes Mal, wenn das Spielfenster neu gezeichnet wird, wird diese Funktion aufgerufen | +| ''on_update''''on_update'' wird x Mal pro Sekunde aufgerufen (Frage: wie gross ist x und wie kann man dies ändern?). Hier kann man die Veränderung der Spielewelt programmieren (Positionen der Objekte ändern etc) 
-| ''on_update'' | Jedes Mal, wenn der Spielzustand sich verändert, wird ''on_update'' aufgerufen |+| ''on_draw'' | Jedes Mal, wenn die Welt neu berechnet wurde (''on_update'') wird das Spielfenster neu gezeichnet. |
  
 +<sxh python>
 +import arcade
 +  
 +class MyGame(arcade.Window):
    
 +    def __init__(self, width, height, title):
 +        # Konstruktor der Elternklasse aufrufen
 +        super().__init__(width, height, title)
 +        # Hintergrundfarbe setzen
 +        arcade.set_background_color(arcade.color.AMAZON)
 + 
 +    def setup(self):
 +        # die x-Koordinate speichern als Objektvariable
 +        self.xValue = 0
 +       
 +    def on_draw(self):
 +        # Alles löschen
 +        self.clear()
 +        # Alles neu zeichnen.
 +        arcade.draw_circle_filled(self.xValue, 350, 20, arcade.color.BLACK)
 + 
 +    def on_update(self, delta_time):
 +          # x-Wert vergrössern
 +        self.xValue = self.xValue + 5 
 + 
 +def main():
 +    # Das Objekt der Klasse MyGame erstellen
 +    window = MyGame(800, 600, "Simple Example")
 +    window.setup() # setup aufrufen
 +    arcade.run()  # Game-Loop starten
 +
 +# Nur falls diese Datei direkt über Python aufgerufen wird, main() starten 
 +if __name__ == "__main__":
 +    main()
 +</sxh>
 +
 +===== Events (Keyboard, Mouse) verarbeiten =====
 +Wenn der Spieler eine Aktion tätigt (z.B. W,A,S,D auf der Tastatur drückt), soll dies im Spiel einen Einfluss haben. Diese Events (z.B. Tastaturbefehle) kann man auch in der Klasse ''arcade.Window'' abfragen.
 +Tipp: man kann innerhalb von ''on_key_press'' einfach ''print(key)'' schreiben, dann wird der Code der aktuell gedrückten Taste ausgegeben.
 +
 +<sxh Python>
 +import arcade
 +  
 +class MyGame(arcade.Window):
 + 
 +    def __init__(self, width, height, title):
 +        # Konstruktor der Elternklasse aufrufen
 +        super().__init__(width, height, title)
 +        # Hintergrundfarbe setzen
 +        arcade.set_background_color(arcade.color.AMAZON)
 + 
 +    def setup(self):
 +        # die x-Koordinate speichern als Objektvariable
 +        self.xValue = 0
 +        self.xVel = 0
 +       
 +    def on_draw(self):
 +        # Alles löschen
 +        self.clear()
 +        # Alles neu zeichnen.
 +        arcade.draw_circle_filled(self.xValue, 350, 20, arcade.color.BLACK)
 + 
 +    def on_update(self, delta_time):
 +          # x-Wert vergrössern
 +        self.xValue = self.xValue + self.xVel
 +    
 +    def on_key_press(self, key, modifiers):
 +        # Wenn eine Taste gedrückt wird
 +        if key == arcade.key.RIGHT:
 +            self.xVel = 5
 +        elif key == arcade.key.LEFT:
 +            self.xVel = -5
 +            
 +    def on_key_release(self, key, modifiers):
 +        self.xVel = 0
 + 
 +def main():
 +    # Das Objekt der Klasse MyGame erstellen
 +    window = MyGame(800, 600, "Simple Example")
 +    window.setup() # setup aufrufen
 +    arcade.run()  # Game-Loop starten
 +
 +# Nur falls diese Datei direkt über Python aufgerufen wird, main() starten 
 +if __name__ == "__main__":
 +    main()
 +</sxh>
 +<WRAP center round todo 80%>
 +**Aufgabe**
 +  * Verändere das Programm von oben, sodass man mit den Pfeiltasten den Kreis nach rechts, links, oben, unten bewegen kann.
 +  * Verändere das Programm von oben, sodass der Kreis an den Rändern des Fensters stehen bleibt.
 +  * Verändere das Programm von oben, sodass man die Bewegung des Kreises nicht abrupt ändern kann. Der Kreis soll quasi die Beschleunigung verändern, so dass man ihn schneller und langsamer machen kann. 
 +</WRAP>
 +
 +===== Akteure (Spieler, Gegner etc. hinzufügen (Sprites und Spritelists) =====
 +Mit den Konzepten von oben könnte man ein ganzes Spiel programmieren. Doch Arcade stellt uns weitere Hilfsobjekte und Methoden zur Verfügung, die das Programmieren eines Spiels erleichtern sollen. Die Klasse ''arcade.Sprite'' ist dazu da, Akteure wie den Spieler oder Gegner, oder sonstige Objekte hinzuzufügen. Hat man viele solcher Sprites, kann man diese in eine ''arcade.Spritelist'' fügen. 
 +Haben die Sprites eine eigene ''update-Methode'', so wird diese automatisch aufgerufen, wenn das Spiel "geupdated" wird. Dies erleichtert die Programmierung extrem. Hat man viele Sprites in einer Spritelist, so werden diese automatisch alle "geupdated", wenn die Spritelist "geupdated" wird.
 +
 +Sprites erstellt man, indem man eine Klasse von der Klasse ''arcade.Sprite'' ableitet.
 +
 +[[https://wiki.mathematix.ch/doku.php?id=ef:testprogramm| Studiere dieses Programm, um zu sehen, wie Sprites und Spritelists funktionieren]]
  • ef/arcadeintroduction.1669723439.txt.gz
  • Zuletzt geändert: 2022/11/29 13:03
  • von lehmannr