web-dev-qa-db-ja.com

Pygameマウスクリックの検出

Spriteのマウスクリックを検出するコードをどのように作成するのか疑問に思っていました。例えば:

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

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

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

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...

したがって、基本的には、メインループの反復ごとに自分でSpriteのクリックをチェックする必要があります。 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!")

このケースを処理する場合は、何らかのフラグを導入する必要があります。そうしないと、このコードは「You've open 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())

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

28
sloth

マウスイベントのpygameのドキュメントはこちら 。 _pygame.mouse.get_pressed_メソッドは、_pygame.mouse.get_pos_と一緒に使用できます(必要な場合)。ただし、メインイベントループを介してマウスクリックイベントを使用してください。イベントループが優れている理由は、「短いクリック」によるものです。通常のマシンではこれらに気付かないかもしれませんが、トラックパッドでタップクリックを使用するコンピューターでは、クリック時間が極端に短くなります。マウスイベントを使用すると、これが防止されます。

EDIT:ピクセル完全衝突を実行するには、 スプライトのドキュメント にあるpygame.Sprite.collide_rect()を使用します。

6
jakebird451

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

#Python 3.4.3 with Pygame
import pygame

pygame.init()
pygame.display.set_caption('Crash!')
window = pygame.display.set_mode((300, 300))
running = True

# Draw Once
Rectplace = pygame.draw.rect(window, (255, 0, 0),(100, 100, 100, 100))
pygame.display.update()
# Main Loop
while running:
    # Mouse position and button clicking.
    pos = pygame.mouse.get_pos()
    pressed1, pressed2, pressed3 = pygame.mouse.get_pressed()
    # Check if the rect collided with the mouse pos
    # and if the left mouse button was pressed.
    if Rectplace.collidepoint(pos) and pressed1:
        print("You have opened a chest!")
    # Quit pygame.
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
4
James Abela