Delete draw when clicking

Question:

I did a lot of research on how to delete a drawing on the screen after clicking it, and I couldn’t do that

Try1 how to remove draw objects from pygame window?
Try2 How to remove a drawn circle in pygame? (without "going over" other things)

When clicked on the circle it will remove itself, and thus create another circle to be able to click.

import pygame, sys
from pygame.locals import *
from pygame import mixer

pygame.init()
musica = 'circles.mp3'
mixer.music.load(musica)
mixer.music.play()

pygame.init()
screen = pygame.display.set_mode((500, 500))
pygame.display.set_caption("OSU DA DEEP WEB")
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
screen.fill(WHITE)

#posição
width = 500 -30
height = 500 - 30
widthposition = random.randrange(width)
heightposition = random.randrange(width)
#sistema de pontos
points = 0

circle = pygame.draw.circle(screen, (0, 0, 0), (400, 300), 25)

def draw():
    print('CLicked')
    circle = pygame.draw.circle(screen, (0, 0, 0), (400, 300), 25)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
            
    pygame.display.flip()
Asked By: ChickChuck2

||

Answers:

You have to check event to catch when left button was click and then you can draw white background and draw circle

    if event.type == pygame.MOUSEBUTTONDOWN:
        if event.button == pygame.BUTTON_LEFT:
            screen.fill(WHITE)
            draw(screen)

But this still doesn’t check if you clicked on circle.


Minimal working code.

import sys
import random
import pygame

# --- constants ---

WHITE = (255, 255, 255)
BLUE = (0, 0, 255)

WIDTH = 500
HEIGHT = 500

# --- functions ---

def draw(screen):
    print('Clicked')

    x = random.randrange(30, WIDTH-30)
    y = random.randrange(30, HEIGHT-30)

    pygame.draw.circle(screen, (0, 0, 0), (x, y), 25)

# --- main ---

musica = 'circles.mp3'

pygame.init()

pygame.mixer.music.load(musica)
pygame.mixer.music.play()

screen = pygame.display.set_mode((WIDTH, HEIGHT))

screen.fill(WHITE)
draw(screen)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
            
        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == pygame.BUTTON_LEFT:
                screen.fill(WHITE)
                draw(screen)
                
    pygame.display.flip()

draw.circle gives object pygame.Rect() with rectangle area used by circle and you could use it to "check collision" with mouse position

 circle_rect = pygame.draw.circle(...)

 #... code ...

        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == pygame.BUTTON_LEFT:
                if circle_rect.collidepoint(even.pos):
                    screen.fill(WHITE)
                    draw(screen)

and it check position in rectangle area so it works better but not ideal


import sys
import random
import pygame

# --- constants ---

WHITE = (255, 255, 255)
BLUE = (0, 0, 255)

WIDTH = 500
HEIGHT = 500

# --- functions ---

def draw(screen):
    print('Clicked')

    x = random.randrange(30, WIDTH-30)
    y = random.randrange(30, HEIGHT-30)

    circle_rect = pygame.draw.circle(screen, (0, 0, 0), (x, y), 25)
    
    return circle_rect

# --- main ---

musica = 'circles.mp3'

pygame.init()

pygame.mixer.music.load(musica)
pygame.mixer.music.play()

screen = pygame.display.set_mode((WIDTH, HEIGHT))

screen.fill(WHITE)
circle_rect = draw(screen)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
            
        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == pygame.BUTTON_LEFT:
                if circle_rect.collidepoint(event.pos):
                    screen.fill(WHITE)
                    circle_rect = draw(screen)
                
    pygame.display.flip()

There is function to check collicion in cicle area but it works for two pygame.sprite.Sprite, not for single pygame.Rect and mouse position (single point). You would have to convert mouse position and pygame.Rect to pygame.sprite.Sprite but it is to complex for this problem.

Doc: pygame.sprite.collide_circle()

OR you can use pygame.math.Vector2.distance_to() to calculate distance between mouse position and center of circle – it has to be equal or smaller then 25

    if event.type == pygame.MOUSEBUTTONDOWN:
        if event.button == pygame.BUTTON_LEFT:
            pos = pygame.math.Vector2(event.pos)
            if pos.distance_to(circle_rect.center) <= 25:
                screen.fill(WHITE)
                circle_rect = draw(screen)

