pygame绘制线条中心点超出屏幕时消失,如何实现线宽入屏即可见
问题原因
pygame的pygame.draw.line内置了视口裁剪优化,会优先判断线条原始端点组成的外接矩形是否完全处于屏幕外,若判定为是就会直接跳过绘制。这个逻辑没有把线条的宽度参数纳入计算,所以当短线条加较大宽度绘制时,会出现实际可见区域还在屏幕内、但程序判定不需要绘制的bug。
解决方法
最简单的方案是延长线条的两个端点,延长长度至少为线条宽度的1/2,让原始线条的外接矩形覆盖带宽度后的实际绘制区域,就可以避开裁剪逻辑的误判,全程使用pygame.draw.line实现需求。
以你提供的代码为例,修改后的可运行代码如下:
import pygame pygame.init() WIN = pygame.display.set_mode((900, 600)) line_width = 48 # 延长偏移量设置为宽度的1/2 extend_offset = line_width // 2 clock = pygame.time.Clock() run = True while run: clock.tick(60) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False x, y = pygame.mouse.get_pos() WIN.fill((200, 200, 200)) # 每条线的端点都向两端延长extend_offset pygame.draw.line(WIN, (128, 128, 128), (x + 48, y - 24 - extend_offset), (x + 48, y + 24 + extend_offset), width = line_width) pygame.draw.line(WIN, (128, 128, 128), (x - 48, y - 24 - extend_offset), (x - 48, y + 24 + extend_offset), width = line_width) pygame.draw.line(WIN, (128, 128, 128), (x - 24 - extend_offset, y + 48), (x + 24 + extend_offset, y + 48), width = line_width) pygame.draw.line(WIN, (128, 128, 128), (x - 24 - extend_offset, y - 48), (x + 24 + extend_offset, y - 48), width = line_width) pygame.display.update() pygame.quit()
这个方案不需要更换绘制接口,性能开销几乎为零,修改成本极低。
如果你使用的是pygame 2.1.3及以上版本,也可以直接升级pygame,该版本已经修复了大宽度线条的裁剪判定bug,不需要修改原有代码也能正常显示。
内容的提问来源于stack exchange,提问作者Dorje
相关产品推荐
相关产品推荐

