Mehrere Funktionen untereinander verbinden

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
k-net
User
Beiträge: 24
Registriert: Donnerstag 22. Oktober 2020, 16:43

Hallo,

wenn ich z. B. folgendes Programm schreiben:

Code: Alles auswählen

import pygame

pygame.init()

WIDTH = 250
HIGHT = 250
AKTIV = True

BLACK = (0, 0, 0,)
WHITE = (255, 255, 255)
YELLOW = (255, 255, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)

screen = pygame.display.set_mode((WIDTH, HIGHT))
pygame.display.set_caption("Hallo!")

player_x = 100
player_y = 100
player_color = WHITE


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


    player = pygame.draw.rect(screen, player_color, (player_x, player_y, 25, 25), 0)

    cube_topleft = pygame.draw.rect(screen, YELLOW, (5, 5, 25, 25), 0)
    cube_topright = pygame.draw.rect(screen, RED, (220, 5, 25, 25), 0)
    cube_bottomleft = pygame.draw.rect(screen, BLUE, (5, 220, 25, 25), 0)
    cube_bottomright = pygame.draw.rect(screen, GREEN, (220, 220, 25, 25), 0)

    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_LEFT]:
        player_x -= 0.1
    if pressed[pygame.K_RIGHT]:
        player_x += 0.1
    if pressed[pygame.K_UP]:
        player_y -= 0.1
    if pressed[pygame.K_DOWN]:
        player_y += 0.1

    if player.colliderect(cube_topleft):
        player_color = YELLOW
    if player.colliderect(cube_topright):
        player_color = RED
    if player.colliderect(cube_bottomleft):
        player_color = BLUE
    if player.colliderect(cube_bottomright):
        player_color = GREEN

    pygame.display.flip()

    screen.fill(BLACK)

    pygame.time.Clock()

pygame.quit()
Dann funktioniert das ja soweit problemlos.

Zum einen finde ich es aber nicht gut, alles in den Loop zu schreiben und spätestens wenn Programme komplexer werden, verliere ich da die Übersicht. Jetzt würde ich natürlich gerne mehrere Funktionen bilden, die dann jeweils nur im Loop aufgerufen werden. Zum Beispiel sowas hier:

Code: Alles auswählen

def cubes_corner():
    cube_topleft = pygame.draw.rect(screen, YELLOW, (5, 5, 25, 25), 0)
    cube_topright = pygame.draw.rect(screen, RED, (220, 5, 25, 25), 0)
    cube_bottomleft = pygame.draw.rect(screen, BLUE, (5, 220, 25, 25), 0)
    cube_bottomright = pygame.draw.rect(screen, GREEN, (220, 220, 25, 25), 0)
wenn ich die Funktion im Loop mit

Code: Alles auswählen

cubes_corner()
aufrufe, werden die Quadrate auch korrekt dargestellt, aber ich kann sie nicht mehr mit den Eingaben von Player interagieren lassen. Logisch, denn sie sind ja nur innerhalb der Funktion bekannt. Wie kann ich das ändern? Wenn man mehrere Funktionen hat mit mehreren Variablen, wie kann ich erreichen, dass in einer Funktion etwas geschieht, aufgrund von Eingaben oder Werten die in einer anderen Funktion oder im Loop aufgerufen werden?

Vielen Dank!
Benutzeravatar
Dennis89
User
Beiträge: 1386
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,
k-net hat geschrieben: Mittwoch 13. April 2022, 16:09 Wie kann ich das ändern? Wenn man mehrere Funktionen hat mit mehreren Variablen, wie kann ich erreichen, dass in einer Funktion etwas geschieht, aufgrund von Eingaben oder Werten die in einer anderen Funktion oder im Loop aufgerufen werden?
Allgemein hast du die Möglichkeit der Funktion beim Aufruf Objekte zu übergeben (nennt man Argumente). Mit diesen macht die Funktion dann was. Danach kann eine Funktion wieder Objekte an den Aufruf zurück geben

Code: Alles auswählen

def calculate_something(a, b):
    return a ** 2 + b ** 2


def main():
    c_square = calculate_something(5, 4)
    print(c_square)


if __name__ == "__main__":
    main()
'calculate_something' wir aufgerufen und bekommt die Argumente 5 und 4 übergeben. In der Funktion sie die Werte an die Namen 'a' und 'b' gebunden. 'return' gibt dann etwas zurück, in dem Fall die Berechnung von a^2 + b^2. Die Rückgabe ist dann in der aufgerufenen Funktion verfügbar, in dem Fall unter dem Name 'c_square'. Damit kannst du dann wieder was machen.

Ich hoffe das hilft dir weiter.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
k-net
User
Beiträge: 24
Registriert: Donnerstag 22. Oktober 2020, 16:43

Danke, das hat es!

Ich habe es jetzt so umgesetzt:

Code: Alles auswählen

import pygame

pygame.init()

WIDTH = 250
HIGHT = 250
AKTIV = True

BLACK = (0, 0, 0,)
WHITE = (255, 255, 255)
YELLOW = (255, 255, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)

screen = pygame.display.set_mode((WIDTH, HIGHT))
pygame.display.set_caption("Hallo!")

player_x = 100
player_y = 100
player_color = WHITE

def cubes_corner(arg1, arg2, arg3, arg4):
    return pygame.draw.rect(arg1, arg2, (arg3), arg4)



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

    player = pygame.draw.rect(screen, player_color, (player_x, player_y, 25, 25), 0)

    cube_topleft = cubes_corner(screen, YELLOW, (5, 5, 25, 25), 0)
    cube_topright = cubes_corner(screen, RED, (220, 5, 25, 25), 0)
    cube_bottomleft = cubes_corner(screen, BLUE, (5, 220, 25, 25), 0)
    cube_bottomright = cubes_corner(screen, GREEN, (220, 220, 25, 25), 0)

    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_LEFT]:
        player_x -= 0.1
    if pressed[pygame.K_RIGHT]:
        player_x += 0.1
    if pressed[pygame.K_UP]:
        player_y -= 0.1
    if pressed[pygame.K_DOWN]:
        player_y += 0.1

    if player.colliderect(cube_topleft):
        player_color = YELLOW
    if player.colliderect(cube_topright):
        player_color = RED
    if player.colliderect(cube_bottomleft):
        player_color = BLUE
    if player.colliderect(cube_bottomright):
        player_color = GREEN

    pygame.display.flip()

    screen.fill(BLACK)

    pygame.time.Clock()

pygame.quit()
Hattest du quasi an soetwas gedacht?

Gruß und Dank!
Benutzeravatar
__blackjack__
User
Beiträge: 13572
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@k-net: Das sieht ein bisschen sinnfrei aus, die Funktion macht ja nicht wirklich etwas eigenes sondern exakt was `pygame.draw.rect()` macht. Ein Alias könnte man auch kürzer und effizienter definieren:

Code: Alles auswählen

cubes_corner = pygame.draw.rect
Wobei der Name keine Tätigkeit beschreibt, was Funktions- und Methodennamen üblicherweise tun sollten. Das scheint mir nicht zum Verständnis beizutragen.
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
Antworten