Frage

Hier ist, wie ich die Umsetzung meiner einfache pygames jetzt:

import pygame, sys
from pygame.locals import *

def run_game():
    pygame.init()

    SIZE = (640, 400)
    BG_COLOUR = (0, 0, 0)
    LINE_COLOUR = (255, 255, 255)

    screen = pygame.display.set_mode(SIZE)
    clock = pygame.time.Clock()

    while True:
        time_passed = clock.tick(30)
        for event in pygame.event.get():
                if event.type == QUIT:
                        exit_game()

        screen.fill(BG_COLOUR)
        pygame.draw.aaline(screen, LINE_COLOUR, (1, 1), (639, 399))
        pygame.display.flip()

def exit_game():
    sys.exit()

if __name__ == "__main__"
    run_game()
statt sowie mit keeprunning statt Schleife durch pygame.event.poll()

Ich habe auch eine pygame.event.get() Flagge wird verwendet gesehen die Hauptereignisschleife zu verlassen. Irgendwelche Vorschläge, wie case / Benennung von Variablen, etwas effektiver zu machen oder lesbar?

War es hilfreich?

Lösung

Was auch immer die pygame Autoren empfehlen, ich from ... import * empfehlen, zu vermeiden: es nur Ihren Code schwerer macht zu lesen (wie der Leser, jeden barename zu prüfen hat zu prüfen, ob es lokal tatsächlich zugewiesenen OR stammt aus dem deuced *). Ändern Sie diesen import pygame.locals as pygl, sagen wir, und jede Verwendung eines Namens machen aus ihm einen qualifizierten sein (ich glaube, in Ihrem Code bedeutet dies nur QUIT Wechsel zu pygl.QUIT). Was genau kurze Namen, den Sie wählen anstelle von pygl verwenden spielt keine große Rolle, aber das ist eine allgemeine Struktur ich empfehlen. Denken Sie daran: Namespaces ein Hupen große Idee sind - lassen Sie uns mehr davon tun -)

Mit 4-Raum-Einzüge überall, wie PEP 8 sagt: Sie scheinen einige 4-Raum-Einzüge mit anderen zu mischen, das sind 8-Raum oder Tabs - nicht

Weisen Sie auf Variablen, du bist nie gonna verwenden, wie Sie es für time_passed tun.

Code wie:                 wenn event.type == ENDE:                         Spiel verlassen() so lange ist fein wie Sie eine Prüfung oder nur sehr wenige Möglichkeiten (mit if / elif), aber „Scale-up“ nicht viel, entweder Lesbarkeit oder Effizienz. Wenn Sie mehrere Fälle abdecken müssen, verwenden Sie einen dict, die Sie bis vor der Schleife festlegen:

dispatch = {pygl.QUIT: exit_game, # whatever else
           }

und statt if / elif / else, zu verwenden:

f = dispatch.get(event.type)
if f is None:  # the "else" case"
   ...
else: f()

Andere Tipps

Ihr Beispiel ist sehr gut. Aber wenn Sie sehen, wie gearbeitet „pygame.event.poll ()“ finden Sie in diesem einfachen Beispiel:

event = pygame.event.poll()
    while "ok":
        event = pygame.event.wait()
        cursor = pygame.mouse.get_pos()
        if event.type == QUIT:  raise SystemExit
            if event.type == MOUSEBUTTONUP and pygame.mouse.get_pressed()[0]:
               print "up"
        if event.type == MOUSEBUTTONDOWN and pygame.mouse.get_pressed()[0]:
               print "down"
        if event.type == KEYDOWN and event.key == K_SPACE: print "space key"
        if event.type == KEYDOWN and event.key == K_BACKSPACE:
               print "backspace key"

Sie alle Ereignisse aus pygame verwenden können:

  • pygame.event.get - get Ereignisse aus die Warteschlange Ereignisse aus der Warteschlange bekommen
  • pygame.event.poll - erhalten einen einzigen Ereignis aus der Warteschlange erhält einen einzigen Ereignis aus der Warteschlange
  • pygame.event.wait - warten auf einen einzigen Ereignis aus der Warteschlange

oder

  • pygame.event.clear ([pygame.QUIT, pygame.ACTIVEEVENT, pygame.KEYDOWN, pygame.KEYUP, pygame.MOUSEMOTION, pygame.JOYBUTTONUP, pygame.USEREVENT]) alle entfernen Ereignisse aus der Warteschlange

Bassicaly Sie erstellen Funktionen für diese Ereignisse und verwenden. Wie folgt aus:

def click_down():
    #print "Event queue:", pygame.event.peek()
    return pygame.event.peek(pygame.MOUSEBUTTONDOWN)

def is_click():
    if not click_down():
        return None

    clicks = pygame.event.get(pygame.MOUSEBUTTONDOWN)
    pygame.event.get(pygame.MOUSEBUTTONUP)
    return clicks[0].pos
def quiting():
    return pygame.event.peek(pygame.QUIT)
def keyboard():
    pygame.event.pump()
    pygame.event.get(pygame.KEYDOWN)

oder einige Ereignisse wie Versperren:

pygame.event.set_blocked((pygame.JOYAXISMOTION))

pygame.Color() Klasse ist schön zu verwenden:

from pygame import Color

# example: text is 20% gray. gray100 = (255,255,255)
text_fg = Color('gray20')
text_bg = Color('gray80')

# many names are defined
Color("red")

# rgb, rgba
Color(100, 100, 100)
Color(100, 100, 100, 20)

#hex
Color("fefefe")
Color("fefefe00")

Das sieht aus wie im Grunde alle anderen Beispiel, das ich je gesehen habe. Vielleicht möchten Sie einige Open-Source-Spiele in pygame geschrieben finden.

Ich bin nicht sicher, ob dies ist die Art von Antwort, die Sie suchen, aber nach
pygame.draw.aaline (Bildschirm, LINE_COLOUR, (1, 1), (639, 399))
Sie sollten setzen
pygame.display.flip ()
Dies ist so, dass die Anzeige, die der Spieler sieht tatsächlich wird für jeden Rahmen aktualisiert bekommen. Wenn Sie diesen Code ausführen, dann werden alle sehen Sie, ist ein schwarzer Bildschirm, ohne Linie wie die Anzeige nicht aktualisiert wird.

Ganz einfach aus empirischen Tests scheinen Sie die Linie zu haben:

pygame.quit()

fehlt vor sys.exit ()

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top