2012-06-12 20 views
11

スプライトをマウスがクリックしたことを検出するコードを書く方法が不思議でした。たとえば、Pygameマウスのクリック検出

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

答えて

6

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()を使用しています。

+0

どのように適用されることしかしスプライトをクリックすると? –

+0

@EliasBenevedesピクセル完璧な衝突で私の答えを編集しました。 – jakebird451

21

ゲームにメインループがあり、すべてのスプライトが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()) 

だから、それは最初のアプローチの私見を使用することをお勧めします。

+3

また、マウスの位置は 'event.pos'のイベント自体でも利用可能です –

3

私はこの質問に、これを傷ずっと頭の後に同じ答えを探していた私が思いついた答えは次のとおりです。

#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 
関連する問題