Pygame [duplicate] ile bir görüntünün boyutu nasıl büyütülür?

Jan 03 2021

Yaptığım bir oyunda, (old_width, old_height) ile (new_width, new_height) arasında ölçeklendirmem gereken bir görüntüm var, böylece büyüyor gibi görünüyor ve bunu oyun sırasında birçok kez yapmam gerekiyor .

Şimdiye kadar pygame.trasform.smoothscale ile denedim, ancak bazı nedenlerden dolayı tek yaptığı görüntüyü ekran boyunca sağ köşeye doğru hareket ettirmek.

Bana çok garip geliyor çünkü neler olduğunu anlamıyorum.

Görüntüyü işleyen sınıf şu şekildedir:

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

Ve bu, büyüme yönteminin adlandırıldığı yerdir. Bu soru için gereksiz olan her şeyi sildim, bu yüzden teorik olarak görüntü bu noktada sonsuz bir şekilde büyümeli:

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)

Öyle olmuyor ve bunun neden olduğu konusunda kesinlikle hiçbir fikrim yok. Burada neyi yanlış yaptığımı bilen var mı?

Yanıtlar

2 hippozhipos Jan 03 2021 at 07:49

Görüntü gerçekten hareket etmiyor. Sağ alt köşeye doğru hareket ediyormuş gibi görünebilir çünkü büyüyor, yani genişliği ve yüksekliği artıyor, hatırlayın ki resmin sol üst köşesinden başlıyor. O da çizildiği yer burasıdır. Yani büyüyor gibi görünmesini sağlamak için, benim yarım genişliğimi ve yüksekliğimi çizdiği yeri dengeleyebilirsiniz, bu temelde onu merkezde çizilecek şekilde dengelemek anlamına gelir. Değiştir

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

ile

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

Çalışma Örneği

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

2. argüman blitbir dikdörtgen olabilir. pygame.RectBir görüntüyü merkezine göre ölçeklemek için bir nesne kullanın :

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)

Ayrıca bkz. Ölçeği dönüştürme ve yüzeyi yakınlaştırma