2009-09-12 4 views
4

Voici comment je mettre en œuvre mes simples pygames maintenant:Comment est cette structure de base de pygame?

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 aussi vu un drapeau keeprunning utilisé pour sortir de la boucle principale de l'événement au lieu, ainsi que l'utilisation pygame.event.poll() au lieu de bouclage pygame.event.get(). Des suggestions, comme le cas/nommer des variables, quelque chose pour le rendre plus efficace ou lisible?

Répondre

12

Quels que soient les pygame auteurs recommandent, je suggère d'éviter from ... import *: il ne fait que votre code plus difficile à lire (comme le lecteur doit inspecter chaque barename pour vérifier si elle est effectivement attribué localement ou vient de la * deuced). Changez cela en import pygame.locals as pygl, disons, et faites en sorte que chaque utilisation d'un nom soit qualifiée (je pense que dans votre code cela signifie simplement changer QUIT à pygl.QUIT). Quel nom abrégé exactement vous choisissez d'utiliser au lieu 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 - faisons-en plus! -)

Utilisez des espaces de 4 espaces partout, comme le dit PEP 8: vous semblez mélanger des retraits de 4 espaces avec d'autres qui sont 8- espace ou onglets - ne pas!

Ne pas affecter à des variables que vous n'utiliserez jamais, comme vous le faites pour time_passed.

code comme: si event.type == QUIT: exit_game() est très bien aussi longtemps que vous testez un ou très peu de possibilités (avec if/elif), mais ne pas "grande échelle" beaucoup, soit en termes de lisibilité ou d'efficacité. Lorsque vous avez besoin pour couvrir plusieurs cas, utilisez un dict que vous pouvez mettre en place avant que la boucle:

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

et au lieu de if/elif/else, utilisez:

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

> "Je suggère d'éviter de ... importer *:". 'pygame.locals' existe précisément pour cet usage. Il contient un certain nombre de constantes très fréquemment utilisées, principalement des keycodes et des types d'événements. – SingleNegationElimination

+0

Les onglets/espace 4/8 mix étaient un accident. J'utilise des tabulations, pas des espaces, car dans le jEdit avec des espaces, je dois reculer de 4 fois pour monter d'un niveau d'indentation contre une fois avec des tabulations. Je peux facilement les convertir tous à des espaces à tout moment, cependant. – mk12

+0

Et la chose du dictionnaire, pas tous les cas ont seulement une déclaration qui est un appel de méthode, alors comment cela fonctionnerait-il? Je ne suis pas sûr de la partie importatrice, pourquoi disent-ils dans les docs: "Pour la commodité, la plupart des variables de haut niveau dans pygame ont été placées dans un module nommé" pygame.locals ". utilisé avec 'from pygame.locals import *', en plus de 'import pygame'. " ? Merci d'avoir pris le temps de répondre, je vais regarder ce que vous avez dit à nouveau. – mk12

0

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

0

Je ne sais pas si c'est le genre de réponse que vous cherchez, mais après
pygame.draw.aaline (écran, LINE_COLOUR, (1, 1), (639, 399))
vous devriez mettre
pygame.display.flip()
Ceci afin que l'affichage que le lecteur voit effectivement soit rafraîchi à 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.

+0

Merci, j'ai oublié ça. Normalement, je fais toujours ça. – mk12

3

Votre exemple est très bon. Mais si vous voyez comment fonctionnait "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.obtenir - obtenir des événements de la file d'attente obtenir des événements de la file d'attente
  • pygame.event.poll - obtenir un seul événement de la file d'attente obtenir un seul événement de la file d'attente
  • pygame.event.wait - attendre un seul événement de la file d'attente

ou

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

Bassicaly vous créer des fonctions pour ces événements et l'utiliser. 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 le blocage de certains événements comme:

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

Tout simplement de tests empiriques vous semblent avoir la ligne:

pygame.quit() 

manquant avant sys.exit()

2

pygame.Color() classe 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") 
Questions connexes