2017-04-26 7 views
0

Ich habe versucht, ein Bild in Pygame zu drehen, mit Python 3.6, aber wenn ich es mache, verzerrt entweder das Bild in ein nicht erkennbares Bild, oder wenn es rotiert es Beulen überallEin Bild in Pygame ohne Verzerrung drehen

Nur die Verwendung pygame.transform.rotate(image, angle) macht das verzerrte Chaos. Und mit etwas wie: pygame.draw.rect(gameDisplay, self.color, [self.x, self.y, self.width, self.height]) macht das Bild überall stoßen.

Ich habe viele Fragen auf dieser Seite und andere angeschaut und bis jetzt hat keiner von ihnen perfekt funktioniert. Für alle, die hier interessiert sind, ist der Link zu meinem Code soweit. https://pastebin.com/UQJJFNTy Mein Bild ist 64x64. Vielen Dank im Voraus!

+3

Erstellen Sie ein [mcve]. Ich denke, es wären höchstens 10 Zeilen Code. –

Antwort

2

Per Docs (http://www.pygame.org/docs/ref/transform.html):

Einige der Transformationen destruktiv angesehen werden. Dies bedeutet, dass sie jedes Mal, wenn sie ausgeführt werden, Pixeldaten verlieren. Gängige Beispiele dafür sind Größenänderung und Rotation. Aus diesem Grund ist es besser, die ursprüngliche Oberfläche neu zu transformieren, als ein Bild mehrfach zu transformieren.

Jedes Mal, wenn Sie anrufen transform.rotate Sie es auf dem Originalbild tun müssen, nicht auf dem zuvor gedreht. Zum Beispiel gedreht, wenn ich das Bild will 10 Grad jeden Rahmen:

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

Dann in Ihrer Spiel-Schleife (oder Objekt update):

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

Hier ist ein vollständiges Beispiel. Ändern Sie das Originalbild nicht und verwenden Sie in der while-Schleife pygame.transform.rotate oder rotozoom, um eine neue gedrehte Oberfläche zu erhalten und einem anderen Namen zuzuweisen. Verwenden Sie eine Rect, um die Mitte zu behalten.

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()