1

私はPygameが初めてなので、「イベント」の概念全体にまだ苦労しています。

基本的に、私の現在の課題は次のとおりです。

  1. pygame.event.get() をメイン ループの外で動作させて、プレイヤーがゲームのある部分から次の部分に進むことができるようにします (たとえば、スペースバーを押すことによって)。

  2. ゲームのさまざまな機能をメイン スレッドで整理して、ループを何度も繰り返したり、互いにオーバーライドしたりしないようにする方法を考えてください。

多くのゲームでメイン ループが重要であることは理解していますが、このゲームで 1 つのイベントから次のイベントへの移動が含まれる場合、どのようにメイン ループを使用できるかわかりません (これは比較的単純なテキスト ベースのゲームで、さまざまなメニューを選択し、選択肢を選択して進行します)。メイン ループは while ループであるため、その中のすべてが何度も繰り返されます。では、画面が互いに無限に衝突することなく、ある画面から次の画面に移動するにはどうすればよいでしょうか?

たとえば、導入シーケンス (Intro() 関数) があり、これは他の何よりも先に実行され、スペースバーを押すことで実際のゲームに進むことができます。ループしないように、実際のメイン ループの前に Intro() 関数を配置しました。ただし、 pygame.event.get() はその内部では機能しません (メインループにそのようなイベント "for" ループが既にあることに注意してください)。スペースバー。

誰かが私を啓発し、論理とスレッド化のレッスンを教えてくれれば素晴らしいことです.

ありがとう。

4

1 に答える 1

3

単一のメイン ループに固執し、本当に必要でない場合はスレッドを使用しないでください。

ゲームがさまざまな画面で構成されていることは既にわかっているので (描画する実際の画面Sceneと混同しないように名前を付けましょう)、次の論理的なステップはメイン ループからそれらを分離することです。


次のシーンがあるとします。

  • イントロ
  • メインメニュー
  • ゲームプレイ

次に、それらのそれぞれに対してクラスを作成する必要があります。これは、描画/イベント処理/この部分で必要なものを担当します。

簡単な例:

import pygame
pygame.init()

class Scene(object):
    screen = None

class Intro(Scene):
    def __init__(self):
        self.c = (32, 32, 100)

    def draw(self):
        Scene.screen.fill(self.c)

    def update(self):
        # since scenes are classes, they have a state that we can modify
        r,g,b = self.c
        r += 1
        g += 1
        b += 2
        if r > 255: r = 0
        if g > 255: g = 0
        if b > 255: b = 0
        self.c = r, g, b

    def handle(self, event):
        # move to Menu-scene when space is pressed
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                # returning a scene from handle or update changes the current scene
                return Menu()

class Menu(Scene):
    def draw(self):
        # draw menu
        Scene.screen.fill((200, 200, 100))

    def update(self):
        pass
        # do something

    def handle(self, event):
        # handle menu input
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_a:
                return Game()
            if event.key == pygame.K_b:
                return Intro()

class Game(Scene):
    pass # implement draw update handle

Scene.screen = pygame.display.set_mode((800, 600))

scene = Intro()
while True:
    if pygame.event.get(pygame.QUIT): break
    for e in pygame.event.get(): 
        scene = scene.handle(e) or scene
    scene = scene.update() or scene
    scene.draw()
    pygame.display.flip()

このように、メインループは 1 つですが、ゲームのさまざまな部分が個別のクラスによって管理されます。上記の単純な例では、各シーンは特定のイベントでアクティブにする他のシーンを認識していますが、これは必須ではありません。SceneHandlerシーン間の遷移を管理するようなものを作成できます。また、シーン間で渡したいある種のゲーム状態オブジェクトが必要になる場合があります (たとえば、ゲーム シーンのポイントをゲーム オーバー シーンに表示します)。

于 2013-09-09T07:54:14.907 に答える