Как нарисовать непрерывную линию в Pygame? - PullRequest
0 голосов
/ 24 мая 2018

Я хочу нарисовать линию, если щелкнуть мышью и двигаться в среде 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 голосов
/ 25 мая 2018

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()
0 голосов
/ 24 мая 2018

Вызывая pygame.draw.line с одним и тем же аргументом (mouse_position) дважды, вы не рисуете линию, вы рисуете один пиксель, потому что start_pos и end_pos одинаковы.

Чтобы получитьнепрерывной линии, вам нужно сохранить последнюю позицию и нарисовать линию между ней и следующей позицией, вот так (изменения это строки с last_pos):

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")

    last_pos = None

    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()
                    if last_pos is not None:
                        pygame.draw.line(screen, BLACK, last_pos, mouse_position, 1)
                    last_pos = mouse_position
            elif event.type == MOUSEBUTTONUP:
                mouse_position = (0, 0)
                drawing = False
            elif event.type == MOUSEBUTTONDOWN:
                drawing = True

        pygame.display.update()

if __name__ == "__main__":
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...