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.QUITpygl

PEP 8 が言うように、どこでも 4 スペースのインデントを使用してください: 4 スペースのインデントと 8 スペースまたはタブの他のインデントを混在させているようです --しないでください!

のために行っているので、決して使用するつもりのない変数に代入しないでくださいtime_passed

if次のようなコード: if event.type == QUIT: exit_game() は、( /を使用して) 1 つまたは非常に少数の可能性をテストしている限り問題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.draw.aaline(screen、LINE_COLOUR、(1、1)、(639、399))の 後に pygame.display.flip()
を配置する必要があります これは、プレイヤーが実際に見る表示がフレームごとに更新されるようにするためです。このコードを実行すると、表示が更新されないため、表示されるのは黒い画面だけで、線はありません。

于 2009-09-12T12:48:21.513 に答える
0

これは、基本的に私が今まで見た他のすべての例のように見えます。おそらく、pygame で書かれたオープンソースのゲームを見つけたいと思うかもしれません。

于 2009-09-12T01:56:26.827 に答える
0

非常に簡単に経験的なテストから、次の行があるようです:

pygame.quit()

sys.exit() の前にありません

于 2012-10-22T14:18:23.030 に答える