Pergunta

Aqui está como eu estou implementando meus pygames simples agora:

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

Eu vi também uma bandeira keeprunning sendo usado para sair do loop principal de evento em vez disso, bem como a utilização pygame.event.poll() vez de loop através pygame.event.get(). Todas as sugestões, como caso / nomeando de variáveis, qualquer coisa para torná-lo mais eficaz ou legível?

Foi útil?

Solução

O que quer que os autores pygame recomendar, eu sugiro evitar from ... import *: ela só faz seu código mais difícil de ler (como o leitor tem para inspecionar cada barename para verificar se ele é realmente atribuído localmente ou vem do * endiabrado). Mudança que a import pygame.locals as pygl, dizer e fazer todos os uso de um nome que seja um qualificado (acho que em seu código Isto significa apenas mudança QUIT para pygl.QUIT). O nome curto exatamente você optar por usar, em vez de pygl não importa muito, mas isso é uma estrutura geral I altamente recomendável. Lembre-se: namespaces são uma ótima idéia buzinando - vamos fazer mais daqueles -)

!

travessões Use 4 de espaço em todos os lugares, como PEP 8 diz: você parece estar misturando alguns travessões 4-espaço com outros que são 8-espaço ou guias - não

Não atribuir a variáveis ??que você é nunca vai usar, como você está fazendo isso por time_passed.

código como: se Event.type == SAIR: sair do jogo() é muito bem contanto que você está testando uma ou muito poucas possibilidades (com if / elif), mas não "escalar" muito, em qualquer legibilidade ou eficiência. Quando você precisa para cobrir vários casos, usar um dicionário que você pode configurar antes do loop:

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

e em vez de if / elif / else, use:

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

Outras dicas

O seu exemplo é muito bom. Mas se você ver como funcionou "pygame.event.poll ()" ver este exemplo simples:

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"

Você pode usar todos os eventos de pygame:

  • pygame.event.get - obter eventos de os eventos da fila começa a partir da fila
  • pygame.event.poll - obter um único evento da fila de obter um único evento da fila
  • pygame.event.wait - espera por uma única evento da fila

ou

  • pygame.event.clear ([pygame.QUIT, pygame.ACTIVEEVENT, pygame.KEYDOWN, pygame.KEYUP, pygame.MOUSEMOTION, pygame.JOYBUTTONUP, pygame.USEREVENT]) para remover todos eventos da fila

Bassicaly você cria funções para estes eventos e usá-lo. Como esta:

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 bloqueando alguns eventos como:

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

classe pygame.Color() é bom para uso:

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

Isto parece basicamente qualquer outro exemplo que eu já vi. Talvez você pode querer encontrar alguns jogos de código aberto escritos em pygame.

Eu não tenho certeza se este é o tipo de resposta que você está procurando, mas depois
pygame.draw.aaline (tela, LINE_COLOUR, (1, 1), (639, 399))
você deve colocar
pygame.display.flip ()
Isso é para que a exibição que o jogador realmente vê vai ser atualizado a cada quadro. Se você executar esse código, então tudo o que você vê é uma tela preta, sem linha como a exibição não é atualizado.

Muito simplesmente de testes empíricos você parece ter a linha:

pygame.quit()

faltando antes sys.exit ()

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top