วิธีทำให้ภาพขยายขนาดด้วย pygame [ซ้ำ]
ในเกมที่ฉันกำลังสร้างฉันมีรูปภาพที่ฉันต้องปรับขนาดจาก (old_width, old_height) เป็น (new_width, new_height) เพื่อให้ดูเหมือนว่ามันจะใหญ่ขึ้นเรื่อย ๆ และฉันต้องทำหลาย ๆ ครั้งในระหว่างเกม .
จนถึงตอนนี้ฉันได้ลองใช้ pygame.trasform.smoothscale แล้ว แต่ด้วยเหตุผลบางประการมันก็คือการย้ายภาพไปตามหน้าจอไปทางมุมขวา
มันดูแปลกมากสำหรับฉันเพราะฉันไม่เข้าใจว่าเกิดอะไรขึ้น
นี่คือคลาสที่จัดการกับรูปภาพ:
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
และนี่คือที่ที่เรียกวิธีการเติบโต ฉันลบส่วนที่เหลือทั้งหมดที่ไม่จำเป็นสำหรับคำถามนี้ดังนั้นในทางทฤษฎีภาพควรเติบโตอย่างไม่มีที่สิ้นสุด ณ จุดนี้:
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)
มันไม่เป็นเช่นนั้นและฉันไม่รู้เลยว่าทำไมสิ่งนี้ถึงเกิดขึ้น มีใครรู้บ้างว่าฉันทำอะไรผิดที่นี่?
คำตอบ
ภาพไม่เคลื่อนไหวจริงๆ อาจดูเหมือนว่ามันเคลื่อนไปทางมุมขวาล่างเพราะมันใหญ่ขึ้นเรื่อย ๆ นั่นคือความกว้างและความสูงจะเพิ่มขึ้นซึ่งจำไว้ว่าเริ่มต้นที่มุมซ้ายบนของภาพ นั่นคือจุดที่วาดเช่นกัน ดังนั้นเพื่อให้ดูเหมือนว่ามันโตขึ้นคุณสามารถหักล้างจุดที่มันดึงความกว้างครึ่งหนึ่งของฉันกับความสูงซึ่งโดยพื้นฐานแล้วหมายถึงการหักล้างเพื่อให้มันถูกดึงมาที่จุดศูนย์กลาง แทนที่
background.blit(self.image, (self.x_pos, self.y_pos))
ด้วย
background.blit(self.image, (self.x_pos - (self.width/2), self.y_pos - (self.height/2)))
ตัวอย่างการทำงาน
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 ของblitสามารถเป็นสี่เหลี่ยมผืนผ้า ใช้pygame.Rectวัตถุเพื่อปรับขนาดภาพโดยเทียบกับจุดศูนย์กลาง:
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)
ดูการแปลงขนาดและพื้นผิวการซูม