Программа Paint в Python — отмена и повтор

В настоящее время я работаю над созданием программы рисования с использованием python и pygame. В настоящее время у меня возникают проблемы с созданием функции отмены/повтора в программе. Я думал об этом так, чтобы сохранять изображение холста каждый раз, когда пользователь отпускает мышь, но я не уверен, нужно ли сохранять отдельные изображения во временной папке, которая удаляется после закрытия программы. . Я также читал, что этот метод может повлиять на производительность программы, поэтому мне интересно, есть ли какие-либо другие методы, которые будут работать более эффективно. Спасибо.


person user2950875    schedule 29.12.2013    source источник


Ответы (2)


запись копии в файл звучит немного тяжело, нужно ли отменять неограниченное количество раз? Я бы предложил использовать что-то вроде pythons collections.deque в качестве циклического буфер для сохранения последних N модификаций, это избавит вас от необходимости беспокоиться об очистке и хранении на диске. Если создание полных моментальных снимков каждый раз оказывается слишком мудрым с точки зрения производительности, вам может потребоваться изучить возможность ограничения каждой сохраненной области определенной ограничивающей рамкой на основе того, какое последнее действие было выполнено пользователем.

person norlesh    schedule 29.12.2013

Мое предложение состоит в том, чтобы иметь буфер последних выполненных операций. Каждая операция будет состоять из спрайта и позиции его размещения.

Вы будете рисовать холст, а также все спрайты из этого буфера. Когда у вас слишком много спрайтов в буфере, вы можете перенести самые старые спрайты на холст, тем самым сэкономив память.

Сама отмена будет довольно простой. Просто удалите последний добавленный спрайт.

Повторить будет немного сложнее. Поскольку вместо удаления у меня был бы указатель, указывающий на последний спрайт, который я буду рисовать. Если будет добавлено новое действие, только тогда я удаляю все спрайты, которые были "невидимыми".

person Bartlomiej Lewandowski    schedule 29.12.2013