スプライトをマウスがクリックしたことを検出するコードを書く方法が不思議でした。たとえば、Pygameマウスのクリック検出
if #Function that checks for mouse clicked on Sprite:
print ("You have opened a chest!")
スプライトをマウスがクリックしたことを検出するコードを書く方法が不思議でした。たとえば、Pygameマウスのクリック検出
if #Function that checks for mouse clicked on Sprite:
print ("You have opened a chest!")
The pygame documentation for mouse events is hereです。 pygame.mouse.get_pressed
メソッドをpygame.mouse.get_pos
と共同で使用することができます(必要な場合)。しかし、メインイベントループを介してマウスクリックイベントを使用してください。イベントループがより良い理由は、「短いクリック」によるものです。通常のマシンではこれらのアイコンを気付かないかもしれませんが、トラックパッドのタップ・クリックを使用するコンピュータのクリック時間は短すぎます。マウスイベントを使用するとこれを防ぐことができます。
EDIT: ピクセル完璧な衝突を実行するには、their docs for spritesで見つけpygame.sprite.collide_rect()
を使用しています。
ゲームにメインループがあり、すべてのスプライトが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...
したがって、基本的にメインループの繰り返しごとにスプライトをクリックする必要があります。 mouse.get_pos()とrect.collidepoint()を使用します。
Pygameはイベント駆動型プログラミングを提供していません。 cocos2dです。
もう1つの方法は、マウスカーソルの位置と押したボタンの状態を確認することですが、この方法にはいくつか問題があります。
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())
だから、それは最初のアプローチの私見を使用することをお勧めします。
また、マウスの位置は 'event.pos'のイベント自体でも利用可能です –
私はこの質問に、これを傷ずっと頭の後に同じ答えを探していた私が思いついた答えは次のとおりです。
#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
どのように適用されることしかしスプライトをクリックすると? –
@EliasBenevedesピクセル完璧な衝突で私の答えを編集しました。 – jakebird451