So vergrößern Sie ein Bild mit Pygame [Duplikat]

Jan 03 2021

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

2 hippozhipos Jan 03 2021 at 07:49

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()
    
1 Rabbid76 Jan 03 2021 at 15:34

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