pygameのイベントループに問題があります

Maniol102

プレイヤーが常に真ん中にいて、背景が動いてプレイヤーが動いているように見えるゲームを作っています。2つの矢印キーを押すと例。上下に斜めになりますが、上矢印を放すと右に進みます。動作する場合もありますが、ほとんどの場合、動きが止まります。

これを修正する方法がわかりません。

イベントループ

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False
    key = pygame.key.get_pressed()

    if key[K_UP]:
        if key[K_RIGHT]:
            bg.move("up_right")
        elif key[K_LEFT]:
            bg.move("up_left")
        else:
            bg.move("up")

    elif key[K_DOWN]:
        if key[K_RIGHT]:
            bg.move("down_right")
        elif key[K_LEFT]:
            bg.move("down_left")
        else:
            bg.move("down")


    elif key[K_RIGHT]:
        if key[K_DOWN]:
            bg.move("down_right")
        elif key[K_UP]:
            bg.move("up_right")
        else:
            bg.move("right")


    elif key[K_LEFT]:
        if key[K_DOWN]:
            bg.move("down_left")
        elif key[K_UP]:
            bg.move("up_left")
        else:
            bg.move("left")

移動

ここで動きが変わります

def move(self, direction):
    if direction == "up_right":
        self.posY += self.speed
        self.posX -= self.speed

    if direction == "up_left":
        self.posY += self.speed
        self.posX += self.speed

    if direction == "down_right":
        self.posY -= self.speed
        self.posX -= self.speed

    if direction == "down_left":
        self.posY -= self.speed
        self.posX += self.speed
        
    if direction == "up":
        self.posY += self.speed+2
        
    if direction == "down":
        self.posY -= self.speed+2
        
    if direction == "right":
        self.posX -= self.speed+2
        
    if direction == "left":
        self.posX += self.speed+2

最初は、「up_left」などを追加しませんでした。両方のifを通過して、両方の位置を編集するだけだと思ったからです。しかし、そうではありませんでした。

このトピックに対する回答がすでにある場合は申し訳ありませんが、見つかりませんでした。

ありがとう

怠惰

主な問題は、イベントループ内で押されたキーをチェックすることです。

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False

    # only executed if there's an event returned by pygame.event.get()
    # and possible executed multiple times per frame
    key = pygame.key.get_pressed()

    if key[K_UP]:
        ...

したがって、移動(if key[K_UP]: ...)を実行するコードは、現在キューにイベントがある場合にのみ実行されます。

このコードをイベントハンドラーループの外に移動するだけです。

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False

# always executed every frame
key = pygame.key.get_pressed()

if key[K_UP]:
     ...

私見では、動きを処理するためのより良い方法は、ベクトルを使用することです。ベクトルを使用すると、一定の移動速度を簡単に確保でき、コードがはるかに少なくなります。

簡単な例を次に示します。

import pygame

def main():
    pygame.init()
    screen = pygame.display.set_mode((500, 500))

    clock = pygame.time.Clock()
    dt = 0

    movement = {
        pygame.K_UP:    ( 0, -1),
        pygame.K_DOWN:  ( 0,  1),
        pygame.K_LEFT:  (-1,  0),
        pygame.K_RIGHT: ( 1,  0)
    }

    pos = pygame.Vector2((100, 100))

    while True:
        events = pygame.event.get()
        for e in events:
            if e.type == pygame.QUIT:
                return

        pressed = pygame.key.get_pressed()

        # calculate the movement vector
        move = pygame.Vector2()
        for dir in (movement[key] for key in movement if pressed[key]):
            move += dir

        if move.length() > 0: move.normalize_ip()
        # ensure we have a constant speed
        pos += move * dt/5

        screen.fill(pygame.Color('grey'))
        pygame.draw.circle(screen, pygame.Color('dodgerblue'), [int(x) for x in pos], 20, 0)
        pygame.display.update()
        dt = clock.tick(60)

if __name__ == '__main__':
    main()

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

LibreOfficeのインストールに問題があります

分類Dev

cocoapodsのインストールに問題があります

分類Dev

cocoapodsのインストールに問題があります

分類Dev

cocoapodsのインストールに問題があります

分類Dev

OpenSSLCocoapodのインストールに問題があります

分類Dev

spacyのインストールに問題があります

分類Dev

PyTorchのインストールに問題があります

分類Dev

g ++のインストールに問題があります

分類Dev

LibreOfficeのインストールに問題があります

分類Dev

SimpLESSのインストールに問題があります

分類Dev

PILのインストールに問題があります

分類Dev

tensorflowのインストールに問題があります

分類Dev

IntelHAXMのインストールに問題があります

分類Dev

ラズベリーパイにgnupgをインストールするのに問題があります

分類Dev

イベントの実行に問題があります

分類Dev

イベントハンドラーの登録に問題があります

分類Dev

イベントやワードプレスのテーマのインストールに問題があります

分類Dev

Pygame拡張スプライトに衝突の問題があります

分類Dev

Ubuntu(ラップトップHP)のインストールに問題があります

分類Dev

Ubuntu(ラップトップHP)のインストールに問題があります

分類Dev

Python用のGDALのインストールに問題があります

分類Dev

vivaldiのインストールに関連する問題があります

分類Dev

skllearnのインポートに問題があります

分類Dev

django-cors-middlewareのインストールに問題があります

分類Dev

Ubuntu PhoneSDKのインストールに問題があります

分類Dev

Duktoのインストールに問題がありますか?

分類Dev

jitsi-meetのインストールに問題がありますか?

分類Dev

CSSのスクロールスナップポイントに問題があります

分類Dev

CDH6.0.1のインストールcm-agentのインストールに問題があります

Related 関連記事

  1. 1

    LibreOfficeのインストールに問題があります

  2. 2

    cocoapodsのインストールに問題があります

  3. 3

    cocoapodsのインストールに問題があります

  4. 4

    cocoapodsのインストールに問題があります

  5. 5

    OpenSSLCocoapodのインストールに問題があります

  6. 6

    spacyのインストールに問題があります

  7. 7

    PyTorchのインストールに問題があります

  8. 8

    g ++のインストールに問題があります

  9. 9

    LibreOfficeのインストールに問題があります

  10. 10

    SimpLESSのインストールに問題があります

  11. 11

    PILのインストールに問題があります

  12. 12

    tensorflowのインストールに問題があります

  13. 13

    IntelHAXMのインストールに問題があります

  14. 14

    ラズベリーパイにgnupgをインストールするのに問題があります

  15. 15

    イベントの実行に問題があります

  16. 16

    イベントハンドラーの登録に問題があります

  17. 17

    イベントやワードプレスのテーマのインストールに問題があります

  18. 18

    Pygame拡張スプライトに衝突の問題があります

  19. 19

    Ubuntu(ラップトップHP)のインストールに問題があります

  20. 20

    Ubuntu(ラップトップHP)のインストールに問題があります

  21. 21

    Python用のGDALのインストールに問題があります

  22. 22

    vivaldiのインストールに関連する問題があります

  23. 23

    skllearnのインポートに問題があります

  24. 24

    django-cors-middlewareのインストールに問題があります

  25. 25

    Ubuntu PhoneSDKのインストールに問題があります

  26. 26

    Duktoのインストールに問題がありますか?

  27. 27

    jitsi-meetのインストールに問題がありますか?

  28. 28

    CSSのスクロールスナップポイントに問題があります

  29. 29

    CDH6.0.1のインストールcm-agentのインストールに問題があります

ホットタグ

アーカイブ