【问题标题】:Rotation in pygamepygame中的旋转
【发布时间】:2015-04-13 22:18:55
【问题描述】:

我一直在寻找关于如何让我的图像围绕一个点旋转的解决方案,但我发现没有任何效果。

我知道的

  • 我可以使用pygame.transform.rotate(surface, angle)旋转

  • 我需要不断地重置中心,这样图像就不会在其旋转的自身上旋转。

  • 需要更新图像以消除失真

最初的图像是这样的

然后当我旋转它几次时,它看起来像这样

这是我的代码

import pygame


class pyGameSetup:

def __init__(self, title, width, height):

    # initialize pygame library
    pygame.init()

    # set up specific display properties
    self.game_display = pygame.display.set_mode((width, height))
    pygame.display.set_caption(title)

    # update display
    pygame.display.update()

    # create new global variables for the class
    # game state
    self.running = True

    # colors, only main
    # TODO: implement more color RGB values, if updated, update corresponding method
    self.white = (255, 255, 255)
    self.black = (0, 0, 0)
    self.grey = (128, 128, 128)
    self.pink = (255, 102, 178)
    self.blue = (0, 0, 255)
    self.red = (255, 0, 0)
    self.green = (0, 255, 0)
    self.purple = (127, 0, 255)
    self.yellow = (255, 255, 0)
    self.teal = (0, 204, 204)
    self.orange = (255, 128, 0)

    # player coordinates and properties
    self.player_x = int(width / 2)
    self.player_y = int(height / 2)
    self.player_width = 100
    self.player_height = 50
    self.player_speed_x = 0
    self.player_speed_y = 0
    self.move_speed = 5

    # FPS controllers (note start speed should always be 60 / 5 so, 1 / 300
    self.clock = pygame.time.Clock()
    self.fps = 60

    # screen values
    self.width = width
    self.height = height

    # rotation for car
    self.angle = 200

    # car image
    self.car1 = pygame.image.load("Images\\Car1.png")
    self.update_size()
    self.car_rect = self.car1.get_rect()
    self.car_rect.center = (self.player_x, self.player_y)


def exit(self):
    pygame.quit()
    self.running = False
    quit()

def game_loop(self):
    while self.running:
        for event in pygame.event.get():
            self.event_handler(event)

        # update player position
        # self.player_x += self.player_speed_x
        self.angle = self.player_speed_x
        self.player_y += self.player_speed_y

        # check to make sure it's in bounds
        self.check_valid_move()

        # reprint canvas
        self.game_display.fill(self.white)

        # update angle
        self.update_angle()

        # print player
        self.game_display.blit(self.car1, (self.player_x, self.player_y, self.player_width,
                                           self.player_height))

        # update display
        pygame.display.update()

        # FPS
        self.clock.tick(self.fps)

def event_handler(self, e):
    if e.type == pygame.QUIT:
        self.exit()
    if e.type == pygame.KEYDOWN:
            if e.key == pygame.K_LEFT:
                self.player_speed_x = -self.move_speed
            if e.key == pygame.K_RIGHT:
                self.player_speed_x = self.move_speed
            if e.key == pygame.K_UP:
                self.player_speed_y = -self.move_speed
            if e.key == pygame.K_DOWN:
                self.player_speed_y = self.move_speed
    if e.type == pygame.KEYUP:
            if e.key == pygame.K_LEFT:
                self.player_speed_x = 0
            if e.key == pygame.K_RIGHT:
                self.player_speed_x = 0
            if e.key == pygame.K_UP:
                self.player_speed_y = 0
            if e.key == pygame.K_DOWN:
                self.player_speed_y = 0

def check_valid_move(self):
    if self.player_x <= 0:
        self.player_x = 0
    if self.player_x >= self.width - self.player_width:
        self.player_x = self.width - self.player_width
    if self.player_y <= 0:
        self.player_y = 0
    if self.player_y >= self.height - self.player_height:
        self.player_y = self.height - self.player_height

def update_size(self):
    self.car1 = pygame.transform.scale(self.car1, (self.player_width, self.player_height))
    self.car1 = pygame.transform.rotate(self.car1, -90)

def update_angle(self):
    old_center = self.car_rect.center
    self.car1 = pygame.transform.rotate(self.car1, self.angle)
    self.car_rect.center = old_center

x = pyGameSetup('Game', 800, 600)
x.game_loop()

错误出现在 update_angle 中,老实说,我完全迷失了方向,甚至不知道它在做什么。提前致谢。

【问题讨论】:

  • 我一直遇到这个问题,但我不知道问题所在。也许它只与具有透明度的图像有关。

标签: python rotation pygame


【解决方案1】:

您的问题是您正在旋转旋转的图像。因此,图像看起来偏斜,这是意料之中的。相反,有两个变量,一个用于原始变量,一个用于最近的轮换。

所以而不是:

car1 = original_image_rect
car1 = pygame.transform.rotate(car1, 10)
car1 = pygame.transform.rotate(car1, 10)
...

你会这样做:

car1 = original_image_rect
car2 = pygame.transform.rotate(car1, 10)
car2 = pygame.transform.rotate(car1, 20)
...

【讨论】:

  • 成功了!唯一的问题是图像没有围绕中心旋转
【解决方案2】:

对于在没有抗锯齿的情况下旋转多次的低分辨率图像,这个结果似乎很正常。 你应该做的是:

  • 如果可能,请使用 2 倍大的源图像。首先旋转它 然后精确地缩小 2 倍 - 如果可能的话,在 blit 期间,所以你 不需要将其作为单独的步骤进行扩展。
  • 不要旋转旋转的图像。 IE。不要将它旋转3次5度,而是每次复制原始图像并将其旋转5度, 10、15度。这样,您将失真降至最低,并且 也不必重新分配中心。

【讨论】:

  • 成功了!唯一的问题是图像没有围绕中心旋转
  • 你的意思是还有问题?你能打印出self.car_rectself.car_rect.center的实际值吗?
  • 嗯,是的,有一个问题,但它与我的问题没有直接关系。这只是一个附带问题。而且我实际上已经消除了self.car_rect.center 我所拥有的只是car_rect = self.car1, car2 = pygame.transform.rotate(self.car1, self.angle), self.car1 = car_rect, return car2 对不起格式。我在哪里添加整个中心逻辑
  • 我对这些 Python 对象和规则不太熟悉,但您的 self.car1 似乎有一个固有的 rect 对象,该对象又具有 center 属性。因为你不改变 self.car1 你只需要在旋转之前设置它的中心car_rect = self.car1.get_rect() self.car_rect.center = (self.player_x, self.player_y) car2 = pygame.transform.rotate(self.car1, self.angle) 另外我不太确定中心是否应该在(player_x,player_y),也许这更合适:car_rect = self.car1.get_rect() car_rect.center = (car_rect.left + car_rect.w/2, car_rect.top + car_rect.h/2)跨度>
猜你喜欢
  • 2015-04-14
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 2023-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
相关资源
最近更新 更多