这个基本的pygame结构怎么样?

时间:2009-09-12 01:12:23

标签: python pygame structure

以下是我现在如何实现我的简单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()。任何建议,比如变量的大小写/命名,什么使它更有效或可读?

6 个答案:

答案 0 :(得分:12)

无论pygame作者推荐什么,我建议避免使用from ... import *:它只会让您的代码更难阅读(因为读者必须检查每个裸名以检查它是否实际在本地分配或来来自被驱逐的*)。将其更改为import pygame.locals as 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()

答案 1 :(得分:3)

你的榜样非常好。 但是如果你看到“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])删除所有 队列中的事件

Bassicaly,您可以为此事件创建函数并使用它。 像这样:

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

这看起来基本上是我见过的所有其他例子。也许你可能想找一些用pygame编写的开源游戏。

答案 4 :(得分:0)

我不确定这是否是您正在寻找的那种答案,但之后
pygame.draw.aaline(screen,LINE_COLOUR,(1,1),(639,399))
你应该把
pygame.display.flip()
这样,玩家实际看到的显示每帧都会刷新。如果您运行此代码,那么您将看到的只是一个黑屏,没有线,因为显示器永远不会更新。

答案 5 :(得分:0)

非常简单地从经验测试中你似乎有这条线:

pygame.quit()

在sys.exit()

之前丢失