Pygame开发点击游戏设置center坐标后图片仍无法居中
问题根因
你的居中逻辑没生效,核心是搞错了blit绘制的锚点规则:
- Pygame里
screen.blit(图片, 坐标)这个方法,传入的坐标是图片左上角的落点位置,不是图片中心点的位置。 - 你现在直接把屏幕中心点传给emoji作为绘制坐标,等于把图片的左上角钉在屏幕正中间,整张图会往右下偏半个图的大小,当然不可能居中。
另外你代码里还有两个会出问题的隐藏坑:
- 你把
obj = emoji(...)写在了while主循环里面,每帧都会重新加载一次emoji.jpeg、重新做缩放,跑起来内存会涨得很快,还会卡顿 - 类里面的
rect()方法用了从来没定义过的self.rect_属性,后面要做点击碰撞检测的时候会直接报属性错误
修正方法
不用自己手动算坐标偏移,Pygame的Surface自带的get_rect()方法原生支持直接指定中心点位置,这才是官方推荐的居中写法,不会算错。
修正后可直接运行的代码:
import pygame import sys pygame.init() screen = pygame.display.set_mode((2560, 1760)) class Emoji: def __init__(self, center_pos): self.length = 500 self.emoji_img = pygame.transform.scale( pygame.image.load("emoji.jpeg").convert_alpha(), (self.length, self.length) ) # 直接给图片绑定rect,设置中心点为传入的目标位置,自动计算左上角坐标 self.rect = self.emoji_img.get_rect(center=center_pos) def draw(self): screen.blit(self.emoji_img, self.rect) # 实例化只需要做一次,放在循环外面 obj = Emoji(screen.get_rect().center) while True: screen.fill((255, 255, 255)) obj.draw() pygame.display.flip() for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit()
关键改动说明
- 去掉了手动维护的x、y坐标,直接用图片绑定的Rect对象管理位置,不需要自己写“中心点减半个宽高算左上角”的逻辑,不容易出错
- 加载图片后加了
convert_alpha()调用,能大幅提升图片绘制的帧率 - 把对象初始化移到了主循环外,避免每帧重复加载资源
- 补上了退出前的
pygame.quit(),避免部分系统下退出程序时抛出异常 - 删掉了原来没写完整的rect方法,直接用实例的rect属性即可做碰撞检测,比如后续要判断点击是否点到表情,直接写
obj.rect.collidepoint(pygame.mouse.get_pos())就行
内容的提问来源于stack exchange,提问作者Jhpark0303
相关产品推荐
相关产品推荐

