Как устроена эта базовая структура pygame?[закрыто]

StackOverflow https://stackoverflow.com/questions/1413937

  •  06-07-2019
  •  | 
  •  

Вопрос

Вот как я сейчас реализую свои простые pygames:

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

Я также видел keeprunning вместо этого используется флаг для выхода из основного цикла событий, а также использование pygame.event.poll() вместо того, чтобы перебирать pygame.event.get().Есть какие-нибудь предложения, например, регистр/именование переменных, что-нибудь, чтобы сделать его более эффективным или читабельным?

Это было полезно?

Решение

Что бы ни рекомендовали авторы pygame , я советую избегать from ... import * : это только затрудняет чтение вашего кода (так как читатель должен проверять каждый и каждое голое имя, чтобы проверить, действительно ли оно назначено локально ИЛИ, происходит из двойного * ). Измените это на import pygame.locals как pygl , скажем, и сделайте каждое использование имени из него квалифицированным (я думаю, что в вашем коде это просто означает изменение QUIT pygl.QUIT ). Какое короткое имя вы точно используете вместо pygl , не имеет большого значения, но я настоятельно рекомендую эту общую структуру. Помните: пространства имен - отличная идея - давайте сделаем больше таких! -)

Везде используйте отступы с 4 пробелами, как говорит PEP 8: вы, кажется, смешиваете некоторые отступы с 4 пробелами с другими, которые являются 8 пробелами или табуляциями - не !

Не назначайте переменные, которые вы никогда не будете использовать, как вы делаете это для time_passed .

Кодекс как:                 if event.type == QUIT:                         exit_game () Это нормально, если вы тестируете одну или очень мало возможностей (с помощью if / elif ), но не «масштабируете» много, либо в удобочитаемости или эффективности. Когда вам нужно охватить несколько случаев, используйте диктовку, которую вы можете установить перед циклом:

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

и вместо if / elif / else используйте:

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

Другие советы

Ваш пример очень хорош.Но если вы видите, как работает «pygame.event.poll()», посмотрите на этот простой пример:

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"

вы можете использовать все события из pygame:

  • pygame.event.get - получить события из очереди получить события из очереди
  • pygame.event.poll - Получите одно событие из очереди Получите одно событие из очереди
  • pygame.event.wait - ждать одного события из очереди

или

  • pygame.event.clear ([pygame.quit, pygame.activeevent, pygame.keydown, pygame.keyup, pygame.mousemotion, pygame.joybuttonup, pygame.userevent]), чтобы удалить все события из веры

В основном вы создаете функции для этих событий и используете их.Так :

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)

или блокировка некоторых событий, таких как:

pygame.event.set_blocked((pygame.JOYAXISMOTION))
Класс

pygame.Color () удобно использовать:

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

Это похоже на любой другой пример, который я когда-либо видел. Возможно, вы захотите найти игры с открытым исходным кодом, написанные на pygame.

Я не уверен, что это тот ответ, который вы ищете, но после
pygame.draw.aaline (screen, LINE_COLOUR, (1, 1), (639, 399))
ты должен положить
pygame.display.flip ()
Это так, что дисплей, который фактически видит игрок, будет обновляться каждый кадр. Если вы запустите этот код, то все, что вы увидите, это черный экран без строки, поскольку дисплей никогда не обновляется.

Проще говоря, в результате эмпирического тестирования у вас есть строка:

pygame.quit()

отсутствует до sys.exit ()

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top