Comment est cette structure de base de pygame? [fermé]
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?
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))
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 ()