Zugriff auf Variable einer anderen Klasse

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
IchrEgelS0
User
Beiträge: 2
Registriert: Sonntag 31. Dezember 2023, 15:23

Hallo liebes Forum,

ich habe zwei Klassen erstellt, eine Klasse "Game" und eine Klasse "Player".

In der Game-Klasse erstelle ich mein Fenster, in der Player-Klasse möchte ich diesen auf den in der Game-Klasse erstellten screen zeichnen. Hierbei komme ich jedoch leider nicht weiter. Ich habe schon diverse Möglichkeiten probiert, u.a. hieß es in einem Forum man muss hierzu die erste Klasse als Instanz an die zweite Klasse übergeben. Vermutlich habe ich es falsch gemacht, denn es hat nicht funktioniert. Könnt ihr mir weiterhelfen?

Mein aktueller Code sieht folgendermaßen aus (ohne gerade beschriebenen Lösungsversuch)

Code: Alles auswählen

#main.py

import pygame
from game import Game
from player import Player

running = True

game = Game()
player = Player(game.screen)

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    player.render()
    game.update()

pygame.quit()

Code: Alles auswählen

#game.py

import pygame
import config

class Game:
    def __init__(self):

        #Pygame setup
        pygame.init()
        self.screen = pygame.display.set_mode((config.SCREEN_WIDTH, config.SCREEN_HEIGHT))
        pygame.display.set_caption(config.SCREEN_CAPTION)

        self.clock = pygame.time.Clock()
           
    def update(self):
           
        self.screen.fill(config.BACKGROUND_COLOR)
        pygame.display.flip()
        self.clock.tick(config.FPS)

Code: Alles auswählen

#player.py

import pygame
import config

class Player:

    def __init__(self, screen):
        self.screen = screen

    def render(self):
        pygame.draw.rect(self.screen, config.PLAYER_COLOR, (0, 0, 32, 32), 2)
In der config.py sind sämtliche Konstanten enthalten, welche ich für das Spiel verwenden möchte.
Manul
User
Beiträge: 53
Registriert: Samstag 13. Februar 2021, 16:00

Ich kenne pygame nicht, aber kann es sein, dass Du in Deiner Hauptschleife den Player durch das Game.update() einfach immer sofort wieder übermalst? Was passiert, wenn Du die Reihenfolge der beiden Zeilen vertauschst?

Wenn es das nicht ist: Was passiert denn, wenn Du Deinen gezeigten Code ausführst? Kriegst Du irgendwelche Fehlermeldungen?
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

allgemein gesagt: musste die Klasse importieren und dann aufrufen in der Klasse wo du die haben willst. player = Player() und dann player.variable ....
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

"funktioniert nicht" ist eine sehr schlechte Fehlerbeschreibung. Was passiert und wie weicht das von dem gewünschten Verhalten ab?

Eine Datei pro Klasse ist keine gute Aufteilung, im jetzigen Zustand würde alles in eine Datei passen und wäre damit übersichtlicher. Wenn man wirklich auf mehrere Dateien aufteilen möchte, dann teilt man nach sinnvollen größeren Einheiten auf; alle Module auf oberster Ebene zu haben, ist ungünstig, weil dann leicht ein Namenskonflikt zu bereits bestehenden Bibliotheken auftreten könnten. Man packt alle Module eines Projekts in ein Package.

Das Hauptprogramm sollte in eine Funktion namens main wandern.

Code: Alles auswählen

import pygame

SCREEN_WIDTH = 34
SCREEN_HEIGHT = 174
SCREEN_CAPTION = "Game"
FRAMES_PER_SECOND = 30

class Game:
    def __init__(self, screen):
        self.screen = screen
        self.clock = pygame.time.Clock()
           
    def update(self):
        self.screen.fill(BACKGROUND_COLOR)
        pygame.display.flip()
        self.clock.tick(FRAMES_PER_SECOND)


class Player:
    def __init__(self, screen):
        self.screen = screen

    def render(self):
        pygame.draw.rect(self.screen, config.PLAYER_COLOR, (0, 0, 32, 32), 2)


def main():
    pygame.init()
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
    pygame.display.set_caption(SCREEN_CAPTION)

    game = Game(screen)
    player = Player(screen)

    try:
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    return
            player.render()
            game.update()
    finally:
        pygame.quit()

if __name__ == "__main__":
    main()
Ist es eigentlich gewollt, dass vor dem Darstellen der ganze Screen mit der Hintergrundfarbe gefüllt wird?
IchrEgelS0
User
Beiträge: 2
Registriert: Sonntag 31. Dezember 2023, 15:23

Danke euch schon mal für die Antworten. Ich erhalte keine Fehlermeldung, sondern der Screen bleibt einfach schwarz - sorry, das hätte ich noch erwähnen sollen.

@Manul: Den Gedanken hatte ich auch schon aber es hat leider nichts bewirkt

@Sirius: Danke für die allgemeinen Infos. Das Rechteck des Spielers wird mir nicht angezeigt, aber eine Fehlermeldung erhalte ich nicht. Daher hatte ich vermutet, dass ich in der Klasse Player nicht auf den Screen zugreife, auf dem ich eigentlich zeichnen möchte. Den Hintergrund wollte ich füllen, um das vorher gezeichnete zu überschreiben. Ist wohl noch eine falsche Angewohnheit aus einer früheren Sprache.

Mit deinem Code hat es auf jeden Fall funktioniert Sirius, danke! Und schon mal einen guten Rutsch ins neue Jahr.
Antworten