如何在Pygame中绘制连续线?

时间:2018-05-24 07:36:20

标签: python pygame

我想在鼠标点击并在Pygame框架中移动时绘制一条线,如果我非常缓慢地移动鼠标,它将是一条线。但是,如果我快速移动鼠标,它只是不连续的点。问题是当鼠标移动时如何绘制连续线?提前谢谢。

import pygame, sys
from pygame.locals import *

def main():
    pygame.init()

    WHITE = (255, 255, 255)
    BLACK = (0, 0, 0)

    mouse_position = (0, 0)
    drawing = False
    screen = pygame.display.set_mode((600, 800), 0, 32)
    screen.fill(WHITE)
    pygame.display.set_caption("ScratchBoard")

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == MOUSEMOTION:
                if (drawing):
                    mouse_position = pygame.mouse.get_pos()
                    pygame.draw.line(screen, BLACK, mouse_position, mouse_position, 1)
            elif event.type == MOUSEBUTTONUP:
                mouse_position = (0, 0)
                drawing = False
            elif event.type == MOUSEBUTTONDOWN:
                drawing = True

        pygame.display.update()

if __name__ == "__main__":
    main()

2 个答案:

答案 0 :(得分:2)

通过使用相同的参数(mouse_position)调用.val两次,你没有画一条线,你正在绘制一个像素,因为start_pos和end_pos是相同的。

要获得一条连续的线,你需要保存最后一个位置并在它和下一个位置之间画一条线,就像这样(更改是pygame.draw.line的线条):

last_pos

答案 1 :(得分:0)

vgel是对的,您需要将之前的位置和当前位置传递给pygame.draw.line。您还可以通过从event.rel属性中减去事件的event.pos属性来计算先前的位置。

使用drawing属性也可以删除event.buttons变量。如果event.buttons[0]True,则按下鼠标左键。

import pygame


def main():
    pygame.init()

    WHITE = (255, 255, 255)
    BLACK = (0, 0, 0)
    screen = pygame.display.set_mode((600, 800), 0, 32)
    screen.fill(WHITE)
    clock = pygame.time.Clock()

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                return
            elif event.type == pygame.MOUSEMOTION:
                if event.buttons[0]:  # Left mouse button down.
                    last = (event.pos[0]-event.rel[0], event.pos[1]-event.rel[1])
                    pygame.draw.line(screen, BLACK, last, event.pos, 1)

        pygame.display.update()
        clock.tick(30)  # Limit the frame rate to 30 FPS.

if __name__ == "__main__":
    main()