1

キーを押したままにするとスプライトが動くようにする解決策を見つけました。問題は、醜い複製コードを書かなければならないことです。私が見つけた現在の解決策は次のとおりです。

       for event in pygame.event.get():
            if event.type == KEYDOWN:
                keystate = pygame.key.get_pressed()
                while keystate[K_RIGHT]:
                    screen.fill((255,255,255))
                    pygame.event.get()

                    for sprite in sprites:
                        rimage = sprite[1].getimage()

                        if sprite[2] is None:
                            x+=3
                            sprite[1].update(time)
                            screen.blit(rimage, (x,y))
                            if sprite[1].isfinished() == True:
                                sprite[1].reset()
                            last_dir = "right"
                            if x >= screen_width - rimage.get_width():
                                x = screen_width - rimage.get_width()

                    #update player sprite movement
                    #update player sprite animation
                    #update rest of game map

                    keystate = pygame.key.get_pressed()
                    time = pygame.time.get_ticks()


                    pygame.display.update()

問題は、while キーステート ブロックです。方向ごとに繰り返す必要があり、ゲームの世界は while ブロックごとに更新する必要があります。つまり、同じコードを複製する必要がある場所は 5 か所です...4 方向に加えて、キーが押されていない場合。関数でラップすることはできましたが、pygame でボタンを押したままにするより良い方法があるかどうか疑問に思っていました。

4

3 に答える 3

5

pygame の通常のプログラムでは、イベントを使用して方向を更新し、更新位置コードをイベントの外に記述します。この方法では、複製されたコードは必要ありません。

clock = pygame.time.Clock()

direction = (0,0)

while True:    # main loop

   for event in pygame.event.get():

        if event.type == KEYDOWN:
            if event.key == K_RIGHT:
                direction = (3, 0)
            elif event.key == K_LEFT:
                direction = (-3, 0)
            elif event.key == K_UP:
                direction = (0, 3)
            elif event.key == K_DOWN:
                direction = (0, -3)
            else:
                print "Unrecognized key"

        if event.type == KEYUP:
            direction = (0, 0)

    screen.fill((255,255,255))

    for sprite in sprites:
        rimage = sprite[1].getimage()

        if sprite[2] is None:

            # Check if new position is inside the screen
            new_pos = x + direction[0], y + direction[1]
            if new_pos[0] + rimage.get_width() < screen_width:
                x = new_pos[0]
            if new_pos[1] + rimage.get_height() < screen_height:
                y = new_pos[1]

            # Draw the sprite
            sprite[1].update(time)
            screen.blit(rimage, (x,y))
            if sprite[1].isfinished() == True:
                sprite[1].reset()
                last_dir = direction

    #update player sprite movement
    #update player sprite animation
    #update rest of game map

    time = pygame.time.get_ticks()

    pygame.display.update()

    clock.tick(40)  # Keep game running at 40 fps

必要に応じて、keystate を使用して同じことを実現できます。その場合、キー イベントを処理する必要はありません。

于 2012-12-02T17:50:32.930 に答える
1

Pygame は、プログラムを 3 つの部分に分割することを提案または暗示しています。

イベントの処理、更新、および描画。pmoleri がすでに言ったように、動きの方向を変えるだけです。update 関数では、経過時間に従ってすべてのスプライトを移動するために、デルタ時間パラメータを渡す必要があります。他の手法ではプロセッサの可変速度が考慮されていないため、これは非常に重要です。DOS のゲームはこのように作られているため、人工的にプロセッサを遅くするエミュレータが必要です。描画部分は、単にすべてのスプライトを描画します。

このようにして、ゲームの 3 つの異なる部分、つまりプレイヤー入力、ゲーム ロジック (移動、衝突、アクションなど)、および描画を明確に区別できます。

于 2012-12-02T18:25:19.163 に答える