在 Pygame 中获取旋转图像的旋转矩形
Getting rotated rect of rotated image in Pygame
我对 pygame 矩形有疑问。
矩形与我想要的不一样。
我看到我可以用 sprite 做到这一点 class。但我不想使用精灵。
没看懂Sprite Rect和Image Rect的区别
I want to get rect like this
But I am getting like this
这是我的矩形函数:
def getRect(self):
return self.image.get_rect(center=(self.x,self.y))
图像是旋转图像。
我的英语不是很好,我已经尽力告诉你了。
get_rect()
returns a 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? and 。
最小示例: 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()
我对 pygame 矩形有疑问。
矩形与我想要的不一样。
我看到我可以用 sprite 做到这一点 class。但我不想使用精灵。 没看懂Sprite Rect和Image Rect的区别
I want to get rect like this
But I am getting like this
这是我的矩形函数:
def getRect(self):
return self.image.get_rect(center=(self.x,self.y))
图像是旋转图像。
我的英语不是很好,我已经尽力告诉你了。
get_rect()
returns a 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? and
最小示例:
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()