วิธีทำให้ภาพขยายขนาดด้วย pygame [ซ้ำ]

Jan 03 2021

ในเกมที่ฉันกำลังสร้างฉันมีรูปภาพที่ฉันต้องปรับขนาดจาก (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)

มันไม่เป็นเช่นนั้นและฉันไม่รู้เลยว่าทำไมสิ่งนี้ถึงเกิดขึ้น มีใครรู้บ้างว่าฉันทำอะไรผิดที่นี่?

คำตอบ

2 hippozhipos Jan 03 2021 at 07:49

ภาพไม่เคลื่อนไหวจริงๆ อาจดูเหมือนว่ามันเคลื่อนไปทางมุมขวาล่างเพราะมันใหญ่ขึ้นเรื่อย ๆ นั่นคือความกว้างและความสูงจะเพิ่มขึ้นซึ่งจำไว้ว่าเริ่มต้นที่มุมซ้ายบนของภาพ นั่นคือจุดที่วาดเช่นกัน ดังนั้นเพื่อให้ดูเหมือนว่ามันโตขึ้นคุณสามารถหักล้างจุดที่มันดึงความกว้างครึ่งหนึ่งของฉันกับความสูงซึ่งโดยพื้นฐานแล้วหมายถึงการหักล้างเพื่อให้มันถูกดึงมาที่จุดศูนย์กลาง แทนที่

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()
    
1 Rabbid76 Jan 03 2021 at 15:34

อาร์กิวเมนต์ที่ 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)

ดูการแปลงขนาดและพื้นผิวการซูม