I tried using this kind of code:
if circleX - 16 == 0:
circleX = 16
elif circleY - 16 == 0:
circleY = 16
elif circleY + 16 == 500:
circleY = 484
elif circleX + 16 == 500:
circleX = 484
elif circleY - 16 == 0 and circleX - 16 == 0:
circleY = 16
circleX = 16
elif circleY + 16 == 500 and circleX + 16 == 500:
circleX = 484
circleY = 484
elif circleY + 16 == 500 and circleX - 16 == 0:
circleY = 484
circleX = 16
elif circleY - 16 == 0 and circleX + 16 == 500:
circleX = 484
circleY = 16
But it doesn’t seem to work, what am i doing wrong?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
I recommend to use a pygame.Rect object to limit the a circle to the bounds of the window In the following window is the display Surface :
radius = 16
clampRect = window.get_rect().inflate(-radius*2, -radius*2)
circleX = max(clampRect.left, min(clampRect.right, circleX))
circleY = max(clampRect.top, min(clampRect.bottom, circleY))
Explanation:
get_rect() generates a pygame.Rect with the size oft the pygame.Surface which is associated to the display. inflate() generates a new rectangle with the size changed by the diameter oft the circle, where the rectangle remains centered around its current center.
In the following, min and max are used to clamp the center of the circle in the area defined by the rectangle.
Method 2
You could avoid sameness relation comparison == for boundary. I use <= or >= for compare boundary.
I do not know about your code and context, but I suppose circleX, circleY has been changed on other method.
If it change variables as like circleX += 20, it can be passed all if-condition. or if it was called too fast by some events on thread environment, we can not trust the value of circleX.
I recommend to compare as following:
if circleX - 16 <= 0: # Left border
circleX = 16
elif circleY - 16 <= 0: # Top
circleY = 16
elif circleY + 16 >= 500: # Bottom
circleY = 484
elif circleX + 16 >= 500: # Right
circleX = 484
elif circleY - 16 <= 0 and circleX - 16 <= 0: # Top Left corner
circleY = 16
circleX = 16
elif circleY + 16 >= 500 and circleX + 16 >= 500: # Bottom right
circleX = 484
circleY = 484
elif circleY + 16 >= 500 and circleX - 16 <= 0: # Bottom left
circleY = 484
circleX = 16
elif circleY - 16 <= 0 and circleX + 16 >= 500: # Top right
circleX = 484
circleY = 16
and it can be shorten by using less if condition:
if circleX - 16 <= 0: # Left border
circleX = 16
if circleY - 16 <= 0: # Top Left corner
circleY = 16
elif circleY - 16 <= 0: # Top
circleY = 16
if circleX + 16 >= 500: # Top right
circleX = 484
elif circleY + 16 >= 500: # Bottom
circleY = 484
if circleX - 16 <= 0: # Bottom left
circleX = 16
elif circleX + 16 >= 500: # Right
circleX = 484
if circleY + 16 >= 500: # Bottom right
circleY = 484
BUT, more short code in my personal favorite is:
circleX = min(max(16, circleX), 484)
circleY = min(max(16, circleY), 484)
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0