Pygame中如何调整旋转矩形的尺寸使其小于关联图片大小
Pygame旋转矩形缩小尺寸的问题修复
问题原因
Pygame的Rect对象所有坐标、尺寸属性是联动的:当你修改topleft属性后,Rect的宽度会自动变化,此时再修改topright属性会直接覆盖上一步的调整,最终尺寸会回弹到和原图一致的初始值,所以修改不生效。
解决方法
不要通过修改两个顶点的方式调整矩形尺寸,先直接修改Rect的宽高参数,再对齐中心即可。你可以把内边距做成可配置的参数,灵活调整矩形的缩小幅度。
修正后的核心函数
def draw_rect_angle(surf, rect, pivot, angle, padding=25): # 先缩小矩形尺寸,padding是四周向内缩的距离 shrinked_rect = pygame.Rect( rect.left + padding, rect.top + padding, rect.width - padding * 2, rect.height - padding * 2 ) # 再取四个顶点做旋转计算 pts = [shrinked_rect.topleft, shrinked_rect.topright, shrinked_rect.bottomright, shrinked_rect.bottomleft] pts = [(pygame.math.Vector2(p) - pivot).rotate(-angle) + pivot for p in pts] pygame.draw.lines(surf, (255, 255, 0), True, pts, 3)
调用说明
调用函数时可以自定义padding参数调整缩进幅度,不传则默认使用25的缩进值:
# 主循环内调用示例,设置30像素缩进 draw_rect_angle(screen, rect, screen_center, angle, padding=30)
完整可运行代码
import pygame pygame.init() screen = pygame.display.set_mode((400, 400)) font = pygame.font.SysFont(None, 50) clock = pygame.time.Clock() #orig_image = font.render("rotated rectangle", True, (255, 0, 0)) angle =0 orig_image = pygame.image.load("Bilder/baum2.png") rotated_image = pygame.transform.rotate(orig_image, angle) def draw_rect_angle(surf, rect, pivot, angle, padding=25): shrinked_rect = pygame.Rect( rect.left + padding, rect.top + padding, rect.width - padding * 2, rect.height - padding * 2 ) pts = [shrinked_rect.topleft, shrinked_rect.topright, shrinked_rect.bottomright, shrinked_rect.bottomleft] pts = [(pygame.math.Vector2(p) - pivot).rotate(-angle) + pivot for p in pts] pygame.draw.lines(surf, (255, 255, 0), True, pts, 3) run = True while run: clock.tick(60) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False screen.fill(0) screen_center = screen.get_rect().center screen.blit(rotated_image, rotated_image.get_rect(center = screen_center)) rect = orig_image.get_rect(center = screen_center) draw_rect_angle(screen, rect, screen_center, angle) pygame.display.flip() pygame.quit() exit()
内容的提问来源于stack exchange,提问作者Joachim
相关产品推荐
相关产品推荐

