マウスがスプライトをクリックしたことを検出するコードを作成する方法を考えていました。例えば:
if #Function that checks for mouse clicked on Sprite:
print ("You have opened a chest!")
マウスがスプライトをクリックしたことを検出するコードを作成する方法を考えていました。例えば:
if #Function that checks for mouse clicked on Sprite:
print ("You have opened a chest!")
ゲームにメイン ループがあり、すべてのスプライトが というリストにあると仮定しますsprites
。
メイン ループで、すべてのイベントを取得し、MOUSEBUTTONDOWN
orMOUSEBUTTONUP
イベントを確認します。
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 を使用することをお勧めします。
マウス イベントに関する pygame のドキュメントはこちらです。
pygame.mouse.get_pressed
メソッドを と組み合わせて使用することもできますpygame.mouse.get_pos
(必要な場合)。
メイン イベント ループ経由でマウス クリック イベントを使用することを忘れないでください。イベント ループが優れている理由は、「短いクリック」によるものです。通常のマシンではこれらに気付かないかもしれませんが、トラックパッドでタップ クリックを使用するコンピュータでは、クリック間隔が極端に短くなります。マウスイベントを使用すると、これを防ぐことができます。
編集:
ピクセルの完全な衝突を実行するには、ドキュメントにある sprites を使用pygame.sprite.collide_rect()
します。
私はこの質問に対する同じ答えを探していましたが、多くの頭を悩ませた後、これが私が思いついた答えです:
# 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()