2009-09-12 88 views
4

這裏是我如何實現我的簡單pygames現在:這個基本的pygame結構如何?

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()循環。任何建議,如變量的情況/命名,任何使其更有效或可讀的建議?

回答

12

無論pygame作者建議,我建議避免from ... import *:它不僅使你的代碼難以閱讀(如讀者有檢查每一個barename來檢查它是否是實際在本地轉讓或來自厲害的*)。比如說,把它改成import pygame.locals as pygl,並且每一次使用它的名字都是合格的(我認爲在你的代碼中這意味着將QUIT更改爲pygl.QUIT)。你選擇什麼簡稱代替pygl並不重要,但這是我強烈建議的一般結構。 Remeber:命名空間是個好主意 - 讓我們來做更多這些!)

隨處可用4格縮進,正如PEP 8所說的:您似乎將一些4格縮進與其他8格縮進混合,空間或標籤 - 不要

不要分配給你永遠不會使用的變量,因爲你正在爲time_passed這樣做。

這樣的代碼: 如果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() 
+3

>「我建議避免... import *:」。 'pygame.locals'正是爲這種用法而存在的。它包含許多常用的常量,主要是鍵碼和事件類型。 – SingleNegationElimination 2009-09-12 03:28:06

+0

標籤/空間4/8混合是一個意外。我使用製表符,而不是空格,因爲在jEdit中有空格,我必須退格4次才能進入縮進級別,而且只能使用製表符。不過,我可以隨時將它們全部轉換爲空格。 – mk12 2009-09-12 04:19:40

+0

而字典裏的東西,並不是所有的情況下都只有一個聲明是一個方法調用,那麼這些如何工作呢?我不確定導入部分,爲什麼他們在文檔中說:「作爲一種方便,pygame中的大多數頂級變量都放在名爲'pygame.locals'的模塊中。這應該是與'from pygame.locals import *'一起使用,除了'import pygame'。「 ?感謝您花時間回答,我會再次審視您的意見。 – mk12 2009-09-12 04:25:45

0

這看起來基本上是我見過的其他每個例子。也許你可能想找到一些用pygame編寫的開源遊戲。

0

我不知道,如果這是那種你正在尋找的答案,但經過
pygame.draw.aaline(屏幕,LINE_COLOUR,(1,1),(639,399))
你應該把
pygame.display.flip()
這樣,玩家實際看到的顯示將會在每一幀都會刷新。如果你運行這個代碼,那麼你將看到的只是一個黑屏,沒有行,因爲顯示從不更新。

+0

謝謝,我忘了。我通常總是這樣做。 – mk12 2009-09-12 12:55:56

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。得到 - 得到 事件隊列從隊列中獲取事件
  • pygame.event.poll - 從隊列中取出一個 事件從隊列中取出一個 事件
  • pygame.event.wait - 等待從隊列

  • pygame.event.clear([pygame.QUIT, pygame.ACTIVEEVENT,pygame.KEYDOWN, PY單 事件game.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)) 
0

從實證檢驗很簡單,你似乎有一行:

pygame.quit() 

sys.exit前失蹤()

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