Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
talit:python_pygame [2022-08-24 11:27] – [Vorgehen] scatalit:python_pygame [2024-08-08 12:37] (aktuell) – [2.1 Tutorial] sca
Zeile 42: Zeile 42:
 Für dein/euer PyGame-Projekt ist es Pflicht, dieses **objektorientiert** zu programmieren. Verwende dafür das **Template** unten. Theoretisch kann man das ganze Game in einem einzigen File programmieren. Gerade für grössere Projekte und wenn man zusammen am gleichen Code arbeitet, so lohnt es sich, das Projekt auf mehrere Files aufzuteilen. Wir verfolgen hier den Grundsatz: **für jede Klasse ein eigenes File**. Für dein/euer PyGame-Projekt ist es Pflicht, dieses **objektorientiert** zu programmieren. Verwende dafür das **Template** unten. Theoretisch kann man das ganze Game in einem einzigen File programmieren. Gerade für grössere Projekte und wenn man zusammen am gleichen Code arbeitet, so lohnt es sich, das Projekt auf mehrere Files aufzuteilen. Wir verfolgen hier den Grundsatz: **für jede Klasse ein eigenes File**.
  
-{{ :talit:template_pygame_2022.zip |Template herunterladen}}+{{ :talit:template_pygame_2022_v02.zip |Template herunterladen}}
  
 <nodisp 1> <nodisp 1>
Zeile 48: Zeile 48:
  
 <code python main.py> <code python main.py>
-from settings import * +from settings import Settings 
-from player import * +from game import Game 
-from game import *+import os 
 +import sys
  
 """ """
Zeile 59: Zeile 60:
  
 if __name__ == "__main__": if __name__ == "__main__":
-    Game().play() +    os.chdir(sys.path[0]) # changes current working directory to file directory 
-    </code>+ 
 +    # define some settings 
 +    settings_default = Settings() 
 +    settings_slow = Settings(speed=1) 
 + 
 +    # create game object and play 
 +    game = Game(settings_default) 
 +    game.play() 
 +</code>
  
 <code python settings.py> <code python settings.py>
