如何在Pygame中绘制连续线条?解决鼠标快速移动断线问题
解决Pygame中快速移动鼠标绘制连续线条的问题
嘿,我明白你遇到的问题了!你当前的代码在鼠标移动时只是在当前位置画一个单点(因为pygame.draw.line的起点和终点是同一个坐标),而Pygame的MOUSEMOTION事件不会在鼠标移动的每一个像素都触发——当鼠标快速移动时,事件触发的间隔会变大,导致留下的点之间有空隙,看起来就不连续了。
要解决这个问题,我们需要记录上一次鼠标的位置,每次鼠标移动时,从上次的位置绘制到当前位置,这样即使中间跳过了一些像素,线条也会自动连接起来,形成连续的轨迹。
修改后的完整代码
import pygame, sys from pygame.locals import * def main(): pygame.init() WHITE = (255, 255, 255) BLACK = (0, 0, 0) # 新增变量存储上一次鼠标位置 last_pos = (0, 0) mouse_position = (0, 0) drawing = False screen = pygame.display.set_mode((600, 800), 0, 32) screen.fill(WHITE) pygame.display.set_caption("ScratchBoard") while True: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEMOTION: if drawing: mouse_position = pygame.mouse.get_pos() # 连接上一次位置与当前位置,绘制连续线条 pygame.draw.line(screen, BLACK, last_pos, mouse_position, 1) # 更新上一次位置为当前位置,为下一次绘制做准备 last_pos = mouse_position elif event.type == MOUSEBUTTONUP: drawing = False elif event.type == MOUSEBUTTONDOWN: drawing = True # 按下鼠标时初始化位置,同时画一个单点(避免只点击不移动无痕迹) mouse_position = pygame.mouse.get_pos() last_pos = mouse_position pygame.draw.circle(screen, BLACK, mouse_position, 1) pygame.display.update() if __name__ == "__main__": main()
关键修改点说明
- 新增
last_pos变量:用来追踪鼠标上一次的位置,确保每次移动都能连接前后两个点 MOUSEMOTION事件优化:不再绘制单点,而是用pygame.draw.line连接last_pos和当前鼠标位置,绘制完成后立即更新last_posMOUSEBUTTONDOWN补充处理:按下鼠标时不仅开启绘制状态,还初始化位置并画一个小圆点,避免只点击不移动时画布上没有痕迹
这样修改后,不管鼠标移动快还是慢,都能画出流畅的连续线条啦!
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

