Pygame [duplicate] ile bir görüntünün boyutu nasıl büyütülür?
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
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()
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