微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在两点之间画一条线的 Pygame 函数不起作用

如何解决在两点之间画一条线的 Pygame 函数不起作用

我创建了一个函数来尝试保存随后两次鼠标点击的位置,然后在它们之间画一条线,但它不起作用。

这是我的代码

import pygame
import pygame_widgets
pygame.init()
screen=pygame.display.set_mode((300,300),pygame.RESIZABLE)
points=[]
buttonpress=False
go=True
def drawline():
    pos1get=False
    pos2get=False
    for event in pygame.event.get():
        while pos1get==False:
            if event.type==pygame.MOUSEBUTTONUP:
                pos1=pygame.mouse.get_pos()
                print(pos1)
                pos1get=True
        while pos2get==False:
            if event.type==pygame.MOUSEBUTTONUP:
                pos2=pygame.mouse.get_pos()
                print(pos2)
                pos2get=True
    if pos1get==True and pos2get==True:
        pygame.draw.aaline(screen,(0,0),pos1,pos2)
        print('line drawn')
while go:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
        if event.type==pygame.MOUSEBUTTONUP:
            points.append(event.pos)
            
    button=pygame_widgets.Button(screen,100,50,onClick=lambda:drawline() )
    screen.fill((255,255,255))
    button.listen(event)
    button.draw()
    pygame.display.flip()

请注意:问题 Looping mousebutton down to draw lines 没有回答我的问题。我希望每次都在两个不同的点之间绘制线条,并且只有在按下按钮之后。如果按钮没有被按下,我不希望程序注册任何鼠标点击。

我上面发布的代码有效,但有两个问题。

  1. 即使正在执行绘制线条的 pygame 函数,线条也不可见。

  2. 两个点都被注册为我点击按钮的点。

我已经看过并阅读了我能找到的与此问题相关的所有 Stack Overflow 答案,但没有一个解决我的问题。

解决方法

我希望每次都在两个不同的点之间绘制一条线,并且只有在按下按钮之后。如果按钮没有被按下,我不希望程序记录任何鼠标点击。

让我们编码。首先我想在两个不同的点之间画一条线。所以我们需要一个容器来存储点。这将是一个包含行的开始和结束位置的元组的列表。

其次,只有在按钮被按下后才能回答部分。这意味着我们需要某种变量来跟踪鼠标是否被按下。我们将称这个变量为 begin。为什么叫开始呢?因为只要按下鼠标,我们就想开始“捕捉”鼠标位置。

import pygame
import time

window = pygame.display.set_mode((1200,600))
points = []
begin = False

while True:
    pygame.event.get()
    window.fill((255,255,255))

    if any(pygame.mouse.get_pressed()) and not begin:
        posStart = pygame.mouse.get_pos()
        begin = True

现在在同一帧中,我们将 begin 设置为 true。这意味着 posStart 变量保存鼠标在第一帧中的位置。

现在,我们已将 begin 设置为 true,我们可以开始捕获鼠标的当前位置。

if begin:
        posNow = pygame.mouse.get_pos()
        pygame.draw.line(window,(255,0),(posStart[0],posStart[1]),(posNow[0],posNow[1]))

最后,我们需要将 begin 设置为 false。我们已经知道,如果 begin 已经为 true 并且没有按下鼠标,我们需要将 begin 设置为 false。同时,我们还可以将鼠标的起止位置以元组的形式添加到点上。

if not any(pygame.mouse.get_pressed()) and begin:
        points.append((posStart,posNow))
        begin = False 

这就给你了。现在唯一要做的就是绘制点。

import pygame
import time

window = pygame.display.set_mode((1200,600))
points = []
begin = False

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            
    window.fill((255,255))

    if any(pygame.mouse.get_pressed()) and not begin:
        posStart = pygame.mouse.get_pos()
        begin = True

    if begin:
        posNow = pygame.mouse.get_pos()
        pygame.draw.line(window,posNow[1]))
                                                                                           

    if not any(pygame.mouse.get_pressed()) and begin:
        points.append((posStart,posNow))
        begin = False

    for i in range(len(points)):
        pygame.draw.line(window,(0,(points[i][0][0],points[i][0][1]),(points[i][1][0],points[i][1][1]))
        
    pygame.display.flip()
,

这是我所理解的你想要的工作版本:

  • 每次点击后,您可以绘制一条由两点组成的线

我已经重构/更改了一些代码。 如果您使用 MOUSEUP 而不是 MOUSEDOWN 事件,您将看到每个 当您单击按钮时,第一个点将是 按钮本身,那是因为 allow_draw 会在 MOUSEDOWN 上触发 并且在 MOUSEUP 将被激活之后。

import pygame
import pygame_widgets
pygame.init()
screen=pygame.display.set_mode((300,300),pygame.RESIZABLE)
points=[]
drawing_enabled = False

screen.fill((255,255))

button=pygame_widgets.Button(screen,100,50,onClick=lambda:allow_draw() )
button.draw()

def allow_draw():
    global drawing_enabled
    drawing_enabled = True
    print("Button clicked")

while(1):
    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN and drawing_enabled:
            points.append(pygame.mouse.get_pos())
        if len(points) > 1:
            pos1 = points.pop()
            pos2 = points.pop()
            pygame.draw.line(screen,pos1,pos2)
            print(f'line drawn pos1:{pos1} pos2:{pos2}')
            drawing_enabled = False
        if event.type==pygame.QUIT:
            pygame.quit()
        button.listen(event)
            
    pygame.display.flip()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。