当我使用pygame.transform.rotate()时,它会移动我的图像,这样,如果连续使用它,它将离开屏幕。为什么?

时间:2014-08-21 20:05:08

标签: python pygame transformation

所以我加载了一张图片,然后用它旋转。但是,当我运行该程序时,它只是滑出屏幕。为什么呢?

import pygame, sys




def rotate45(gameObject):
    newObject = pygame.transform.rotate(gameObject, 45)
    return newObject

def main():
    pygame.init()
    screen = pygame.display.set_mode((800,600))
    Tardis = pygame.image.load("Tardis.bmp")
    Tardis.set_colorkey((255, 0, 0))









    while True:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()

        screen.fill( (0,0,0) )

        Tardis = rotate45(Tardis)

        screen.blit(Tardis, (400,300))

        pygame.display.update()

有人可以帮忙吗?如果你需要知道,我的图片是75 x 134。

我是编程新手,但我不知道为什么会这样。

2 个答案:

答案 0 :(得分:3)

就像@cmd所说,rotate转换会改变对象的尺寸。保存原始对象并继续将更改的转换应用于原始对象。以下是一个例子:

import pygame
import sys
import time

def rotate45(gameObject, rotations={}):
    r = rotations.get(gameObject,0) + 45
    rotations[gameObject] = r
    return pygame.transform.rotate(gameObject, r)

def main():
    pygame.init()
    screen = pygame.display.set_mode((800,600))
    Tardis = pygame.image.load("Tardis.bmp")
    Tardis.set_colorkey((255, 0, 0))

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
        screen.fill( (0,0,0) )
        rotatedTardis = rotate45(Tardis)
        screen.blit(rotatedTardis, (400,300))
        pygame.display.update()
        time.sleep(1)

main()

答案 1 :(得分:1)

问题是所有图像都是矩形。如果您开始使用75x134的图像并将其旋转45度,则新的矩形将更大(147x147),因为45度图像需要适合新的矩形。然后这个新的矩形将再次旋转45度并且将需要(207x 207)...等等。最终它将变得如此之大Tardis矩形主要是背景并且原始图像离开屏幕即使左上方是在同一地点。你应该做的就是保留原始图像,只需增加每次需要绘制图像时旋转图像的数量。

...
tardis_angle = 0
while True:
    # Events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    # update game state
    tardis_angle = (tardis_angle + 45) % 360

    # draw
    screen.fill( (0,0,0) )
    screen.blit(pygame.transform.rotate(Tardis, tardis_angle), (400,300))
    pygame.display.update()