4

PyGame でスプライトをマウスクリックに応答させる標準的な方法は何ですか?

私のイベントループでは、簡単なものがあります:

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        exit_game()
    [...]
    elif (  event.type == pygame.MOUSEBUTTONDOWN and
            pygame.mouse.get_pressed()[0]):
        for sprite in sprites:
            sprite.mouse_click(pygame.mouse.get_pos())

それに関するいくつかの質問:

  1. これは、マウス クリックに応答する最良の方法ですか?
  2. マウスがスプライト上でしばらく押されたままになるとどうなりますか? そこから単一のイベントを作成するにはどうすればよいですか?
  3. これは、すべてのスプライトにクリックを通知する合理的な方法ですか?

前もって感謝します

4

1 に答える 1

11

あなたの例のように、私は通常、クリック可能なオブジェクトにクリック機能を与えます。クリック関数が呼び出されるときに簡単に反復できるように、これらすべてのオブジェクトをリストに入れます。

どのマウスボタンを押したかを確認するときは、イベントのボタン プロパティを使用します。

import pygame
from pygame.locals import * #This lets you use pygame's constants directly.

for event in pygame.event.get():
    if event.type == MOUSEBUTTONDOWN:  #Better to seperate to a new if statement aswell, since there's more buttons that can be clicked and makes for cleaner code.
        if event.button == 1:
            for object in clickableObjectsList:
                object.clickCheck(event.pos)

これが推奨される方法であると言えます。クリックは 1 回しか登録されないため、ユーザーがボタンで「ドラッグ」しているかどうかはスプライトに通知されません。これは、MOUSEBUTTONDOWN イベントで true に設定され、MOUSEBUTTONUP イベントで false に設定されたブール値を使用して簡単に実行できます。機能をアクティブ化するために反復される「ドラッグ可能な」オブジェクトがあります...など。

ただし、イベント ハンドラーを使用したくない場合は、更新関数に入力をチェックさせることができます。

pygame.mouse.get_pos() 
pygame.mouse.get_pressed().

大規模なプロジェクトでは、見つけにくいバグが発生する可能性があるため、これは悪い考えです。イベントを 1 か所にまとめたほうがよいでしょう。ただし、単純なアーケード ゲームなどの小規模なゲームでは、プローブ スタイルを使用する方が理にかなっている場合があります。

于 2008-12-25T22:46:33.913 に答える