mouse.get_pressed()inconsistent / returning(0、0、0)

Sep 20 2020

編集(解決済み):event.buttonを使用することでうまくいったようです。0、0、0を返すと、正しいマウスボタンを返します(1 =左、3 =右)

私はこれに対する解決策を探してみましたが、すべての答えで、その人はpg.event.get()のイベントについて知らなかったか、含めるのを忘れたようです.. pygameでのマウス検出が確実に機能しなくなり、私はmハードウェアエラーなのか、コードが悪いのか、それとも他の何かなのかわからない。これは、マウス用のゲームループの簡略版です。

while running:
     for event in pg.event.get():
            pos = pg.mouse.get_pos()
            if event.type == pg.MOUSEBUTTONDOWN:
                if grid_space.get_rect(x=(adj_x), y=(adj_y)).collidepoint(pos):
                    if pg.mouse.get_pressed()[2]:
                        do_thing()
                    elif event.button == 4:
                        do_thing()
                    elif event.button == 5:
                        do_thing()
                    else:
                        print(pg.mouse.get_pressed())
                        do_thing()

現時点で最も重要なアクションの信頼性を高める唯一の方法であるため、マウスのプライマリボタンをelseに移動しましたが、elseの結果を印刷すると、4回または5回のクリックごとに1回(0、0、 (1、0、0)ではなく0)。式の書き方、構造の単純化、Pygameクロックの増加など、さまざまな方法を試しましたが、何も機能していません。

誰かがこれに遭遇しましたか、そして解決策はありますか?

編集:get_pressedの結果をすぐに変数に保存する別のテストを実行しましたが、それでも0、0、0が返されるため、状態がMOUESBUTTONDOWNから呼び出された時点まで変更されていないことは間違いありません。

回答

1 Rabbid76 Sep 19 2020 at 23:41

pygame.mouse.get_pressed()マウスボタンの現在の状態を取得します。マウスイベントが発生したため、ボタンの状態が変更された可能性があります。イベントはキューに保存され、保存されたイベントはアプリケーションの後半でによって受信されることに注意してくださいpygame.event.get()。その間、ボタンの状態が変更された可能性があります。これにより、MOUSEBUTTONDOWNイベントが発生するボタンがオブジェクトのbutton属性にpygame.event.Eventすぐに保存されます。イベントループでは、あなたがイベントにの状態を取得WHNevent.buttonとpygame.mouse.get_pressed()異なる場合があります。
同じことがpygame.mouse.get_pos()。にも当てはまります。マウスの位置は、属性に格納されてpos使用event.buttonしてevent.posではなく、pygame.mouse.get_pressed()とpygame.mouse.get_pos():

while running:
     for event in pg.event.get():
            
            if event.type == pg.MOUSEBUTTONDOWN:
               print(event.button)

               if grid_space.get_rect(topleft=(adj_x, adj_y)).collidepoint(event.pos):
                    if event.button == 2:
                        do_thing()
                    elif event.button == 4:
                        do_thing()
                    elif event.button == 5:
                        do_thing()
                    else:
                        do_thing()

pygame.mouse.get_pos()そして、pygame.mouse.get_pressed()イベントループで使用するためのものではありません。関数は、アプリケーションループで直接使用する必要があります。