Spriteのマウスクリックを検出するコードをどのように作成するのか疑問に思っていました。例えば:
if #Function that checks for mouse clicked on Sprite:
print ("You have opened a chest!")
ゲームにはメインループがあり、すべてのスプライトは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())
したがって、私見の最初のアプローチを使用することをお勧めします。
マウスイベントのpygameのドキュメントはこちら 。 _pygame.mouse.get_pressed
_メソッドは、_pygame.mouse.get_pos
_と一緒に使用できます(必要な場合)。ただし、メインイベントループを介してマウスクリックイベントを使用してください。イベントループが優れている理由は、「短いクリック」によるものです。通常のマシンではこれらに気付かないかもしれませんが、トラックパッドでタップクリックを使用するコンピューターでは、クリック時間が極端に短くなります。マウスイベントを使用すると、これが防止されます。
EDIT:ピクセル完全衝突を実行するには、 スプライトのドキュメント にあるpygame.Sprite.collide_rect()
を使用します。
私はこの質問に対する同じ答えを探していましたが、頭を悩ませた後、これが私が思いついた答えです:
#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