如何相对于其中心缩放 PyGame 图像(表面)? [英] How do I scale a PyGame image (Surface) with respect to its center?

查看:81
本文介绍了如何相对于其中心缩放 PyGame 图像(表面)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对 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 循环,其中我增加了矩形的大小,但是它向右和向下移动.有没有办法增加大小并使矩形的中心保持在同一个地方?还有一种方法可以使大小的增加/减少更平滑吗?其余代码如下:

clicked = False增长 = 0模式 = '成长'未点击时:如果增长>40:模式 = '缩小'如果增长<1:模式 = '成长'self.pixeltitle = pg.transform.scale(self.pixeltitle,(400,400))如果模式 == '增长':增长+=1别的:增长-=1xsize=400+int(增长)ysize=400+int(增长)self.pixeltitle = pg.transform.scale(self.pixeltitle,(xsize,ysize))self.pixeltitlerect.center = (250,120)self.screen.blit(self.pixeltitle,self.pixeltitlerect)pg.display.flip()

解决方案

你错过了在 Surface 缩放后更新 self.pixeltitlerect 的大小:

self.pixeltitle = pg.transform.scale(self.pixeltitle,(xsize,ysize))# 表面的大小已经改变得到新的矩形self.pixeltitlerect = self.pixeltitle.get_rect()self.pixeltitlerect.center = (250,120)self.screen.blit(self.pixeltitle,self.pixeltitlerect)

甚至更短(参见

导入pygamepygame.init()窗口 = pygame.display.set_mode((500, 500))时钟 = pygame.time.Clock()类 ScalingSurface:def __init__(self):name = "pixeltitle.png";self.pixeltitleorig = pg.image.load(name)self.pixeltitle = self.pixeltitleorigself.pixeltitlesize = self.pixeltitle.get_size()self.pixeltitlerect = self.pixeltitle.get_rect()self.pixeltitlerect.center = (250,120)self.mode = '成长'自我成长 = 0定义更新(自我):如果自我成长>40:self.mode = '缩小'如果 self.grow<1:self.mode = '成长'self.grow += 1 if self.mode == 'grow' else -1xsize = 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))定义绘制(自我,冲浪):surf.blit(self.pixeltitle,self.pixeltitlerect)img = 缩放表面()运行 = 真运行时:时钟滴答(60)对于 pygame.event.get() 中的事件:如果 event.type == pygame.QUIT:运行 = 错误window.fill(0)img.update()img.draw(窗口)pygame.display.flip()

I am fairly new to pygame and am working on my first game. (So sorry if I'm asking a stupid question) I am trying to get the title of the game to slowly increase and decrease in size like a sort of breathing effect in order to make the home screen more visually appealing.

Here's what I've got to import the image:

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)

I've got a while loop in which I'm increasing the size of the rect, however it gets moved over to the right and downwards. Is there any way to increase the size and have the centre of the rect stay in the same place? Also is there a way of making the increase/decrease in size more smooth? Here's the rest of the code:

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()

解决方案

You missed to update the size of self.pixeltitlerect after the Surface has been scaled:

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)

Or even shorter (see pygame.Surface.get_rect()):

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)


Do not scale the original Surface. If the original Surface is scaled it will get distorted. Keep the original image self.pixeltitleorig and scale the original image:

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

See also Transform scale and zoom surface

See the example:

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()

这篇关于如何相对于其中心缩放 PyGame 图像(表面)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