pygame.mouse.get_pos()坐标可打印但游戏物体不随鼠标移动
问题根因
飞船无法跟随鼠标移动是两个逻辑错误导致的,鼠标坐标获取本身没有问题(终端能正常打印坐标已经验证了这部分功能正常):
- 主循环调用
draw_spaceship时硬编码传入了参数(0, 0),没有把实时拿到的鼠标x、y坐标传给绘图函数 draw_spaceship函数内部所有图形的绘制坐标全是写死的固定值,完全没有使用传入的x、y形参,不管传什么参数,飞船都会被画在同一个固定位置- 额外隐患:星星移动逻辑的分支里重复给全局变量x、y赋值,容易造成变量污染,虽然当前代码里因为坐标获取在星星逻辑之前没触发bug,但长期运行可能出异常
修复方法
- 重写
draw_spaceship的坐标逻辑,所有图形的绘制位置都基于传入的x、y参数做相对偏移,不要写死固定数值:
def draw_spaceship(screen, x ,y): # 飞船主体,以传入坐标为基准点绘制 pygame.draw.rect(screen, GRAY, [x, y, 20, 40], 0) # 右侧机翼 pygame.draw.polygon(screen, GRAY, [[x+40, y], [x+15, y], [x+15, y+25]], 0) # 左侧机翼 pygame.draw.polygon(screen, GRAY, [[x, y], [x-20, y], [x, y+25]], 0)
- 修改主循环里的飞船调用代码,把实时获取的鼠标坐标传入函数,可适当加偏移量让鼠标指针对准飞船顶部,操作体验更好:
# 传入偏移后的鼠标坐标绘制飞船 draw_spaceship(screen, x-10, y-40)
- 修改星星逻辑里的变量名,不要和鼠标坐标的x、y变量重名,避免全局变量污染:
if star_list[i][1] > 700: star_y = random.randrange(-50, -10) star_list[i][1] = star_y star_x = random.randrange(0, 700) star_list[i][0] = star_x
修复后完整代码
直接替换原有代码即可运行,飞船会正常跟随鼠标移动,星星下落逻辑也不受影响:
import pygame import random # 定义颜色常量 BLACK = (0, 0, 0) WHITE = (255, 255, 255) GREEN = (0, 255, 0) RED = (255, 0, 0) BLUE = (0, 0, 255) GRAY = (128, 128, 128) pygame.init() star_list = [] for i in range(50): x = random.randrange(0, 700) y = random.randrange(0, 700) star_list.append([x, y]) # 初始化窗口 size = (700, 500) screen = pygame.display.set_mode(size) pygame.display.set_caption("Space Game") done = False def draw_spaceship(screen, x ,y): # 飞船主体 pygame.draw.rect(screen, GRAY, [x, y, 20, 40], 0) # 右侧机翼 pygame.draw.polygon(screen, GRAY, [[x+40, y], [x+15, y], [x+15, y+25]], 0) # 左侧机翼 pygame.draw.polygon(screen, GRAY, [[x, y], [x-20, y], [x, y+25]], 0) clock = pygame.time.Clock() # 主程序循环 while not done: # 事件监听 for event in pygame.event.get(): if event.type == pygame.QUIT: done = True # 获取实时鼠标坐标 pos = pygame.mouse.get_pos() x = pos[0] y = pos[1] # 绘制黑色背景 screen.fill(BLACK) # 绘制下落星星 for i in range(len(star_list)): pygame.draw.circle(screen, WHITE, star_list[i], 2) star_list[i][1] += 1 # 星星移出屏幕后重置到顶部 if star_list[i][1] > 700: star_y = random.randrange(-50, -10) star_list[i][1] = star_y star_x = random.randrange(0, 700) star_list[i][0] = star_x # 绘制跟随鼠标的飞船 draw_spaceship(screen, x-10, y-40) # 刷新屏幕 pygame.display.flip() # 帧率锁定60FPS clock.tick(60) pygame.quit()
提示:如果想调整飞船和鼠标的相对位置,直接修改传入draw_spaceship的偏移量数值即可
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

