Сохранение истории рисования в Pygame для реализации Ctrl Z - PullRequest
1 голос
/ 18 апреля 2020

Я пытаюсь вспомнить предыдущие рисунки для реализации Ctrl-Z (Отменить) и (Повторить). Для этого я использую стек (deque) из коллекций, и я также создал объект с именем DrawEntity, который имеет атрибут списка прямоугольников (класс pygame), потому что я не хочу сохранять каждый пикселя, который я рисую, но только один «мазок», а не компоненты, которые его создают (маленькие прямоугольники делают мазок), однако я не знаю, как вставить его в основной список DrawEntity, который сохранит эти объекты в Очередь для каждого мазка, а не для каждого прямоугольника. Это то, что у меня есть:

main.py:

import pygame as pg
from collections import deque
from DrawEntity import DrawEntity

DrawEnt = deque()

def draw(window):
    d_Ent = DrawEntity()
    mouseX, mouseY = pg.mouse.get_pos()
    click = pg.mouse.get_pressed()
    if click[0]:
        rect = pg.draw.rect(window, (0, 0, 0), pg.Rect(mouseX, mouseY, 3, 3), 3)
        d_Ent.add(rect)

    if d_Ent.entity:
        print("new Entity")
        print(d_Ent)
        DrawEnt.append(d_Ent)



def main():

    running = True
    window = pg.display.set_mode((640, 480))
    window.fill((255, 255, 255))


    while running:
        clock.tick(3200)

        for event in pg.event.get():
            if event.type == pg.QUIT:
                running = False

            if event.type == pg.KEYDOWN:

                if event.key == pg.K_z and pg.key.get_mods() & pg.KMOD_LCTRL:

                    print(len(DrawEnt))

            draw(window)

        pg.display.flip()
    #end main loop
    pg.quit()

if __name__ == '__main__':

    pg.init()
    clock = pg.time.Clock()
    main()

И DrawEntity.py:

class DrawEntity:
def __init__(self):
    self.entity = []

def add(self, toAdd):
    self.entity.append(toAdd)

def remove(self):
    self.entity = []

def __str__(self):
    return ' '.join(map(str, self.entity))

По сути, я хочу ввести некоторое время l oop и оставайтесь там, пока я продолжаю нажимать, чтобы собрать все прямоугольники в список и затем добавить его в основной список сущностей, однако это не вводит некоторое время l oop, и каждый раз, когда я рисую, он добавляет каждый новая сущность с одним прямоугольником, а не с серией прямоугольников. (Если я попытаюсь использовать, пока l oop игра вылетает)
Итак:

-1 При нажатии собрать все прямоугольники, которые я нарисовал до сих пор

1.1 Если я остановился затем нажмите и добавьте новый d_Ent со списком прямоугольников в основной список сущностей (DrawEnt в строке 5 в main.py)

продолжить с программой Если я нажму еще раз, от go до 1

1 Ответ

1 голос
/ 19 апреля 2020

Каждый раз, когда нажимается кнопка мыши, вам нужно создать новый DrawEntity объект:

if event.type == pg.MOUSEBUTTONDOWN and event.button == 1:
    DrawEnt.append(DrawEntity())

В draw вы должны добавить Rect к последнему DrawEntity в deque (DrawEnt):

def draw(window):
    if len(DrawEnt) > 0:
        d_Ent = DrawEnt[-1]

        mouseX, mouseY = pg.mouse.get_pos()
        click = pg.mouse.get_pressed()
        if click[0]:
            rect = pg.draw.rect(window, (0, 0, 0), pg.Rect(mouseX, mouseY, 3, 3), 3)
            d_Ent.add(rect)

Вкл. ctrl - z удалить последний элемент из DrawEnt (pop), очистить и снова нарисуйте все оставшиеся элементы:

if event.type == pg.KEYDOWN:
    if event.key == pg.K_z and pg.key.get_mods() & pg.KMOD_LCTRL:
        if len(DrawEnt) > 0:
            DrawEnt.pop()
            window.fill((255, 255, 255))
            for entity in DrawEnt:
                for r in entity.entity:
                    pg.draw.rect(window, (0, 0, 0), r, 3)

См. пример:

class DrawEntity:
    def __init__(self):
        self.entity = []

    def add(self, toAdd):
        self.entity.append(toAdd)

    def remove(self):
        self.entity = []

    def __str__(self):
        return ' '.join(map(str, self.entity))

DrawEnt = deque()

def draw(window):
    if len(DrawEnt) > 0:
        d_Ent = DrawEnt[-1]

        mouseX, mouseY = pg.mouse.get_pos()
        click = pg.mouse.get_pressed()
        if click[0]:
            rect = pg.draw.rect(window, (0, 0, 0), pg.Rect(mouseX, mouseY, 3, 3), 3)
            d_Ent.add(rect)

def main():

    running = True
    window = pg.display.set_mode((640, 480))
    window.fill((255, 255, 255))


    while running:
        clock.tick(3200)

        for event in pg.event.get():
            if event.type == pg.QUIT:
                running = False

            if event.type == pg.MOUSEBUTTONDOWN and event.button == 1:
                d_Ent = DrawEntity()
                DrawEnt.append(DrawEntity())

            if event.type == pg.KEYDOWN:

                if event.key == pg.K_z and pg.key.get_mods() & pg.KMOD_LCTRL:

                    if len(DrawEnt) > 0:
                        DrawEnt.pop()
                        window.fill((255, 255, 255))
                        for entity in DrawEnt:
                            for r in entity.entity:
                                pg.draw.rect(window, (0, 0, 0), r, 3)

            draw(window)

        pg.display.flip()
    #end main loop
    pg.quit()

if __name__ == '__main__':

    pg.init()
    clock = pg.time.Clock()
    main()
...