Вращение прямоугольника в Python / Pygame - PullRequest
1 голос
/ 21 января 2012

Эй, я пытаюсь повернуть прямоугольник вокруг его центра, и когда я пытаюсь повернуть прямоугольник, он одновременно перемещается вверх и влево.У кого-нибудь есть идеи как это исправить?

def rotatePoint(self, angle, point, origin):
    sinT = sin(radians(angle))
    cosT = cos(radians(angle))
    return (origin[0] + (cosT * (point[0] - origin[0]) - sinT * (point[1] - origin[1])),
                  origin[1] + (sinT * (point[0] - origin[0]) + cosT * (point[1] - origin[1])))

def rotateRect(self, degrees):
    center = (self.collideRect.centerx, self.collideRect.centery)
    self.collideRect.topleft = self.rotatePoint(degrees, self.collideRect.topleft, center)
    self.collideRect.topright = self.rotatePoint(degrees, self.collideRect.topright, center)
    self.collideRect.bottomleft = self.rotatePoint(degrees, self.collideRect.bottomleft, center)
    self.collideRect.bottomright = self.rotatePoint(degrees, self.collideRect.bottomright, center)

Ответы [ 2 ]

1 голос
/ 21 января 2012

Код ротации выглядит хорошо - но вы знаете, что внутренности Pygame не работают с повернутыми прямоугольниками, не так ли?

Если у вас нет кода, который вы написали сами с новыми углами прямоугольника, то это делается для определения нового прямоугольника со сторонами, параллельными краям поверхности, где оригинальный прямоугольник при повороте может быть вписан прямоугольник того же размера, что и оригинал, под углом наклона. Любая функция Pygame, которой вы передаете объект «self.collideRect» после поворота, просто делает это: обрабатывает прямоугольник как выровненный по поверхности, как если бы он был создан с углами, которые он имеет сейчас.

Если ваш код требует, чтобы вы проверяли вещи или даже рисовали внутри повернутого прямоугольника, вы должны выполнить все вычисления так, как они были до вращения, и просто выполнить вращение координат во время отображения того, что вы хочу. То есть вы работаете с глобальным преобразованием координат, которое применяется на последнем этапе рендеринга.

0 голосов
/ 10 июля 2012

Может быть, это может вам помочь:

#load image
image1 = pygame.image.load(file)
#get width and height of unrotated image
width1,height1 = image1.get_size()
#rotate image
image2 = pygame.transform.rotate(image1, angle)
#get width,height of rotated image
width2,height2 = image2.get_size()
#blit rotated image (positon - difference of width or height /2)
display.blit(image2,[round(x - (width1 - width2)/2),round(y - (height1 - height2)/2)])
...