4

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

4

6 回答 6

12

无论pygame作者推荐什么,我都建议避免from ... import *:它只会使您的代码更难阅读(因为读者必须检查每个裸名以检查它是否实际分配在本地或来自 deuced *)。例如,将其更改为import pygame.locals as pygl,并使其每次使用的名称都是合格的(我认为在您的代码中,这只是意味着更改QUITpygl.QUIT)。您选择使用什么短名称来代替pygl并不重要,但这是我强烈推荐的一般结构。记住:命名空间是一个很棒的主意——让我们做更多的事情!-)

正如 PEP 8 所说,在任何地方使用 4 空格缩进:您似乎将一些 4 空格缩进与其他 8 空格或制表符混合在一起——不要

不要分配给你永远不会使用的变量,因为你正在为time_passed.

像这样的代码: if event.type == QUIT: exit_game() 只要您正在测试一种或很少的可能性(使用if/ elif)就可以了,但在可读性或效率方面并没有“扩大”太多。当您需要涵盖多种情况时,请使用可以在循环之前设置的 dict:

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

而不是if/ elif/ else,使用:

f = dispatch.get(event.type)
if f is None:  # the "else" case"
   ...
else: f()
于 2009-09-12T03:22:01.160 回答
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]) 从队列中删除所有事件

基本上,您为此事件创建函数并使用它。像这样 :

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))
于 2009-09-14T10:15:21.577 回答
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")
于 2012-10-24T20:53:30.193 回答
0

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

于 2009-09-12T01:56:26.827 回答
0

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

于 2009-09-12T12:48:21.513 回答
0

很简单,从经验测试来看,您似乎有以下几点:

pygame.quit()

在 sys.exit() 之前丢失

于 2012-10-22T14:18:23.030 回答