在pygame中用鼠标画一条直线?

时间:2014-12-28 14:15:46

标签: python pygame

我正在为Flow创建一个类似的游戏。如果您熟悉它,则需要用户通过网格上相同颜色的线将相同的圆圈匹配在一起。我遇到了一个问题,无论哪里有鼠标运动事件,我都希望用户只能画直线(左,右,上,下)。目前用户可以在任何地方绘图,我有一个功能,只要鼠标运动事件发生时绘制圆圈,虽然我已经使用了一些if语句试图限制用户可以绘制它的位置仍然无法正常工作。也许有更好的方法而不是使用鼠标运动事件?我不确定,但非常感谢任何帮助!

以下是一些代码:

''' *** IN PROGRESS *** '''
while not done:
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        done = True  # Closes the game and exits the loop

    elif event.type == pygame.MOUSEBUTTONDOWN:
        x, y = event.pos
        pygame.mouse.set_visible(True)
        ''' If the user clicks down on the left button the mouse coordinates at that             point are assigned to variables 
        x and y which are used to check the condition of the click_detection function'''

    elif event.type == pygame.MOUSEBUTTONUP:
        pygame.mouse.set_visible(True)
        # Makes the cursor visible to choose a new circle easily

    elif event.type == pygame.MOUSEMOTION:

        ''' State is assigned to an array for each of three mouse buttons
        at state[0] it checks the left mouse button'''
        state = pygame.mouse.get_pressed()

        for circle in circle_grid_list:
            # Checks following conditions for every circle in that Sprite group

            if ClickDetection.click_detection(circle) == True:
                ''' Checks whether a circle is being clicked
                - If so then variable colour is assigned to the colour of the clicked circle
                - This is used so that the move method from circle_line class can be called using the colour of the clicked circle'''
                colour = circle.colour

                # *** WORK IN PROGRESS ***
                if MovementChecker.check() != False:
                    print("can draw")
                    if state[0] == 1:
                        # Checking the left mouse button state, if 1 then button is being clicked or held down
                        moving_line_mouse.Move()

                elif MovementChecker.check() == False:
                    # Used to stop the move method for the moving_line object from being called if movement checker is false
                    print("Can't draw")

1 个答案:

答案 0 :(得分:0)

所以,不要再考虑“这是我的鼠标所在的位置”,而是试着用“哪个盒子是我的鼠标位于?”来思考。如果是,那就给那个盒子上色。这可能会有所帮助

例如,如果您的每个正方形都是100x100像素,并且您的鼠标位于坐标424和651处,那么您可以通过执行int(424 / 100)int(651 / 100)来计算网格位置 - 您的鼠标位于网格上的位置4x6(请注意,我们从零开始计算,因此左上角的方块位于0x0位置。)

然后,您可以检查网格4x6是否已经填充,检查它是否填充了不同的颜色,并处理所有逻辑。

Flow还有一个功能,它会绘制一条线,连接您输入的位置和离开的位置。如果你用另一种颜色“切割”它,它也会删除预先存在的一半的行。

实现这一目标的一种方法是创建一个“方形”对象,该对象跟踪其当前颜色,对您来自的方块的引用,以及对您最终选取的方块的引用。

这样,你就会在你的网格中创建一种“链表” - 每个方块都指向它所连接的下一个方块,所以你知道是否需要绘制垂直条,水平条或者一个角落。如果你切开已经设置了颜色的方块,你可以继续跟踪引用链,找到上一个颜色流过的下一个方块,并在继续之前将它们设置为空。