这是我的代码(Python 3.5):
import sys
import pygame
pygame.init()
screen_width = 640
screen_height = 480
screen = pygame.display.set_mode((screen_width, screen_height))
running = True
class Actor:
def __init__(self, x, y, w, h):
self.x = x
self.y = y
self.w = w
self.h = h
self.surface = pygame.image.load("GFX/player.bmp")
def draw(self):
screen.blit(self.surface, (self.x, self.y))
class Player(Actor):
def __init__(self):
Actor.__init__(self, 0, 0, 32, 32)
self.directions = [False, False, False, False]
self.speed = 0.1
def update(self):
if self.directions[0]:
self.y -= self.speed
if self.directions[1]:
self.y += self.speed
if self.directions[2]:
self.x -= self.speed
if self.directions[3]:
self.x += self.speed
player = Player()
def rot_center(image, angle):
orig_rect = image.get_rect()
rot_image = pygame.transform.rotate(image, angle)
rot_rect = orig_rect.copy()
rot_rect.center = rot_image.get_rect().center
rot_image = rot_image.subsurface(rot_rect).copy()
return rot_image
def redraw():
screen.fill((75, 0, 0))
player.draw()
player.update()
pygame.display.flip()
while (running):
for e in pygame.event.get():
if e.type == pygame.QUIT:
sys.exit()
elif e.type == pygame.KEYDOWN:
if e.key == pygame.K_ESCAPE:
sys.exit()
if e.key == pygame.K_w:
player.directions[0] = True
if e.key == pygame.K_s:
player.directions[1] = True
if e.key == pygame.K_a:
player.directions[2] = True
if e.key == pygame.K_d:
player.directions[3] = True
elif e.type == pygame.KEYUP:
if e.key == pygame.K_w:
player.directions[0] = False
if e.key == pygame.K_s:
player.directions[1] = False
if e.key == pygame.K_a:
player.directions[2] = False
if e.key == pygame.K_d:
player.directions[3] = False
elif e.type == pygame.MOUSEMOTION:
player.surface = rot_center(player.surface, pygame.mouse.get_pos()[0] / 64)
redraw()
相当简单的pygame代码。我有一个我在mspaint上创建的简单图像的播放器,我使用this function来旋转图像而不会导致内存不足。我正在用鼠标旋转图像(考虑一个“瞄准”某个地方的玩家)。这是原始图片:
在移动鼠标后,这是非常难看的结果:
我知道使用OpenGL(例如Pyglet)会有更好的精度,但在这种情况下,pygame的旋转功能将完全无用。我错过了什么?我究竟做错了什么?
答案 0 :(得分:1)
请记住,Python中的Surfaces只是像素网格,而不是数学上完美的矢量图形。旋转图像会导致质量轻微下降。如图所示,持续这样做最终会使图像无法识别。保持对原始图像的引用,永远不会覆盖它。调用旋转时,请确保使用相对于原始图像的累积角度旋转原始图片,而不是先前和逐渐旋转的版本。