【问题标题】:Handling rectangle with negative width and height in pygame在pygame中处理具有负宽度和高度的矩形
【发布时间】:2021-02-27 17:08:33
【问题描述】:

我试图创建一个区域选择功能,您按住鼠标左键并移动鼠标,它会创建一个矩形,并且该矩形内的所有内容都会被选中。

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

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

我想做的一件事是按大小偏移位置,并将大小作为大小的绝对值。 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-ey 的方法来处理这个问题。

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    使用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() -&gt; 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)
    

    【讨论】:

    • 矩形未填充时似乎出现了故障。当宽度或高度为 0 时。
    • @hippozhipos 但这与minabs无关,这是大小为0的矩形的普遍问题。
    • @hippozhipos 使用max(2, ...) 而不是... if ... else 2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 2015-03-25
    相关资源
    最近更新 更多