在pygame中处理负宽度和负高度的矩形



我想做一个区域选择功能,当你按住鼠标左键并移动鼠标时,它会形成一个矩形,矩形内的所有东西都被选中。

import pygame
import time
window = pygame.display.set_mode((1200, 600))
thickest = 10
begin = False
while True:
pygame.event.get()
window.fill((255, 255, 255))
if any(pygame.mouse.get_pressed()) and not begin:
rpos = pygame.mouse.get_pos()
begin = True
if begin:
pos2 = pygame.mouse.get_pos()
pygame.draw.rect(window, (100, 200, 100), (rpos[0], rpos[1], pos2[0] - rpos[0], pos2[1] - rpos[1]), 1)
if not any(pygame.mouse.get_pressed()) and begin:
begin = False

pygame.display.flip()

然而,我注意到一个负高度的矩形根本没有被绘制,一个负宽度的矩形甚至不是矩形。

我想到的一件事是用size来抵消位置,并将size作为size的绝对值。x轴示例:

if pos2[0] - rpos[0] < 0:
pygame.draw.rect(window, (100, 200, 100), (rpos[0] - (pos2[0] - rpos[0]), 
rpos[1], 
abs(pos2[0] - rpos[0]), 
pos2[1] - rpos[1]))

但是这种方法看起来并不优雅,我想知道是否有一种更pygame- key的方法来处理这个问题。

min计算矩形的左上角,用abs计算矩形的宽度和高度:

rect = (
min(pos2[0], rpos[0]), min(pos2[1], rpos[1]),
abs(pos2[0]-rpos[0]), abs(pos2[1]-rpos[1])
)
pygame.draw.rect(window, (100, 200, 100), rect)

绘制一个未填充的矩形

rect = (
min(pos2[0], rpos[0]),
min(pos2[1], rpos[1]),
max(2, abs(pos2[0]-rpos[0])),
max(2, abs(pos2[1]-rpos[1])),
)        
pygame.draw.rect(window, (100, 200, 100), rect, 1)

pygame.Rect.normalize()为这个问题提供了一个更优雅的解决方案:

normalize() -> None
这将翻转矩形的宽度或高度,如果它的大小为负。矩形将保持在原来的位置,只是交换了边。

创建pygame.Rect对象和normalize对象:

rect = pygame.Rect(rpos[0], rpos[1], pos2[0]-rpos[0], pos2[1]-rpos[1])
rect.normalize()
pygame.draw.rect(window, (100, 200, 100), rect)

最新更新