Удаление рисунков без переопределения предыдущих в Pygame - Python - PullRequest
1 голос
/ 19 апреля 2020

Я пытаюсь создать приложение для рисования, я получил помощь из этого предыдущего поста, который я открыл:

Предыдущий вопрос, который я отправил о том, как реализовать Ctrl Z.

Однако теперь я попадаю в другую проблему: когда я нажимаю Ctrl Z, он удаляет то, что я нарисовал (последний, так как он работает как стек), но если вы рисуете 2 фигуры друг над другом, нажмите Ctrl Z он удаляет некоторые части предыдущей фигуры, например:

И затем нажатие Ctrl Z оставляет меня с:

enter image description here

Как это исправить, чтобы не оставить там пустое место?

мой код:

from collections import deque
from DrawEntity import DrawEntity

import pygame as pg


WHITE = (255, 255, 255)
BLACK =  (0, 0, 0)
SCREEN_SIZE = (1100, 800)
DrawEnt = deque()
brush = 3


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]:
            circle = pg.draw.circle(window, BLACK, (mouseX, mouseY), brush)
            d_Ent.add(circle)





def main():
    global brush
    running = True
    window = pg.display.set_mode(SCREEN_SIZE)
    window.fill(WHITE)


    while running:
        clock.tick(1800)

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

            if event.type == pg.MOUSEBUTTONDOWN:
                if event.button == 1:
                    DrawEnt.append(DrawEntity())
                elif event.button == 4:
                    brush += 1 if brush < 30 else  0
                elif event.button == 5:
                    brush -= 1 if brush > 0 else 0



            if event.type == pg.KEYDOWN:

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


                    if len(DrawEnt) > 0:
                        ent = DrawEnt.pop()
                        for entity in ent.entity:
                                pg.draw.circle(window, WHITE, entity.center , entity.width)




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

1 Ответ

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

Вы НЕ ОТКАЧАЕТЕ от чертежа. Что вы на самом деле делаете, это рисует белый круг поверх текущего рисунка.

Кроме того, возвращаемое значение pygame.draw.circle() - это не какой-то объект круга, это объект pygame.Rect, который окружает круг.

Когда вы рисуете объект, вы должны сохранить цвет, положение и bru sh (d_Ent.add((BLACK, (mouseX, mouseY), brush))) при рисовании:

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]:
            circle = pg.draw.circle(window, BLACK, (mouseX, mouseY), brush)
            d_Ent.add((BLACK, (mouseX, mouseY), brush))

Когда вы хотите "ОТМЕНИТЬ" некоторые детали чертежа, вам нужно очистить весь экран и перерисовать все оставшиеся объекты:

def main():
    # [...]

    while running:
        # [...]

        for event in pg.event.get():
            # [...]

            if event.type == pg.KEYDOWN:

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

                    if len(DrawEnt) > 0:
                        ent = DrawEnt.pop()

                        window.fill((255, 255, 255))         
                        for drawent in DrawEnt:
                            for entity in drawent.entity:
                                pg.draw.circle(window, *entity)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...