在我看来,有两种方法可以处理鼠标事件来绘制图片.
第一种是当检测到鼠标移动和画一条线,其中鼠标,示出在这里.然而,这个问题是,在刷子尺寸较大的情况下,每条"直线"之间会出现很多间隙,因为它使用线条的笔划大小来创建粗线.
另一种方法是,当鼠标移动如图所示,以画圈圈这里.问题是如果鼠标移动得比计算机检测到鼠标输入快,则每个圆之间会出现间隙.
这是我的两个问题的屏幕截图:
实现像MS Paint一样的刷子的最佳方法是什么,刷子尺寸相当大,线条中没有间隙或每个圆圈之间没有间隙?
为什么不两个都做?
在每个端点处画一个圆圈,在两个端点之间画一条线.
编辑 rofl,只是无法阻止自己.
实际上,你不想使用,pygame.draw.line
因为它作弊.它填充像素的1像素宽的行或列(取决于攻角).如果你以大致垂直的角度,0度或90度,这不是问题,但在45年代,你会发现一种菜豆效应.
唯一的解决方案是在每个像素的距离处绘制一个圆.这里...
import pygame, random screen = pygame.display.set_mode((800,600)) draw_on = False last_pos = (0, 0) color = (255, 128, 0) radius = 10 def roundline(srf, color, start, end, radius=1): dx = end[0]-start[0] dy = end[1]-start[1] distance = max(abs(dx), abs(dy)) for i in range(distance): x = int( start[0]+float(i)/distance*dx) y = int( start[1]+float(i)/distance*dy) pygame.draw.circle(srf, color, (x, y), radius) try: while True: e = pygame.event.wait() if e.type == pygame.QUIT: raise StopIteration if e.type == pygame.MOUSEBUTTONDOWN: color = (random.randrange(256), random.randrange(256), random.randrange(256)) pygame.draw.circle(screen, color, e.pos, radius) draw_on = True if e.type == pygame.MOUSEBUTTONUP: draw_on = False if e.type == pygame.MOUSEMOTION: if draw_on: pygame.draw.circle(screen, color, e.pos, radius) roundline(screen, color, e.pos, last_pos, radius) last_pos = e.pos pygame.display.flip() except StopIteration: pass pygame.quit()