在 Pygame 中获取旋转图像的旋转矩形

Posted

技术标签:

【中文标题】在 Pygame 中获取旋转图像的旋转矩形【英文标题】:Getting rotated rect of rotated image in Pygame 【发布时间】:2021-04-07 10:47:26 【问题描述】:

我有一个关于 pygame rect 的问题。

矩形不是我想要的。

我看到我可以用 sprite 类做到这一点。但我不想使用精灵。 我不明白 Sprite Rect 和 Image Rect 的区别。

I want to get rect like this

But I am getting like this

这是我的 rect 函数:

def getRect(self):
    return self.image.get_rect(center=(self.x,self.y))

图像是旋转图像。

我的英语不太好,我已经尽可能多地告诉你了。

【问题讨论】:

【参考方案1】:

get_rect() 返回一个pygame.Rect 对象。 pygame.Rect 存储位置和大小。它始终是轴对齐的,不能代表旋转的矩形。

使用pygame.math.Vector2.rotate() 计算旋转矩形的角点。 orig_image是旋转前的图片:

rect = orig_image.get_rect(center = (self.x, self.y))

pivot = pygame_math.Vector2(self.x, self.y)

p0 = (pygame.math.Vector2(rect.topleft) - pivot).rotate(-angle) + pivot 
p1 = (pygame.math.Vector2(rect.topright) - pivot).rotate(-angle) + pivot 
p2 = (pygame.math.Vector2(rect.bottomright) - pivot).rotate(-angle) + pivot 
p3 = (pygame.math.Vector2(rect.bottomleft) - pivot).rotate(-angle) + pivot 

使用pygame.draw.lines()绘制旋转矩形:

pygame.draw.lines(screen, (255, 255, 0), True, [p0, p1, p2, p3], 3)

另请参阅 How do I rotate an image around its center using PyGame? 和 How can you rotate an image around an off center pivot in PyGame。


最小示例: repl.it/@Rabbid76/PyGame-RotatedRectangle

import pygame

pygame.init()
window = 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 = 30
rotated_image = pygame.transform.rotate(orig_image, angle)

def draw_rect_angle(surf, rect, pivot, angle):
    pts = [rect.topleft, rect.topright, rect.bottomright, 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    

    window.fill(0)
    window_center = window.get_rect().center
    window.blit(rotated_image, rotated_image.get_rect(center = window_center))
    rect = orig_image.get_rect(center = window_center)
    draw_rect_angle(window, rect, window_center, angle)
    pygame.display.flip()

pygame.quit()
exit()

【讨论】:

非常感谢。如何检查一个对象是否在其矩形中? 我可以把它转换成一个类吗?因为我想检查一个对象是否在其矩形中。示例:hitbox = RotationedRect(image,angle) if hitbox.collide(hitbox2): ... @Arda 你可以将任何你想要的代码放在一个类中。但是,你需要实现自己的碰撞算法。我建议使用蒙版碰撞。见Pygame mask collision 好的,我会尝试做一个类。谢谢。

以上是关于在 Pygame 中获取旋转图像的旋转矩形的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pygame 中围绕偏离中心的枢轴旋转图像

Pygame,围绕中心旋转使图像消失

使用pygame旋转图像[重复]

如何使用 Pygame 围绕其中心旋转图像?

将旋转的图像转换为矩形左上角

如何设置 pygame.transform.rotate() 的轴心点(旋转中心)?