Cara membuat gambar bertambah besar dengan pygame [duplikat]

Jan 03 2021

Dalam game yang saya buat, saya memiliki gambar yang perlu saya skalakan dari (old_width, old_height) ke (new_width, new_height), sehingga terlihat semakin besar, dan saya perlu melakukannya beberapa kali selama game .

Sejauh ini, saya sudah mencoba pygame.trasform.smoothscale, tetapi untuk beberapa alasan yang dilakukannya hanyalah memindahkan gambar di sepanjang layar ke arah sudut kanan.

Sepertinya sangat aneh bagi saya, karena saya tidak mengerti apa yang sedang terjadi.

Berikut kelas yang menangani gambar:

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

Dan di sinilah metode tumbuh disebut. Saya menghapus semua sisa yang tidak berguna untuk pertanyaan ini, jadi secara teoritis gambar akan tumbuh tanpa henti pada titik ini:

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)

Ya, tidak dan saya sama sekali tidak tahu mengapa ini terjadi. Ada yang tahu apa yang saya lakukan salah di sini?

Jawaban

2 hippozhipos Jan 03 2021 at 07:49

Gambarnya tidak benar-benar bergerak. Mungkin terlihat seperti bergerak ke arah pojok kanan bawah karena semakin membesar yaitu lebar dan tingginya bertambah, yang ingat, dimulai dari pojok kiri atas gambar. Di situlah ia digambar juga. Jadi untuk membuatnya terlihat seperti tumbuh, Anda dapat mengimbangi di mana gambar saya setengah lebar dan tinggi, yang pada dasarnya berarti mengimbangi sehingga digambar di tengah. Menggantikan

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

dengan

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

Contoh Kerja

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

Argumen ke-2 blitbisa berupa persegi panjang. Gunakan pygame.Rectobjek, untuk menskalakan gambar sehubungan dengan pusatnya:

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)

Lihat juga Mengubah skala dan permukaan zoom