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)

ट्रांसफ़ॉर्म स्केल और ज़ूम सतह भी देखें