Pygame zeit abwarten ohne das alles stoppt

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Aber das ist doch kein PyGame-Kurs sondern ganz allgemein Python‽

Zur nächsten Frage: Welche Linien? Du zeichnest sowieso nur *eine* Linie. Zwar 14 mal aber das ändert ja nichts am Ergebnis.

Weitere Anmerkungen zum Quelltext: Zeichenkettenliterale sind keine Kommentare. Wenn am Anfang eines Moduls ein Zeichenkettenliteral steht (und davor nur Leerraum oder Kommentare, dann ist das der Docstring des Moduls. Da kann man auch Ideen für eine weitere Entwicklung rein schreiben, dann würden Deine Kommentare davor aber auch mit den Docstring gehören. Und bei Docstrings sind " statt ' üblich. `pydoc` hatte sogar mal ein Problem mit einfachen Anführungsstrichen.

Kommentare sollten nicht kommentieren was der Code macht. Das steht da ja schon im Code. Wenn man Namen kommentieren muss, sollte man bessere Namen wählen, so dass man sich den Kommentar sparen kann. Kommentare sollten erklären warum der Code etwas so macht, wie er es macht. Aber auch nur, sofern das nicht offensichtlich ist.

Namen schreibt man in Python klein_mit_unterstrichen. Ausnahmen: Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Da der Code dem Leser vermitteln soll was passiert, verwendet man keine nicht allgemein gebräuchlichen Abkürzungen. So etwas wie `posLXS` ist unverständlich und sollte einen besseren Namen bekommen, bei dem der Leser nicht raten muss was der Wert dahinter bedeutet. Den Kommentar ``#Player1`` sollte man sich zugunsten einer vernünftig benannten Funktion sparen. Wenn die Funktion `draw_player_1()` hiesse, bräuchte man den Kommentar nicht. Und wüsste nicht nur bei der Definition was die Funktion macht, sondern kann das auch an der/den Stelle(n) wo die Funktion aufgerufen wird, deutlich ablesen.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Insbesondere *keine* globalen Variablen. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Indexzugriffe sind in Python selten nötig. Insbesondere Schleifen über ganze Zahlen die dann für den Zugriff in Sequenzen wie Listen verwendet werden, sind ”unpythonisch” weil man in Python direkt über Elemente von Sequenzen iterieren kann, ohne den Umweg über einen Index. Zudem fangen Indexwerte in Python bei 0 an und nicht bei 1. Der Code sieht so aus als wenn Dir das nicht bewusst wäre. Da wären wir dann wieder bei der Qualität vom Lehrmaterial.

Woher kommt dieser Drang Argumente die Farben repräsentieren noch einmal in überflüssige Klammern zu setzen? Ganze Zahlen mit `int()` in noch gänzere Zahlen zu wandeln macht ebenfalls keinen Sinn. ;-)

Deine `exit()`-Funktion wird nicht verwendet. Aber wie ich in einem vorherigen Beitrag ja schon einmal schrieb: `sys.exit()` sollte man so sowieso nicht verwenden. Verlasse die Schleife und lass das Programm dann von selbst am ”natürlichen” Ende angelangen. Es kann Sinn machen die Hauptschleife noch mal in eine eigene Funktion zu stecken, die man dann mit ``return`` beenden kann. Im Hauptprogramm/in der Hauptfunktion können danach dann Aufräumarbeiten stehen. Zum Beispiel das `pygame.quit()`. Wobei ich das auch in einen ``finally:``-Block setzen würde um auch in Ausnahmefällen für ein geregeltes Beenden zu sorgen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Weitere Anmerkungen: Eingerückt wird mit 4 Leerzeichen pro Ebene, nicht mit 5.

`clock` und einige andere Namen werden definiert, aber nicht verwendet. `clock` sollte vielleicht verwendet werden, damit nicht so viel Prozessorzeit unnötig verbraten wird. `random` wird importiert, aber nicht verwendet.

Funktion sollten alles was sie ausser Konstanten verwenden als Argumente übergeben bekommen. Sonst bestehen undurchsichtige Abhängigkeiten die es schwerer machen das Programm zu verstehen, wodurch es fehleranfälliger wird. Die Funktion zum Zeichen des Spielers darf also nicht einfach so ”magisch” auf `screen` zugreifen.

Die ``for``-Schleife die `posLXS` und `posLXE` definiert ist unsinnig weil nur die Werte des letzten Schleifendurchlaufs tatsächlich verwendet werden.

Die Mitte des `screen` würde ich nicht selbst berechnen sondern vom `Rect` des `screen` abfragen.

Das Zeichnen der Linie gehört nicht in die Ereignisschleife. Das wird dann nur dann ausgeführt wenn auch Ereignisse vorliegen. Und wenn mehr als ein Ereigniss vorliegt, werden noch mehr unnötige Linien übereinandergezeichnet. Man sieht die Linie übrigens nicht, weil auch die Pixelkoordinaten bei 0 anfangen und die Linienkoordinaten deshalb ausserhalb des `Surface` liegen.

Die gesamte vorhandene Ereignisbehandlung lässt sich mit *einem* ``if`` realisieren.

