So vergrößern Sie ein Bild mit Pygame [Duplikat]
In einem Spiel, das ich mache, habe ich ein Bild, das ich von (alte_Breite, alte_Höhe) auf (neue_Breite, neue_Höhe) skalieren muss, damit es größer zu werden scheint, und das muss ich während des Spiels mehrmals tun .
Bisher habe ich es mit pygame.trasform.smoothscale versucht, aber aus bestimmten Gründen wird das Bild nur entlang des Bildschirms in Richtung der rechten Ecke verschoben.
Es scheint mir sehr seltsam, weil ich nicht verstehe, was los ist.
Hier ist die Klasse, die das Bild verarbeitet:
class GrowingImage:
def __init__(self, image_path, x, y, width, height):
self.width = width
self.height = height
self.object_image = pygame.image.load(image_path)
self.image = pygame.transform.scale(self.object_image, (self.width, self.height))
self.x_pos = x
self.y_pos = y
def draw(self, background):
background.blit(self.image, (self.x_pos, self.y_pos))
def grow(self):
self.image = pygame.transform.smoothscale(self.object_image, (self.width, self.height))
self.width += 1
self.height += 1
Und hier heißt die Methode wachsen. Ich habe den Rest gelöscht, der für diese Frage überflüssig ist, daher sollte das Bild theoretisch an dieser Stelle endlos wachsen:
image = GrowingImage('image.png', 400, 100, 405, 640)
while not is_game_over:
for event in pygame.event.get():
# Bunch of stuffs
# Redraw the screen
self.game_screen.fill(WHITE_COLOR)
image.grow()
image.draw()
# Display the screen
pygame.display.update()
# Tick the clock to update everything within the game.
clock.tick(self.TICK_RATE)
Nun, das tut es nicht und ich habe absolut keine Ahnung, warum dies passiert. Weiß jemand was ich hier falsch mache?
Antworten
Das Bild bewegt sich nicht wirklich. Es könnte so aussehen, als würde es sich in Richtung der unteren rechten Ecke bewegen, weil es größer wird, dh seine Breite und Höhe nehmen zu, was daran erinnert, dass es in der oberen linken Ecke des Bildes beginnt. Dort wird es auch gezeichnet. Damit es so aussieht, als würde es wachsen, können Sie versetzen, wo es meine halbe Breite und Höhe gezeichnet hat, was im Grunde bedeutet, es so zu versetzen, dass es in der Mitte gezeichnet wird. Ersetzen
background.blit(self.image, (self.x_pos, self.y_pos))
mit
background.blit(self.image, (self.x_pos - (self.width/2), self.y_pos - (self.height/2)))
Arbeitsbeispiel
import pygame
class GrowingImage:
def __init__(self, image_path, x, y, width, height):
self.width = width
self.height = height
self.object_image = image_path
self.image = pygame.transform.scale(self.object_image, (self.width, self.height))
self.x_pos = x
self.y_pos = y
def draw(self, background):
background.blit(self.image, (self.x_pos - (self.width/2), self.y_pos - (self.height/2)))
def grow(self):
self.image = pygame.transform.smoothscale(self.object_image, (self.width, self.height))
self.width += 1
self.height += 1
pygame.init()
d = pygame.display.set_mode((600, 600))
image = pygame.Surface((1, 1))
growingImage = GrowingImage(image, 300, 300, 20, 20)
while True:
d.fill((255, 255, 255))
pygame.event.get()
growingImage.draw(d)
growingImage.grow()
pygame.display.update()
Das 2. Argument von blitkann ein Rechteck sein. Verwenden Sie ein pygame.RectObjekt, um ein Bild in Bezug auf seine Mitte zu skalieren:
class GrowingImage:
def __init__(self, image_path, x, y, width, height):
self.object_image = pygame.image.load(image_path)
self.image = pygame.transform.scale(self.object_image, (self.width, self.height))
self.rect = self.image.get_rect(topleft = (x, y))
def draw(self, background):
background.blit(self.image, self.rect)
def grow(self):
w = self.rect.width + 1
h = self.rect.height + 1
self.image = pygame.transform.smoothscale(self.object_image, (w, h))
self.rect = self.image.get_rect(center = self.rect.center)
Siehe auch Skalierungs- und Zoomfläche transformieren