代码之家  ›  专栏  ›  技术社区  ›  mk12

这个基本的Pygame结构如何?[关闭]

  •  4
  • mk12  · 技术社区  · 15 年前

    下面是我现在如何实现简单的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 回复  |  直到 9 年前
        1
  •  12
  •   Alex Martelli    15 年前

    无论什么 pygame 作者建议,我建议避免 from ... import * :它只会使您的代码更难阅读(因为读卡器必须检查每一个空名称,以检查它实际上是本地分配的还是源于输出的 * )把它变成 import pygame.locals as pygl ,说,并使它的每一个名称都是一个限定的名称(我认为在您的代码中,这只是意味着更改 QUIT pygl.QUIT )。你到底用什么简称来代替 pygl 没什么关系,但我强烈推荐这是一个总体结构。记住:名称空间是一个非常好的主意——让我们做更多的事情吧!-)

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

    不要给你永远不会用到的变量赋值,就像你做的那样 time_passed .

    代码类似: 如果event.type==退出: 出口() 只要你在测试一种或极少数的可能性 if / elif 但无论是可读性还是效率,都不会“放大”太多。当您需要覆盖多个案例时,请使用可以在循环之前设置的dict:

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

    而不是 如果 / 否则如果 / else ,用途:

    f = dispatch.get(event.type)
    if f is None:  # the "else" case"
       ...
    else: f()
    
        2
  •  3
  •   Cătălin George Feștilă    15 年前

    你的例子很好。 但是,如果您看到“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.joybutton向上, 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))
    
        3
  •  2
  •   ninMonkey    12 年前

    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")
    
        4
  •  0
  •   goldenratio Luc Hermitte    15 年前

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

        5
  •  0
  •   Nikwin    15 年前

    我不确定这是不是你要找的答案,但是在
    pygame.draw.aaline(屏幕,线条颜色,(1,1),(639,399))
    你应该把
    pygame.display.flip()。
    这样,玩家实际看到的显示将刷新每一帧。如果您运行此代码,那么您将看到的只是一个黑屏,没有任何行,因为显示永远不会更新。

        6
  •  0
  •   Timothy Lawman    12 年前

    简单地说,从经验测试来看,你似乎有一条线:

    pygame.quit()
    

    在sys.exit()之前缺少