Dann lande ich hier:

Code: Alles auswählen

#!/usr/bin/env python3
"""
PyBedwars - by cool_brick24
Minecraft Hypixel Bedwars in Python neu erstellt.

Ideen:

-Andere Texturen etc.
-Unsichtbaren 1 Pixel breiten Balken runter laufen lassen, und wenn dieser unten ist, spawnt dieser wieder oben und ein Eisen wird generiert. Somite kann ich die Pixel anzahl(Wie viele er nach unten gehen soll),
-bestimmen und dies als Zeit benutzten ohne das mein Programm stoppt!
"""
import pygame

BLACK = (0, 0, 0)
BLUE = (0, 30, 255)
GREEN = (0, 255, 0)


def draw_player_1(screen, position, size, color):
    pygame.draw.circle(screen, color, position, size)


def main():
    pygame.init()
    try:
        width, height = (750, 750)
        screen = pygame.display.set_mode((width, height))
        pygame.display.set_caption('PyBedwars - V 1.0 - by Cool_brick24')

        clock = pygame.time.Clock()

        line_start = (750, 100)
        line_end = (750, 750)
        middle = screen.get_rect().center

        while True:
            clock.tick(25)
            
            for event in pygame.event.get():
                if (
                    event.type == pygame.QUIT
                    or (
                        event .type == pygame.KEYDOWN
                        and event.key == pygame.K_ESCAPE
                    )
                ):
                    return

            screen.fill(BLUE)
            draw_player_1(screen, middle, 15, GREEN)
            pygame.draw.line(screen, BLACK, line_start, line_end)
            pygame.display.update()
    finally:
        pygame.quit()


if __name__ == '__main__':
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
cool_brick24
User
Beiträge: 34
Registriert: Montag 10. September 2018, 12:45

Okay, danke für die Tipps, wie ich meinen Code verbessern kann. Ich werde noch einmal kräftig darüber nachdenken/lernen! Aber eine einzige Frage hab ich noch. Ist die Letzte: Wie erschaffe ich ein Grid-Feld mit PyGame? Ich suche zwar auf Youtube danach, aber für meine Idee ist dies nicht geignet. Ich möchte einfach ein Grid Feld haben, was so funktioniert:

Code: Alles auswählen

if ereignes_empfangen:
     grid[1][1] = neue_farbe #Das grid[1][1] soll oben links sein
Also ein 2 Dimensionales grid Feld, bei dem ich bei jedem Feld ein Bild anlegen kann wie ich es möchte.

mfg
-cool_brick24
cool_brick24
User
Beiträge: 34
Registriert: Montag 10. September 2018, 12:45

Okay, danke für die Tipps, wie ich meinen Code verbessern kann. Ich werde noch einmal kräftig darüber nachdenken/lernen! Aber eine einzige Frage hab ich noch. Ist die Letzte: Wie erschaffe ich ein Grid-Feld mit PyGame? Ich suche zwar auf Youtube danach, aber für meine Idee ist dies nicht geignet. Ich möchte einfach ein Grid Feld haben, was so funktioniert:

Code: Alles auswählen

if ereignes_empfangen:
     grid[1][1] = neue_farbe #Das grid[1][1] soll oben links sein
Also ein 2 Dimensionales grid Feld, bei dem ich bei jedem Feld ein Bild anlegen kann wie ich es möchte.

mfg
-cool_brick24
cool_brick24
User
Beiträge: 34
Registriert: Montag 10. September 2018, 12:45

Okay, danke für die Tipps, wie ich meinen Code verbessern kann. Ich werde noch einmal kräftig darüber nachdenken/lernen! Aber eine einzige Frage hab ich noch. Ist die Letzte: Wie erschaffe ich ein Grid-Feld mit PyGame? Ich suche zwar auf Youtube danach, aber für meine Idee ist dies nicht geignet. Ich möchte einfach ein Grid Feld haben, was so funktioniert:

Code: Alles auswählen

if ereignes_empfangen:
     grid[1][1] = neue_farbe #Das grid[1][1] soll oben links sein
Also ein 2 Dimensionales grid Feld, bei dem ich bei jedem Feld ein Bild anlegen kann wie ich es möchte.

mfg
-cool_brick24
Zuletzt geändert von cool_brick24 am Sonntag 11. November 2018, 01:05, insgesamt 2-mal geändert.
cool_brick24
User
Beiträge: 34
Registriert: Montag 10. September 2018, 12:45

Hallo!

ähm, die Beiträge wurden 3 mal gesendet. LOL


Keine Ahnung wieso

mdg

-cool_brick24
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Diese Funktionalität gibt es nicht von Hause aus in Pygame, die musst du selber coden.
Falls du noch nichts von SO oder StackOverflow.com gehört oder gelesen hast, dann empfehle ich dir diese Platform jetzt mal.
Weil dort findet man durch Suche nach Pygame Grid zB dies hier: https://stackoverflow.com/questions/741 ... me#7415228
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Gute Stichworte sind auch tile engine pygame. Eine tile engine baut eine Spielwelt aus Rechtecken auf.
Antworten