在没有失真的Pygame中旋转图像

时间:2017-04-26 10:40:17

标签: python image rotation pygame

我一直在尝试使用python 3.6在pygame中旋转图像,但是当我这样做时,要么将图像扭曲成无法识别的图像,要么在旋转时它会在整个地方颠簸

只使用pygame.transform.rotate(image, angle)会造成扭曲的混乱。 使用类似的东西: pygame.draw.rect(gameDisplay, self.color, [self.x, self.y, self.width, self.height])使图像在整个地方发生碰撞。

我在本网站及其他网站上查看过很多问题,到目前为止,这些问题都没有完美。 对于任何感兴趣的人来说,到目前为止我的代码链接。 https://pastebin.com/UQJJFNTy 我的图片是64x64。 提前谢谢!

2 个答案:

答案 0 :(得分:2)

根据文档(http://www.pygame.org/docs/ref/transform.html):

  

某些变换被认为具有破坏性。这意味着每次执行它们都会丢失像素数据。常见的例子是调整大小和旋转。 出于这个原因,最好重新转换原始曲面,而不是多次转换图像。

每次拨打transform.rotate时,您需要在原始图片上执行此操作,在之前旋转的图片上。例如,如果我希望图像每帧旋转10度:

image = pygame.image.load("myimage.png").convert()
image_clean = image.copy()
rot = 0

然后在你的游戏循环中(或对象的update):

rot += 10
image = pygame.transform.rotate(image_clean, rot)

答案 1 :(得分:1)

这是一个完整的例子。请勿修改原始图片,并在while循环中使用pygame.transform.rotaterotozoom获取新的旋转曲面并将其指定为其他名称。使用矩形来保持中心。

import sys
import pygame as pg


pg.init()
screen = pg.display.set_mode((640, 480))

BG_COLOR = pg.Color('darkslategray')
# Here I just create an image with per-pixel alpha and draw
# some shapes on it so that we can better see the rotation effects.
ORIG_IMAGE = pg.Surface((240, 180), pg.SRCALPHA)
pg.draw.rect(ORIG_IMAGE, pg.Color('aquamarine3'), (80, 0, 80, 180))
pg.draw.rect(ORIG_IMAGE, pg.Color('gray16'), (60, 0, 120, 40))
pg.draw.circle(ORIG_IMAGE, pg.Color('gray16'), (120, 180), 50)


def main():
    clock = pg.time.Clock()
    # The rect where we'll blit the image.
    rect = ORIG_IMAGE.get_rect(center=(300, 220))
    angle = 0

    done = False
    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True

        # Increment the angle, then rotate the image.
        angle += 2
        # image = pg.transform.rotate(ORIG_IMAGE, angle)  # rotate often looks ugly.
        image = pg.transform.rotozoom(ORIG_IMAGE, angle, 1)  # rotozoom is smoother.
        # The center of the new rect is the center of the old rect.
        rect = image.get_rect(center=rect.center)
        screen.fill(BG_COLOR)
        screen.blit(image, rect)

        pg.display.flip()
        clock.tick(30)


if __name__ == '__main__':
    main()
    pg.quit()
    sys.exit()