#python #pygame
#python #pygame
Вопрос:
Я пытался использовать такой код:
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
Но, похоже, это не работает, что я делаю не так?
Ответ №1:
Я рекомендую использовать pygame.Rect
объект, чтобы ограничить круг границами окна, в следующем window
— поверхность отображения :
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))
Объяснение:
get_rect()
генерирует a pygame.Rect
с размером, часто равным тому pygame.Surface
, который связан с отображением. inflate()
генерирует новый прямоугольник с размером, измененным на диаметр круга, где прямоугольник остается центрированным вокруг его текущего центра.
В следующем min
и max
используются для зажима центра круга в области, определяемой прямоугольником.
Ответ №2:
Вы могли бы избежать сравнения отношений одинаковости ==
для границы. Я использую <=
или >=
для границы сравнения.
Я не знаю о вашем коде и контексте, но, полагаю circleX
, circleY
он был изменен другим методом.
Если он изменяет переменные как угодно circleX = 20
, ему можно передать все if-условие. или, если он был вызван слишком быстро некоторыми событиями в потоковой среде, мы не можем доверять значению circleX
.
Я рекомендую сравнивать следующим образом:
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
и его можно сократить, используя условие less if:
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
НО более короткий код в моем личном фаворите:
circleX = min(max(16, circleX), 484)
circleY = min(max(16, circleY), 484)