you're right, it seems to detect overlap when it's simply against. Maybe it's supposed to work that way? I'm not sure.
Anyway here's a cap with a few changes: capx
The main thing is I just made the collision polygon a slighly smaller square.
I thought i saw some picking problems so i just instinctively added the 'for each' condition, it might not be necessary though.
The detect variable is so it doesn't have to check for overlaps every single tick.. collision detection is relatively more cpu heavy than most actions..apparently
and the set x to (int(self.x/16))*16 is just to add snapping.