import sys
import random
import pygame

# --- constants ---

WHITE = (255, 255, 255)
BLUE = (0, 0, 255)

WIDTH = 500
HEIGHT = 500

# --- functions ---

def draw(screen):
    print('Clicked')

    x = random.randrange(30, WIDTH-30)
    y = random.randrange(30, HEIGHT-30)

    circle_rect = pygame.draw.circle(screen, (0, 0, 0), (x, y), 25)
    
    return circle_rect

# --- main ---

musica = 'circles.mp3'

pygame.init()

pygame.mixer.music.load(musica)
pygame.mixer.music.play()

screen = pygame.display.set_mode((WIDTH, HEIGHT))

screen.fill(WHITE)
circle_rect = draw(screen)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
            
        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == pygame.BUTTON_LEFT:
                pos = pygame.math.Vector2(event.pos)
                if pos.distance_to(circle_rect.center) <= 25:
                    screen.fill(WHITE)
                    circle_rect = draw(screen)
                
    pygame.display.flip()

EDIT:

If you will want to add other object which will move then you will have to organize it in different way. In while True in every loop you will have to clear screen and draw again all object. And this needs more changes

enter image description here

import sys
import random
import pygame

# --- constants ---

BLACK = (  0,   0,   0)
WHITE = (255, 255, 255)

RED   = (255,   0,   0)
GREEN = (  0, 255,   0)
BLUE  = (  0,   0, 255)

WIDTH  = 500
HEIGHT = 500

FPS = 25

# --- classes ---

class Circle():

    def __init__(self, x, y, r, color, random=False):
        self.x = x
        self.y = y
        self.r = r
        self.color = color
        
        # vector to check collision
        self.center = pygame.math.Vector2((x, y))
        
        if random:
            self.set_random_position()
        
    def draw(self, screen):
        #pygame.draw.circle(screen, self.color, (self.x, self.y), self.r)   
        pygame.draw.circle(screen, self.color, self.center, self.r)   
        
    def check_collision(self, position):
        return self.center.distance_to(position) <= self.r
            
    def set_random_position(self):
        self.x = random.randint(30, WIDTH-30)   # `randint` better then `randrange`
        self.y = random.randint(30, HEIGHT-30)  # `randint` better then `randrange`

        # vector to check collision        
        self.center = pygame.math.Vector2(self.x, self.y)
                
    def move_random(self):                
        dx = random.randint(-5, 5)  # `randint` better then `randrange`
        dy = random.randint(-5, 5)  # `randint` better then `randrange`
        
        self.x += dx
        self.y += dy
        
        if self.x < self.r:
            self.x = self.r
            
        if self.x > WIDTH-self.r:
            self.x = WIDTH-self.r
            
        if self.y < self.r:
            self.y = self.r
            
        if self.y > HEIGHT-self.r:
            self.y = HEIGHT-self.r
            
        self.center = pygame.math.Vector2(self.x, self.y)

    
# --- functions ---

# ... empty ...

# --- main ---

musica = 'circles.mp3'

pygame.init()
#pygame.mixer.music.load(musica)
#pygame.mixer.music.play()

screen = pygame.display.set_mode((WIDTH, HEIGHT))

# create circle
circle = Circle(0, 0, 25, RED, random=True)

# create other objects and keep on list
others = [Circle(0, 0, 10, GREEN, random=True) for _ in range(100)]
    
clock = pygame.time.Clock()

while True:

    # - events - (without draws)
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
            
        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == pygame.BUTTON_LEFT:
                if circle.check_collision(event.pos):
                    # only change `x,y` without drawing
                    circle.set_random_position()
    
    # - updates - (without draws)
    
    # move other objects from list        
    for item in others:
        item.move_random()
              
    # - draws - (without events and updates)
                      
    # clear screen                      
    screen.fill(WHITE)

    # draw circle
    circle.draw(screen)
        
    # draw other objects from list        
    for item in others:
        item.draw(screen)

    # send on monitor        
    pygame.display.flip()
    
    # - FPS -
    
    # to keep the same speed on different computers (with different CPU speed)
    clock.tick(FPS) 
Answered By: furas
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.