Jak sprawić, by obraz powiększył się za pomocą pygame [duplikat]

Jan 03 2021

W grze, którą tworzę, mam obraz, który muszę przeskalować z (stara_szerokość, stara_wysokość) do (nowa_szerokość, nowa_wysokość), aby wydawał się większy i muszę to robić wiele razy w trakcie gry .

Do tej pory próbowałem z pygame.trasform.smoothscale, ale z pewnych powodów wszystko, co robi, to przesuwanie obrazu wzdłuż ekranu w prawy róg.

Wydaje mi się to bardzo dziwne, ponieważ nie rozumiem, co się dzieje.

Oto klasa obsługująca obraz:

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

I tak nazywa się metoda grow. Usunąłem całą resztę, która jest zbędna dla tego pytania, więc teoretycznie obraz powinien rosnąć w tym miejscu w nieskończoność:

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)

Cóż, tak nie jest i nie mam pojęcia, dlaczego tak się dzieje. Czy ktoś wie, co tu robię źle?

Odpowiedzi

2 hippozhipos Jan 03 2021 at 07:49

Obraz tak naprawdę się nie porusza. Może wyglądać na to, że przesuwa się w prawy dolny róg, ponieważ staje się coraz większy, tj. Zwiększa się jego szerokość i wysokość, co pamiętam, zaczyna się w lewym górnym rogu obrazu. Tam też jest rysowany. Aby wyglądało na to, że rośnie, możesz przesunąć miejsce, w którym został narysowany, o połowę szerokości i wysokości, co zasadniczo oznacza przesunięcie go tak, aby był narysowany w środku. Zastąpić

background.blit(self.image, (self.x_pos, self.y_pos))

z

background.blit(self.image, (self.x_pos - (self.width/2), self.y_pos - (self.height/2)))

Przykład roboczy

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

Drugim argumentem blitmoże być prostokąt. Użyj pygame.Rectobiektu, aby przeskalować obraz względem jego środka:

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)

Zobacz także Przekształcanie skali i powiększania powierzchni