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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:54:28