35

マウスがスプライトをクリックしたことを検出するコードを作成する方法を考えていました。例えば:

if #Function that checks for mouse clicked on Sprite:
    print ("You have opened a chest!")
4

4 に答える 4

53

ゲームにメイン ループがあり、すべてのスプライトが というリストにあると仮定しますsprites

メイン ループで、すべてのイベントを取得し、MOUSEBUTTONDOWNorMOUSEBUTTONUPイベントを確認します。

while ... # your main loop
  # get all events
  ev = pygame.event.get()

  # proceed events
  for event in ev:

    # handle MOUSEBUTTONUP
    if event.type == pygame.MOUSEBUTTONUP:
      pos = pygame.mouse.get_pos()

      # get a list of all sprites that are under the mouse cursor
      clicked_sprites = [s for s in sprites if s.rect.collidepoint(pos)]
      # do something with the clicked sprites...

したがって、基本的には、メインループの反復ごとに自分でスプライトのクリックをチェックする必要があります。mouse.get_pos()rect.collidepoint( )を使用する必要があります。

Pygame は、 cocos2dなどのイベント駆動型プログラミングを提供しません。

別の方法として、マウス カーソルの位置と押されたボタンの状態を確認する方法がありますが、この方法にはいくつか問題があります。

if pygame.mouse.get_pressed()[0] and mysprite.rect.collidepoint(pygame.mouse.get_pos()):
  print ("You have opened a chest!")

このケースを処理した場合は、何らかのフラグを導入する必要があります。そうしないと、このコードは「胸を開けました!」と出力するためです。メインループのすべての反復。

handled = False

while ... // your loop

  if pygame.mouse.get_pressed()[0] and mysprite.rect.collidepoint(pygame.mouse.get_pos()) and not handled:
    print ("You have opened a chest!")
    handled = pygame.mouse.get_pressed()[0]

もちろん、次のようSpriteに呼び出されるメソッドをサブクラス化して追加できます。is_clicked

class MySprite(Sprite):
  ...

  def is_clicked(self):
    return pygame.mouse.get_pressed()[0] and self.rect.collidepoint(pygame.mouse.get_pos())

したがって、最初のアプローチ IMHO を使用することをお勧めします。

于 2012-06-12T07:29:18.307 に答える
9

マウス イベントに関する pygame のドキュメントはこちらです。

pygame.mouse.get_pressedメソッドを と組み合わせて使用​​することもできますpygame.mouse.get_pos(必要な場合)。

メイン イベント ループ経由でマウス クリック イベントを使用することを忘れないでください。イベント ループが優れている理由は、「短いクリック」によるものです。通常のマシンではこれらに気付かないかもしれませんが、トラックパッドでタップ クリックを使用するコンピュータでは、クリック間隔が極端に短くなります。マウスイベントを使用すると、これを防ぐことができます。

編集: ピクセルの完全な衝突を実行するには、ドキュメントにある sprites を使用pygame.sprite.collide_rect()ます

于 2012-06-12T03:25:52.457 に答える
5

私はこの質問に対する同じ答えを探していましたが、多くの頭を悩ませた後、これが私が思いついた答えです:

# Python 3.4.3 with Pygame
from sys import exit
import pygame
pygame.init()

WIDTH = HEIGHT = 300
window = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Crash!')

# Draw Once
rectangle = pygame.draw.rect(window, (255, 0, 0), (100, 100, 100, 100))
pygame.display.update()

# Main Loop
while True:
    # Mouse position and button clicking
    pos = pygame.mouse.get_pos()
    pressed1 = pygame.mouse.get_pressed()[0]

    # Check if rectangle collided with pos and if the left mouse button was pressed
    if rectangle.collidepoint(pos) and pressed1:
        print("You have opened a chest!")

    # Quit pygame
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
于 2015-12-16T01:47:23.117 に答える