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

Pygame实现十字准星跟随鼠标问题求助:准星显示在左下角

解决Pygame十字准星偏移至屏幕左下角的问题

问题根源

  1. Pygame初始化顺序错误:pygame.init()必须在创建显示窗口前调用,否则输入设备(如鼠标)的坐标获取可能异常。
  2. 屏幕未循环刷新:每次循环未清空屏幕,旧的准星图像会叠加,且初始绘制的枪支会被覆盖。
  3. 准星未与鼠标中心对齐:screen.blit()默认以图像左上角为锚点,直接使用鼠标坐标会导致准星偏移,需将准星中心与鼠标位置对齐。
  4. 帧率控制未生效:fps.tick(60)放在循环外仅执行一次,无法稳定维持60帧每秒的帧率。
  5. 枪支未循环重绘:初始枪支绘制仅执行一次,循环内未重新绘制,导致移动准星后枪支消失。

修正后的完整代码

import pygame

# 初始化Pygame(必须放在最前面)
pygame.init()

SCREEN_WIDTH = 1000
SCREEN_HEIGHT = 600

screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("鸭猎游戏")
fps = pygame.time.Clock()

# 加载并处理资源
color = (255, 255, 255)
pygame.mouse.set_visible(False)
gun = pygame.image.load(r"C:\Users\Ben\Downloads\download (3).png")
crosshair = pygame.image.load(r"C:\Users\Ben\Downloads\2783540c8c81da4 (1).png")
gun = pygame.transform.rotate(gun, 90)
gun_position = (375, 350)

# 获取准星的中心偏移量
crosshair_rect = crosshair.get_rect()

run = True
while run:
    # 控制帧率
    fps.tick(60)
    
    # 清空屏幕
    screen.fill(color)
    
    # 重绘枪支
    screen.blit(gun, gun_position)
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    
    # 获取鼠标位置并计算准星中心坐标
    mouse_x, mouse_y = pygame.mouse.get_pos()
    crosshair_x = mouse_x - crosshair_rect.width // 2
    crosshair_y = mouse_y - crosshair_rect.height // 2
    
    # 绘制准星
    screen.blit(crosshair, (crosshair_x, crosshair_y))
    
    # 更新显示
    pygame.display.update()

pygame.quit()

关键修改说明

  • 将pygame.init()移至代码最开头,确保所有Pygame模块正常初始化。
  • 在循环内每次执行screen.fill(color)清空屏幕,避免图像残留。
  • 通过crosshair.get_rect()获取准星的尺寸,计算出中心偏移量,使准星中心与鼠标位置重合。
  • 将fps.tick(60)放入循环内,确保每帧都控制帧率。
  • 在循环内重绘枪支,保证枪支始终显示在屏幕上。

内容的提问来源于stack exchange,提问作者Purpic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:35:13