Pygame旋转绘制图片与对应rect偏移、矩形左上角对齐图片中心如何解决
问题原因
偏移的核心原因是blitRotateCenter函数的坐标参数定义和调用时传入的参数含义不匹配:
- 调用时传入的
auto.rect.x、auto.rect.y是原图片矩形的左上角坐标 - 但
blitRotateCenter函数内部将传入的left、top参数作为了原图片的中心坐标使用,用来计算旋转后图片的中心位置
所以最终绘制的旋转后图片的中心,刚好落在红色矩形的左上角,和你描述的现象完全一致。
解决方案
两种修改方式二选一即可:
方式1:修改函数调用逻辑
如果保留blitRotateCenter现有逻辑(传入参数为图片中心坐标),只需要把调用时的入参改成原矩形的中心坐标:
# 原入参auto.rect.x、auto.rect.y替换为原矩形的中心坐标 blitRotateCenter(auto.image, auto.rect.centerx, auto.rect.centery, auto.wagen_winkel)
方式2:修改旋转函数逻辑
如果希望blitRotateCenter传入的前两个参数保持为原图片的左上角坐标,修改函数内部的中心计算逻辑即可:
def blitRotateCenter(image, left, top, angle): rotated_image = pygame.transform.rotate(image, angle) # 原center=(left,top)改为topleft=(left,top),匹配传入参数为左上角的场景 new_rect = rotated_image.get_rect(center = image.get_rect(topleft = (left, top)).center) screen.blit(rotated_image, new_rect)
补充说明
pygame.transform.rotate操作会改变图片的实际像素尺寸:旋转后的图片会生成一个更大的矩形Surface,用来容纳旋转后超出原尺寸的边角内容,因此不能直接用原图片的rect放置旋转后的图片,必须通过计算原图片的目标坐标来对齐旋转后的新rect位置,这也是当前get_rect(center=...)写法的作用。
如果你需要绘制的红色矩形和旋转后的图片完全对齐,可以修改函数返回新生成的rect,调用后替换原有auto.rect:
# 修改后的旋转函数 def blitRotateCenter(image, left, top, angle): rotated_image = pygame.transform.rotate(image, angle) new_rect = rotated_image.get_rect(center = image.get_rect(topleft = (left, top)).center) screen.blit(rotated_image, new_rect) return new_rect # 调用时接收返回的新rect赋值给auto.rect auto.rect = blitRotateCenter(auto.image, auto.rect.x, auto.rect.y, auto.wagen_winkel) draw.rect(screen,red,auto.rect)
内容的提问来源于stack exchange,提问作者Joachim
相关产品推荐
相关产品推荐

