Außerhalb des Gedächtnisses bei der Verwendung von pygame.transform.rotate

Ich schrieb ein Skript, das es einem Benutzer erlaubt, den Sprite eines Adlers zu kontrollieren, um herumzulaufen, um Pygame zu lernen. Es schien gut, bis ich eine Rotationsfunktion implementierte, die das Sprite dreht, entsprechend der Richtung, die es fliegt. Der Sprite wird nach dem Bewegen einer kurzen Weile wirklich unscharf, und ein Fehler springt bald aus dem Gedächtnis aus (in dieser Zeile: eagle_img = pygame.transform.rotate (eagle_img, new_angle-angle) )

Mein Code:

# eagle movement script import pygame, math, sys from pygame.locals import * pygame.init() clock = pygame.time.Clock() # terminate function def terminate(): pygame.quit() sys.exit() # incircle function, check if mouse click is inside controller def incircle(coordinates,cir_center,cir_out_rad): if math.sqrt((coordinates[0]-cir_center[0])**2+\ (coordinates[1]-cir_center[1])**2) <= cir_out_rad: return True return False # speed function, translates the controller movement into eagle movement def speed(position,cir_center,eagle_speed): x_dist = position[0] - cir_center[0] y_dist = position[1] - cir_center[1] dist = math.sqrt(x_dist**2+y_dist**2) # distance from controller knob to center if dist != 0: return [(x_dist/dist)*eagle_speed,(y_dist/dist)*eagle_speed] else: return [0,0] # rotation function, rotates the eagle image def rotation(position,cir_center): x_dist = position[0] - cir_center[0] y_dist = position[1] - cir_center[1] new_radian = math.atan2(-y_dist,x_dist) new_radian %= 2*math.pi new_angle = math.degrees(new_radian) return new_angle # screen screenw = 1000 screenh = 700 screen = pygame.display.set_mode((screenw,screenh),0,32) pygame.display.set_caption('eagle movement') # variables green = (0,200,0) grey = (100,100,100) red = (255,0,0) fps = 60 # controller cir_out_rad = 150 # circle controller outer radius cir_in_rad = 30 # circle controller inner radius cir_center = [screenw-cir_out_rad,int(screenh/2)] position = cir_center # mouse position # eagle eaglew = 100 eagleh = 60 eagle_speed = 3 eagle_pos = [screenw/2-eaglew/2,screenh/2-eagleh/2] eagle = pygame.Rect(eagle_pos[0],eagle_pos[1],eaglew,eagleh) eagle_img = pygame.image.load('eagle1.png').convert() eagle_bg_colour = eagle_img.get_at((0,0)) eagle_img.set_colorkey(eagle_bg_colour) eagle_img = pygame.transform.scale(eagle_img,(eaglew,eagleh)) # eagle controls stop_moving = False # becomes True when player stops clicking rotate = False # becomes True when there is input angle = 90 # eagle is 90 degrees in the beginning # game loop while True: # controls for event in pygame.event.get(): if event.type == QUIT: terminate() if event.type == MOUSEBUTTONUP: stop_moving = True rotate = False mouse_input = pygame.mouse.get_pressed() if mouse_input[0]: coordinates = pygame.mouse.get_pos() # check if coordinates is inside controller if incircle(coordinates,cir_center,cir_out_rad): position = pygame.mouse.get_pos() stop_moving = False rotate = True else: cir_center = pygame.mouse.get_pos() stop_moving = False rotate = True key_input = pygame.key.get_pressed() if key_input[K_ESCAPE] or key_input[ord('q')]: terminate() screen.fill(green) [dx,dy] = speed(position,cir_center,eagle_speed) if stop_moving: [dx,dy] = [0,0] if eagle.left > 0: eagle.left += dx if eagle.right < screenw: eagle.right += dx if eagle.top > 0: eagle.top += dy if eagle.bottom < screenh: eagle.bottom += dy if rotate: new_angle = rotation(position,cir_center) if new_angle != angle: eagle_img = pygame.transform.rotate(eagle_img,new_angle-angle) eagle = eagle_img.get_rect(center=eagle.center) rotate = False angle = new_angle outer_circle = pygame.draw.circle(screen,grey,(cir_center[0],cir_center[1]),\ cir_out_rad,3) inner_circle = pygame.draw.circle(screen,grey,(position[0],position[1]),\ cir_in_rad,1) screen.blit(eagle_img,eagle) pygame.display.update() clock.tick(fps) 

Bitte sag mir, was hier los ist und wie ich es verbessern kann Fühlen Sie sich frei, den Code aus mit einem Sprite namens "eagle1.png" auszuprobieren. Vielen Dank!

  • Versuchen, über Sprite zu ziehen oder Bildpyglet zu wechseln
  • Wie man Funktionen von Sprites in Gruppen anruft?
  • Pygame: Kollision von Seiten von Sprite
  • PYGAME macht einen Sprite in die Richtung, in die er steht
  • Pygame sprite nicht bewegend
  • Wie benutzt man Sprite Collide in Pygame
  • Wie kann man einen Feind dem Spieler in pygame folgen?
  • Pygame macht ein Sprite Gesicht die Maus
  • One Solution collect form web for “Außerhalb des Gedächtnisses bei der Verwendung von pygame.transform.rotate”

    Der Grund, warum dein Adler-Bild verschwommen ist, ist, weil du dich ständig um das gleiche png drehst und keine Kopie machst und diese Kopie drehst, während du immer ein nicht bearbeitetes Bild beibehältest. Hier ist eine Funktion, die ich immer beim Drehen von quadratischen Bildern verwendet habe

     def rot_center(image, angle): """rotate an image while keeping its center and size""" 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 

    Hier ist eine für jede Form des Bildes

     def rot_center(image, rect, angle): """rotate an image while keeping its center""" rot_image = pygame.transform.rotate(image, angle) rot_rect = rot_image.get_rect(center=rect.center) return rot_image,rot_rect 

    Quelle von hier

    Wie für den "out of memory" -Fehler weiß ich nicht sicher, aber ich nehme an, dass das Leck durch die Rotation der gleichen png-Datei immer und immer wieder verursacht wird. Aus irgendeiner Forschung, die oft mit anderen Menschen auftritt.

    Hoffe das hilft ein paar Dinge klar 🙂

    Python ist die beste Programmiersprache der Welt.