[英]How do I scale a PyGame image (Surface) with respect to its center?
我对 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
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()
在 Surface 缩放后,您错过了更新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)
或者更短(参见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)
不要缩放原始 Surface。 如果原始 Surface 被缩放,它将被扭曲。 保留原始图像self.pixeltitleorig
并缩放原始图像:
self.pixeltitle = pygame.transform.scale(self.pixeltitleorig,(xsize,ysize))
另请参见变换比例和缩放表面
看例子:
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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.