2012-06-12 15 views

उत्तर

6

The pygame documentation for mouse events is here। आप (यदि आवश्यक हो) के सहयोग से pygame.mouse.get_pressed विधि का उपयोग कर सकते हैं। लेकिन कृपया मुख्य ईवेंट लूप के माध्यम से माउस क्लिक ईवेंट का उपयोग करें। घटना लूप बेहतर होने का कारण "लघु क्लिक" के कारण है। आप इन्हें सामान्य मशीनों पर नहीं देख सकते हैं, लेकिन ट्रैकपैड पर टैप-क्लिक का उपयोग करने वाले कंप्यूटरों में अत्यधिक छोटी क्लिक अवधि होती है। माउस घटनाओं का उपयोग करना इसे रोक देगा।

संपादित करें: करने के लिए पिक्सेल सही टकराव pygame.sprite.collide_rect()their docs for sprites पर पाया का उपयोग करें।

+0

मैं कैसे लागू होगा कि हालांकि स्प्राइट पर क्लिक करने के लिए? –

+0

@ एलियासबेनेवेस मैंने पिक्सेल सही टकराव के साथ अपना जवाब संपादित किया। – jakebird451

21

मुझे लगता है कि आपके गेम में मुख्य लूप है, और आपके सभी sprites 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() का उपयोग करना चाहेंगे।

पायगम घटना संचालित प्रोग्रामिंग की पेशकश नहीं करता है, उदाहरण के लिए 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 उपयोग करने के लिए बेहतर है।

+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 
संबंधित मुद्दे