Pygame实现十字准星跟随鼠标问题求助:准星显示在左下角
解决Pygame十字准星偏移至屏幕左下角的问题
问题根源
- Pygame初始化顺序错误:
pygame.init()必须在创建显示窗口前调用,否则输入设备(如鼠标)的坐标获取可能异常。 - 屏幕未循环刷新:每次循环未清空屏幕,旧的准星图像会叠加,且初始绘制的枪支会被覆盖。
- 准星未与鼠标中心对齐:
screen.blit()默认以图像左上角为锚点,直接使用鼠标坐标会导致准星偏移,需将准星中心与鼠标位置对齐。 - 帧率控制未生效:
fps.tick(60)放在循环外仅执行一次,无法稳定维持60帧每秒的帧率。 - 枪支未循环重绘:初始枪支绘制仅执行一次,循环内未重新绘制,导致移动准星后枪支消失。
修正后的完整代码
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
相关产品推荐
相关产品推荐

