Cara membuat gambar bertambah besar dengan pygame [duplikat]
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
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()
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