[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] Question about mouse motion



Julien Peeters wrote:
I wonder what is the best way to implement this algorithm:
while true:
if mouse click:
return get rect which mouse is on
Thanks for your answers.



I do something like this:
-Create a "widget_panel" that contains buttons etc., each with a rect defining its borders.
-Start an input loop handling different kinds of events.
-In the loop, include:


            ## Mouse events
            elif event.type == MOUSEBUTTONDOWN:
                handled = widget_panel.HandleMouseClick(event.pos)
                if not handled:
                    print "Clicked somewhere other than on a widget."

The HandleMouseClick function returns True for "handled" if it detects that the click was in one of its widgets -- in which case it tells the widget it was clicked. "event.pos" is part of the Pygame event data, which you get from "for event in pygame.event.get():".

In the function below, each widget ("foo") has coordinates x1,y1,x2,y2 rather than a Pygame rect; eh, sloppy, but you can convert easily, probably with the function "Rect.collidepoint(x, y) -> bool".

    def HandleMouseClick(self,pos=(0,0)):
        """Inform any button at these coords that it was clicked."""
        clicked_on_something = False
        x, y = pos
        for foo in self.widgets:
            if (foo.x1 <= x) & (foo.x2 >= x):
                if (foo.y1 <= y) & (foo.y2 >= y):
                    ## This button was clicked.
                    if hasattr(foo,"Click"):
                        foo.Click()
                    clicked_on_something = True
        return clicked_on_something


Hope this is useful.

Kris