Question

Voici comment j'implémente maintenant mes pygames simples:

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()

J'ai également vu un indicateur keeprunning utilisé pour quitter la boucle d'événements principale, ainsi que l'utilisation de pygame.event.poll () au lieu d'être parcouru en boucle. pygame.event.get () . Des suggestions, telles que la casse / désignation des variables, quelque chose pour la rendre plus efficace ou plus lisible?

Était-ce utile?

La solution

Quels que soient les recommandations de pygame par les auteurs, je suggère d'éviter le depuis ... import *: cela rend seulement votre code plus difficile à lire (le lecteur doit inspecter chaque chaque nom de barre pour vérifier s'il est effectivement attribué localement OU provient du * deuced. Changez cela en importez pygame.locals en tant que pygl , par exemple, et utilisez chaque nom de celui-ci comme un nom qualifié (je pense que dans votre code cela signifie simplement changer QUIT pygl.QUIT ). Quel nom abrégé exactement que vous choisissez d'utiliser à la place de pygl n'a pas beaucoup d'importance, mais c'est une structure générale que je recommande FORTEMENT. Rappelez-vous: les espaces de noms sont une excellente idée - faites-en davantage! -)

Utilisez des retraits de 4 espaces partout, comme le dit PEP 8: vous semblez mélanger des retraits de 4 espaces avec d'autres à 8 espaces ou tabulations - not !

N'affectez pas de variables que vous n'utiliserez jamais, comme vous le faites pour time_passed .

Code comme:                 si event.type == QUIT:                         quitter le jeu() va bien tant que vous testez une ou très peu de possibilités (avec si / elif ), mais sans "mettre à l'échelle". beaucoup, soit en lisibilité, soit en efficacité. Lorsque vous devez couvrir plusieurs cas, utilisez un dict que vous pouvez configurer avant la boucle:

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

et au lieu de si / elif / sinon , utilisez:

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

Autres conseils

Votre exemple est très bon. Mais si vous voyez comment cela fonctionne: "pygame.event.poll ()" voir cet exemple simple:

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"

vous pouvez utiliser tous les événements de pygame:

  • pygame.event.get - Récupère les événements de la file d'attente récupère les événements de la file d'attente
  • pygame.event.poll - obtenez-en un événement de la file d'attente obtenir un seul événement de la file d'attente
  • pygame.event.wait - attend un seul événement de la file d'attente

ou

  • pygame.event.clear ([pygame.QUIT, pygame.ACTIVEEVENT, pygame.KEYDOWN, pygame.KEYUP, pygame.MOUSEMOTION, pygame.JOYBUTTONUP, pygame.USEREVENT]) pour tout supprimer événements de la file d'attente

En bas, vous créez des fonctions pour ces événements et vous les utilisez. Comme ceci:

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)

ou en bloquant certains événements tels que:

pygame.event.set_blocked((pygame.JOYAXISMOTION))
La classe

pygame.Color () est agréable à utiliser:

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")

Cela ressemble à tous les autres exemples que j'ai jamais vus. Peut-être voudrez-vous trouver des jeux open source écrits en pygame.

Je ne suis pas sûr que ce soit le type de réponse que vous recherchez, mais après
pygame.draw.aaline (écran, LINE_COLOUR, (1, 1), (639, 399))
tu devrais mettre
pygame.display.flip ()
Ceci afin que l'affichage que le joueur voit réellement soit actualisé à chaque image. Si vous exécutez ce code, tout ce que vous verrez est un écran noir, sans ligne car l'affichage n'est jamais mis à jour.

Tout simplement, à partir de tests empiriques, vous semblez avoir la ligne suivante:

pygame.quit()

manquant avant sys.exit ()

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top