为什么Pygame无法绘制圆形?

3

我是Python的新手,想要实现一个功能:无论鼠标在哪里,都可以画出一个圆形(我已经有了鼠标和背景图像)。以下是我的代码:

while True:

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit

        if event.type == MOUSEBUTTONDOWN:
            color = (100,100,100)
            posx,posy = pygame.mouse.get_pos()
            screen.lock()
            pygame.draw.circle(screen, color, (posx,posy), 50)
            screen.unlock()

    screen.blit(background,(0,0))
    x,y = pygame.mouse.get_pos()
    x -= mousec.get_width()/2
    y -= mousec.get_height()/2

    screen.blit(mousec, (x,y))

    pygame.display.update()

每次我点击时都没有反应。为什么它不画圆呢?谢谢帮助!
1个回答

5

我对pygame几乎一无所知,所以我不能提供比这更多的帮助......但我认为你正在不断地重绘你的圆形。试试这个:

pygame.init()
screen = pygame.display.set_mode((640, 480))

screen.fill((0,0,0))

while True:

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

        if event.type == MOUSEBUTTONDOWN:
            # draw background first (however)
            screen.fill((0,0,0))

            # draw your other layers (mouse image)

            # draw the circle
            color = (255,255,255)
            posx,posy = pygame.mouse.get_pos()
            pygame.draw.circle(screen, color, (posx,posy), 50)

    pygame.display.update()

基本上,您的示例中发生的情况是,当鼠标按下事件进行绘制时,您将再次用背景绘制它。我不确定 mousec 是什么,但每次都会在背景上绘制它。因此,您永远不会看到从鼠标单击绘制的圆形。
我的示例首先填充背景,然后当有鼠标按下时,它会再次填充背景以覆盖先前的状态,然后绘制圆形。
另一种方法是使用您的确切示例,仅在检查事件时记录鼠标位置,并推迟绘制圆形直到在层之后。您将“记住”最后一个鼠标位置以在每个循环中不断重新绘制该圆形:
last_mouse_pos = None

while True:

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit

        if event.type == MOUSEBUTTONDOWN:
            last_mouse_pos = pygame.mouse.get_pos()

        elif event.type == KEYDOWN and event.unicode == 'c':
            # clear the circle when pressing the 'c' key
            last_mouse_pos = None

    screen.blit(background,(0,0))
    x,y = pygame.mouse.get_pos()
    x -= mousec.get_width()/2
    y -= mousec.get_height()/2

    screen.blit(mousec, (x,y))

    if last_mouse_pos:
        color = (100,100,100)
        posx,posy = last_mouse_pos
        pygame.draw.circle(screen, color, (posx,posy), 50)

    pygame.display.update()

这种方法的区别在于,每次循环都会绘制所有内容,而不仅仅是响应事件变化时才绘制。
更新:
针对您在评论中提出的问题…… 修改第二个示例以保留所有鼠标点击的一种方法是将它们保存在一个“set”中,并每次重新绘制。
mouse_clicks = set()

while True:

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit

        if event.type == MOUSEBUTTONDOWN:
            mouse_clicks.add(pygame.mouse.get_pos())

        elif event.type == KEYDOWN and event.unicode == 'c':
            # clear the circle when pressing the 'c' key
            mouse_clicks.clear()

    screen.blit(background,(0,0))
    x,y = pygame.mouse.get_pos()
    x -= mousec.get_width()/2
    y -= mousec.get_height()/2

    screen.blit(mousec, (x,y))

    for pos in mouse_clicks:
        color = (100,100,100)
        posx,posy = pos
        pygame.draw.circle(screen, color, (posx,posy), 50)

    pygame.display.update()

谢谢!这解决了问题。每次点击屏幕后都会擦除上一个圆,您知道如何让所有圆都保留下来吗?我想我需要将screen.blit(background,(0,0))移出循环...但我不确定 :/ - Madison Young
1
当然。只需在循环之前一次性复制背景和鼠标图像,这样您只需要在其上绘制新圆圈即可。这将适用于我的第一个示例。第二个示例需要您将位置附加到列表中,以便每次循环时可以循环该列表并绘制所有圆圈。 "清除"键可以清空列表。 - jdi
非常感谢!现在鼠标图像不会移动,因为它已经超出了循环。我现在要处理列表,感谢您的所有帮助! - Madison Young
1
刚刚为你添加了一个例子。我使用了一个集合。尽管集合是无序的,但考虑到你的圆圈都是实心的,所以顺序并不重要。集合中的元素是唯一的,并且添加新项的速度更快。因此,如果你在同一个位置连续点击多次,仍然只会生成一个圆圈。 - jdi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接