2016-10-27 159 views
0

這裏是我的代碼(Python的3.5):如何旋轉圖像而不丟失像素數據? (pygame的)

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來旋轉圖像而不會導致內存不足的問題。我用鼠標旋轉圖像(考慮到某個玩家「瞄準」某個地方)。這裏的原始圖像:

enter image description here

在這裏,移動鼠標一點後是極其醜陋的結果:

enter image description here

我知道我會使用OpenGL(Pyglet,對於具有更高的精度例子),但在這種情況下pygame的旋轉函數將完全無用。我錯過了什麼?我究竟做錯了什麼?

+0

始終使用oryginal圖像來生成旋轉的版本。或者在圖形編輯器中創建旋轉圖像,並使用它們而不是'pygame.transform.rotate' – furas

回答

1

請記住,Python中的曲面只是像素的網格,而不是數學上完美的矢量圖形。旋轉圖像會導致質量輕微損壞。如果你繼續這樣做,最終會讓你的照片中看到的圖像變得無法識別。保持對原始圖像的引用並永不覆蓋它。當您調用旋轉時,請確保您正在旋轉原始照片,並且相對於原始照片具有累積角度,而不是先前和遞增旋轉的版本。