Python使用Pygame绘制动态延伸线条时出现绘制速度异常问题
错误原因
- 固定步长逻辑错误:当前代码x、y轴每次固定+5,完全没有适配鼠标位置和起点之间的实际方向,仅做了
end大于等于鼠标坐标时直接赋值为鼠标坐标的判断,没有处理end小于鼠标坐标之外的情况:- 当鼠标在起点左侧时,初始end的x坐标为500,大于左侧鼠标的x值,会直接被赋值为鼠标x坐标,所以线条瞬间绘制完成
- 当鼠标在起点右侧时,x需要从500每次+5逐步涨到鼠标x值,所以看起来有延迟
- 仅当鼠标y坐标和起点y一致时,y方向没有差值,表现才符合预期
- 没有做向量归一化:不同角度的线条增长速度会不一致,斜向线条的视觉增长速度会比水平/垂直更快
修复后代码
import pygame, sys from math import sqrt pygame.init() screen = pygame.display.set_mode((1280, 720)) pygame.display.set_caption("loading") clock = pygame.time.Clock() start = [500, 500] move_speed = 5 # 统一的线条增长速度 end = start.copy() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() mouse_pos = list(pygame.mouse.get_pos()) screen.fill("#0d0e2e") if pygame.mouse.get_pressed()[0]: # 计算当前终点到鼠标目标点的向量 dx = mouse_pos[0] - end[0] dy = mouse_pos[1] - end[1] distance = sqrt(dx**2 + dy**2) if distance > move_speed: # 归一化方向向量后乘以速度,得到本次移动的步长 end[0] += move_speed * dx / distance end[1] += move_speed * dy / distance else: # 距离小于步长时直接到目标点,避免抖动 end = mouse_pos.copy() else: # 松开鼠标时重置终点到起点 end = start.copy() pygame.draw.line(screen, (255, 169, 255), start, list(map(int, end)), 12) pygame.display.update() clock.tick(60)
修复说明
- 新增方向向量计算逻辑,不管鼠标在哪个方向,线条都会沿着起点到鼠标的方向匀速增长
- 增加向量归一化处理,所有方向的线条增长视觉速度完全一致
- 适配鼠标拖动时实时更新目标点的场景,拖动鼠标时线条会跟随调整方向
内容的提问来源于stack exchange,提问作者rxse
相关产品推荐
相关产品推荐

