当前位置:  开发笔记 > 编程语言 > 正文

如何使用Python和pygame创建MS Paint克隆

如何解决《如何使用Python和pygame创建MSPaint克隆》经验,为你挑选了1个好方法。

在我看来,有两种方法可以处理鼠标事件来绘制图片.

第一种是当检测到鼠标移动和画一条线,其中鼠标,示出在这里.然而,这个问题是,在刷子尺寸较大的情况下,每条"直线"之间会出现很多间隙,因为它使用线条的笔划大小来创建粗线.

另一种方法是,当鼠标移动如图所示,以画圈圈这里.问题是如果鼠标移动得比计算机检测到鼠标输入快,则每个圆之间会出现间隙.

这是我的两个问题的屏幕截图:

http://imgur.com/32DXN.jpg

实现像MS Paint一样的刷子的最佳方法是什么,刷子尺寸相当大,线条中没有间隙或每个圆圈之间没有间隙?



1> SingleNegati..:

为什么不两个都做?

在每个端点处画一个圆圈,在两个端点之间画一条线.

编辑 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()

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有