-""" +class Settings: 
-file contains all settings +    """ 
-remember: use CAPITAL letters for CONSTANTS (variables that don't change) +    class containing all settings 
-"""+    remember: use CAPITAL letters for CONSTANTS (variables that don't change) 
 +    ""
 +    def __init__(self,win_height=800,win_width=500,bg_color=(255,255,255),fps=30,speed=12): 
 +        self.NAME = "sloppy bird"
  
-# WINDOWS SIZE +        # WINDOWS SIZE 
-WIN_HEIGHT = 800 +        self.WIN_HEIGHT = win_height 
-WIN_WIDTH = 500 +        self.WIN_WIDTH = win_width 
-  +         
-DEFINE SOME COLORS +        COLOR SETTINGS 
-WHITE = (255, 255, 255) +        self.BG_COLOR = bg_color 
-BLACK = (0, 0, 0) +     
-RED = (255, 0, 0) +        # FRAMERATE 
-GREEN = (0, 255, 0) +        self.FPS = fps # frames per second 
-BLUE = (0, 0, 255) +        self.TIME_DELAY = int(1000 / self.FPS) # calculate delay time between two frames
-BG_COLOR = WHITE +
-  +
-# FRAMERATE +
-FPS = 30 # frames per second +
-TIME_DELAY = int(1000 / FPS) # calculate delay time between two frames+
  
-# GAME CONSTANTS +        # GAME CONSTANTS 
-SPEED = 12+        self.SPEED = speed
 </code> </code>
  
 <code python game.py> <code python game.py>
 +import os
 import pygame import pygame
 import sys import sys
-from settings import * +from player import Player 
-from player import * +from ball import Ball
-from ball import *+
  
 class Game: class Game:
Zeile 99: Zeile 106:
     Main GAME class     Main GAME class
     """     """
-    def __init__(self):+    def __init__(self,settings):
         pygame.init()         pygame.init()
         pygame.font.init()         pygame.font.init()
-        self.time_delay = TIME_DELAY +        self.settings = settings 
-        self.screen = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT)) # create screen which will display everything +        self.time_delay = self.settings.TIME_DELAY 
-        self.win = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT)+        size = (self.settings.WIN_WIDTH, self.settings.WIN_HEIGHT) 
-        pygame.display.set_caption("Bouncing Balls") # Game title+        self.screen = pygame.display.set_mode(size) # create screen which will display everything 
 +        self.win = pygame.display.set_mode(size
 +        pygame.display.set_caption(self.settings.NAME) # Game title
    
     def quit(self):     def quit(self):
Zeile 127: Zeile 136:
         # GAME PERMANENT LOOP         # GAME PERMANENT LOOP
         while True:         while True:
-            pygame.time.delay(TIME_DELAY)+            pygame.time.delay(self.settings.TIME_DELAY)
    
             # KEY EVENTS             # KEY EVENTS
Zeile 138: Zeile 147:
             keys = pygame.key.get_pressed()             keys = pygame.key.get_pressed()
             if keys[pygame.K_UP]:             if keys[pygame.K_UP]:
-                player.rect.top -= SPEED+                player.rect.top -= self.settings.SPEED 
 +            if keys[pygame.K_DOWN]: 
 +                player.rect.top += self.settings.SPEED
             # and so on ...             # and so on ...
    
Zeile 154: Zeile 165:
    
             # DRAW             # DRAW
-            self.screen.fill(BG_COLOR)  # draw empty screen+            self.screen.fill(self.settings.BG_COLOR)  # draw empty screen
             balls.draw(self.screen) # draw all group members             balls.draw(self.screen) # draw all group members
             self.screen.blit(player.image, player.rect) # draw single object             self.screen.blit(player.image, player.rect) # draw single object
Zeile 166: Zeile 177:
 import pygame import pygame
 import os import os
-from settings import * 
  
 class Player(pygame.sprite.Sprite): class Player(pygame.sprite.Sprite):
Zeile 231: Zeile 241:
         pass         pass
 </code> </code>
 +
  
 ++++ ++++
 </nodisp> </nodisp>
 +
 +
 +==== - Tutorial ====
 +
 +Ziel von diesem Tutorial ist, dich in PyGame anhand des Templates von oben einzuarbeiten.
 +
 +   1. **Installiere** PyGame (mit pip)
 +   1. Lade das **Template-Spiel** herunter und stelle sicher, dass du es ausführen kannst. Du solltest ein Flugzeug und ein paar farbige Bälle sehen.
 +   1. Verschaffe dir einen **Überblick** über das Projekt. Es geht nicht darum, jede einzelne Code-Zeile zu verstehen, sondern darum, das Big Picture zu verstehen:
 +      1. Welches File muss man ausführen, wenn man das Spiel starten möchte? Was passiert darin?
 +      1. Das Herzstück ist die `play`-Methode in der Game-Klasse. Darin befindet sich der **Game-Loop** - eine Endlosschleife (`while True`). In dieser steht der Code, der während dem Spiel in der Dauerschleife ausgeführt wird. Verschaffe dir darin eine Übersicht.
 +      1. Es gibt noch weitere Files wie `setting.py` oder `ball.py`. Wozu sind diese da?
 +      1. In `player.py` und `ball.py` gibt es zwei Methoden: Update und Collide. Wozu?
 +   1. **Erweitere** das Spiel nun wie folgt:
 +      1. Füge noch **zwei rote Bälle** hinzu. Dazu muss zuerst ein Bild von einem roten Ball erstellt werden und in den `data`-Ordner abgelegt werden. Beachte, dass das gleiche Bild dann für beide roten Bälle im Spiel verwendet wird.
 +      1. Ändere das **Bild des Players** (aktuell Flugzeug). Finde ein lustiges Bild im Internet. Wichtig: Das Bild soll einen transparenten Hintergrund haben. Z.B. kann man man mit Photoshop den Hintergrund transparent machen.
 +      1. Füge dem Game ein **Hintergrundbild** hinzu.
 +      1. Den Player soll man nun auch noch nach **links und rechts** bewegen. Implementiere dies in der `play`-Methode, da hier die ganzen Inputs verarbeitet werden sollen.
 +      1. Der Player soll aber nicht aus dem Bild verschwinden können. Erreicht er z.B. den linken Rand, soll er sich nicht weiter nach links bewegen. Implementiere dies in der `update`-Methode des Players. Diese wird bei jedem Durchgangs Game-Loops ausgeführt.
 +      1. Implementiere eine **Collision**: Sobald der Player mit einem Ball kollidiert, soll dieser Ball verschwinden.
 +   
 +
  
 ===== - Projekt ===== ===== - Projekt =====
Zeile 244: Zeile 277:
    1. Neues **GitHub** Repo erstellen. Alle Gruppenmitglieder und Lehrperson einladen.    1. Neues **GitHub** Repo erstellen. Alle Gruppenmitglieder und Lehrperson einladen.
    1. **Template** von oben hinein kopieren und als Startpunkt verwenden.    1. **Template** von oben hinein kopieren und als Startpunkt verwenden.
-   1. **Programmieren:** +   1. **Programmieren:** siehe Tipps unten 
-     1. siehe Tipps oben oder unten +
-     1. am besten arbeiten verschieden Personen primär an verschiedenen Klassen+
  
 ==== Tipps ==== ==== Tipps ====
Zeile 257: Zeile 289:
    * Code sinnvoll **kommentieren** (ebenso!)    * Code sinnvoll **kommentieren** (ebenso!)
    * **Pfade** richtig schreiben (siehe oben). Ansonsten läuft z.B. Code, der auf Windows programmiert wurde, nicht auf Mac.    * **Pfade** richtig schreiben (siehe oben). Ansonsten läuft z.B. Code, der auf Windows programmiert wurde, nicht auf Mac.
-   bei Projektarbeiten macht es u.U. auch Sinn, mit **Branches** zu arbeiten. Es werden wie verschiedene Versionen vom Code erzeugt, die dann später wieder zusammengeführt werden.+   Optimalerweise arbeiten verschiedene Personen an **verschiedenen Klassen**. 
 +   * Eventuell macht es Sinn, mit **Git-Branches** zu arbeiten. Es werden wie verschiedene Versionen vom Code erzeugt, die dann später wieder zusammengeführt werden.
 {{ :talit:github_branches.png?400 |}} {{ :talit:github_branches.png?400 |}}
    * **Keine dirty fixes!** Haltet //strikte Ordnung// in eurem Code. Arbeitet lieber länger an eines //sauberen Lösung//, als dass ihr irgendetwas komisches, das ihr nicht wirklich versteht macht, nur damit der Code funktioniert. Dies rächt sich immer!    * **Keine dirty fixes!** Haltet //strikte Ordnung// in eurem Code. Arbeitet lieber länger an eines //sauberen Lösung//, als dass ihr irgendetwas komisches, das ihr nicht wirklich versteht macht, nur damit der Code funktioniert. Dies rächt sich immer!
  • talit/python_pygame.1661340424.txt.gz
  • Zuletzt geändert: 2022-08-24 11:27
  • von sca