Уведомления

Группа в Telegram: @pythonsu

#1 Июль 16, 2017 13:53:51

philimonix
Зарегистрирован: 2017-07-11
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Pygame. Скорость цикла обработки событий.

Имеется такой вот код:

 def draw_pixel(position):
    global SIZE
    global COLOR
    SCREEN.fill(COLOR, (position, SIZE))
while True:  # main loop
    pos = pygame.mouse.get_pos()
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == MOUSEBUTTONDOWN:
            FLAG = True
        if event.type == MOUSEBUTTONUP:
            FLAG = False
    if FLAG:
        draw_pixel(pos)
    change_brush_size_button.draw_button()
    pygame.display.update()

Тут простая рисовалка. Зажал левую кнопку мыши и рисуешь карандашом в один пиксель. Но, если вести мышь не достаточно медленно, то пиксели рисоваться не успевают, и линия получается прерывистая. Я так понимаю, что надо как-то привязать это действие ко времени. Я понимаю, как это сделать для анимации спрайта и его движения, например. А вот как сделать, чтобы линия рисовалась без пробелов, что-то не доходит до меня. Может, подскажете чего-нибудь?

Отредактировано philimonix (Июль 16, 2017 13:57:25)

Офлайн

#2 Июль 16, 2017 14:15:16

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Pygame. Скорость цикла обработки событий.

Проще всего вести линию от предыдущей точки.

Офлайн

#3 Июль 16, 2017 15:08:24

philimonix
Зарегистрирован: 2017-07-11
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Pygame. Скорость цикла обработки событий.

Shaman
Проще всего вести линию от предыдущей точки.
Да, так действительно проще. Но пока я не уверен, что в моём случае это будет правильным решением. В конечном итоге это должно стать редактором пиксельной графики. Думаю, тут мне всё равно придётся иметь массив пикселей для каждого слоя. И тогда возникает вопрос: каждый проход основного цикла проверять попиксельно всю поверхность на предмет изменений, внесённых функцией отрисовки линии? Или всё же как-то сделать плавным процесс рисования отдельними пикселями с занесением каждого из них в массив сразу же после отрисовки? У меня изначально была именно такая задумка, но я упёрся в то, что рисование получается не плавным.

Офлайн

#4 Июль 16, 2017 15:34:16

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Pygame. Скорость цикла обработки событий.

Более правильным решением может быть только отрисовка кривых.

Офлайн

#5 Июль 16, 2017 15:55:52

philimonix
Зарегистрирован: 2017-07-11
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Pygame. Скорость цикла обработки событий.

Shaman
Более правильным решением может быть только отрисовка кривых.
Не понял, о чём Вы.

Офлайн

#6 Июль 18, 2017 06:28:13

philimonix
Зарегистрирован: 2017-07-11
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Pygame. Скорость цикла обработки событий.

Короче, решение нашёл сам. Может, это топорно и велосипедно, но работает так, как мне было нужно изначально. Нагуглил алгоритм рисования линии, перепилил его на Python. Теперь я рисую линиями, но имею контроль над отрисовкой каждого отдельного пикселя. Алгоритм называется “Алгоритм Брезенхэма”, если кому будет интересно или нужно.

 def draw_line(x1, y1, x2, y2):
    delta_x = abs(x2 - x1)
    delta_y = abs(y2 - y1)
    if x1 < x2:
        sign_x = 1
    else:
        sign_x = -1
    if y1 < y2:
        sign_y = 1
    else:
        sign_y = -1
    
    error = delta_x - delta_y
    
    draw_pixel([x2, y2])
    while (x1 != x2 or y1 != y2): 
        draw_pixel([x1, y1])
        error_2 = error * 2
        
        if error_2 > -delta_y: 
            error -= delta_y
            x1 += sign_x
        
        if error_2 < delta_x:
            error += delta_x
            y1 += sign_y

 while True:  # main loop
    pos = pygame.mouse.get_pos()
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == MOUSEBUTTONDOWN:
            flag = True
        if event.type == MOUSEBUTTONUP:
            flag = False
            
    if flag:
       new_pos = pygame.mouse.get_pos()
       draw_line(pos[0], pos[1], new_pos[0], new_pos[1])
        
   pygame.display.flip()

Отредактировано philimonix (Июль 18, 2017 07:13:01)

Офлайн

#7 Июль 18, 2017 06:43:44

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Pygame. Скорость цикла обработки событий.

philimonix

 FLAG = True

Если FLAG - константа, то она не должна изменяться, если не константа, то не называйте её как константу



Офлайн

#8 Июль 18, 2017 07:12:03

philimonix
Зарегистрирован: 2017-07-11
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Pygame. Скорость цикла обработки событий.

FishHook
Если FLAG - константа, то она не должна изменяться, если не константа, то не называйте её как константу
Да в питоне вроде как нету констант же
Ну а вообще, я как-то не вникал во все эти соглашения пока ещё. На будущее учту, что БОЛЬШИЕ_БУКВЫ это как-будто бы константа
Спасибо за замечание

Офлайн

#9 Июль 18, 2017 07:16:42

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Pygame. Скорость цикла обработки событий.

philimonix
Да в питоне вроде как нету констант же
Вот именно поэтому в том числе и придумывают соглашения об именованиях и прочую стилистику, чтобы компенсировать скудность инструментария



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version