You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 13:48:19