Не позволяет персонажу выходить из окна

#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)