如何缩放PyGame图像(曲面)相对于其中心的比例?

2024-04-23 10:05:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我是pygame的新手,正在开发我的第一个游戏。(如果我问了一个愚蠢的问题,我很抱歉) 我试图让游戏的标题慢慢地增加和减少大小,就像一种呼吸效果,以便使主屏幕在视觉上更具吸引力

以下是我要导入图像的内容:

name = self.dir_path + "pixeltitle.png"
self.pixeltitle = pg.image.load(name)
self.pixeltitlerect = self.pixeltitle.get_rect()
self.pixeltitlerect.center = (250,120)
self.screen.blit(self.pixeltitle,self.pixeltitlerect)

我有一个while循环,在这个循环中我增加了rect的大小,但是它会向右和向下移动。有没有办法增加尺寸并使矩形的中心保持在同一位置?还有没有办法使尺寸的增减更加平滑?下面是代码的其余部分:

clicked = False
        grow = 0
        mode = 'grow'
        while not clicked:
            if grow>40:
                mode = 'shrink'
            if grow<1:
                mode = 'grow'
                self.pixeltitle = pg.transform.scale(self.pixeltitle,(400,400))


            if mode == 'grow':
                grow+=1
            else:
                grow-=1

            xsize=400+int(grow)
            ysize=400+int(grow)

            self.pixeltitle = pg.transform.scale(self.pixeltitle,(xsize,ysize))
            self.pixeltitlerect.center = (250,120)
            self.screen.blit(self.pixeltitle,self.pixeltitlerect)
            pg.display.flip()

Tags: namerectself游戏ifmodescreenpg
1条回答
网友
1楼 · 发布于 2024-04-23 10:05:56

缩放曲面后,您没有更新self.pixeltitlerect的大小:

self.pixeltitle = pg.transform.scale(self.pixeltitle,(xsize,ysize))

# size of surface has been changed get the new rectangle
self.pixeltitlerect = self.pixeltitle.get_rect()

self.pixeltitlerect.center = (250,120)
self.screen.blit(self.pixeltitle,self.pixeltitlerect)

甚至更短(见^{}):

self.pixeltitle = pg.transform.scale(self.pixeltitle,(xsize,ysize))
self.pixeltitlerect = self.pixeltitle.get_rect(center = (250,120))
self.screen.blit(self.pixeltitle,self.pixeltitlerect)

不要缩放原始曲面。如果缩放原始曲面,它将变形。保留原始图像self.pixeltitleorig并缩放原始图像:

self.pixeltitle = pygame.transform.scale(self.pixeltitleorig,(xsize,ysize))

另见Transform scale and zoom surface

请参见示例:

import pygame
pygame.init()
window = pygame.display.set_mode((500, 500))
clock = pygame.time.Clock()

class ScalingSurface:
    def __init__(self):
        name = "pixeltitle.png"
        self.pixeltitleorig = pg.image.load(name)
        self.pixeltitle     = self.pixeltitleorig
        self.pixeltitlesize = self.pixeltitle.get_size()
        self.pixeltitlerect = self.pixeltitle.get_rect()
        self.pixeltitlerect.center = (250,120)
        self.mode = 'grow'
        self.grow = 0

    def update(self):
        if self.grow > 40:
            self.mode = 'shrink'
        if self.grow<1:
            self.mode = 'grow'
        self.grow += 1 if self.mode == 'grow' else -1

        xsize = self.pixeltitlesize[0] + round(self.grow)
        ysize = self.pixeltitlesize[1] + round(self.grow)
        self.pixeltitle = pygame.transform.scale(self.pixeltitleorig,(xsize,ysize))
        self.pixeltitlerect = self.pixeltitle.get_rect(center = (250,120))

    def draw(self, surf):
        surf.blit(self.pixeltitle,self.pixeltitlerect)

img = ScalingSurface()
run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.fill(0)
    img.update()
    img.draw(window)
    pygame.display.flip()

相关问题 更多 >