Python Pygame-单击时删除绘图

Python Pygame-单击时删除绘图,python,pygame,Python,Pygame,我做了很多研究,研究如何在点击后删除屏幕上的图形,但我做不到 Try1 Try2 单击圆时,它将删除自身,从而创建另一个可以单击的圆 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 = pygam

我做了很多研究,研究如何在点击后删除屏幕上的图形,但我做不到

Try1 Try2

单击圆时,它将删除自身,从而创建另一个可以单击的圆

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

您必须选中
事件
以捕捉单击左键的时间,然后您可以绘制白色背景并绘制圆圈

    if event.type == pygame.MOUSEBUTTONDOWN:
        if event.button == pygame.BUTTON_LEFT:
            screen.fill(WHITE)
            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)

    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
为对象
pygame.Rect()
提供圆形使用的矩形区域,您可以使用它来“检查”鼠标位置的碰撞

 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)
并且它检查矩形区域的位置,所以它工作得更好,但并不理想



有功能检查cicle区域中的碰撞,但它适用于两个
pygame.sprite.sprite
,而不适用于单个
pygame.Rect
和鼠标位置(单点)。您必须将鼠标位置和
pygame.Rect
转换为
pygame.sprite.sprite
,但这个问题非常复杂

文件:

或者您可以使用计算鼠标位置和圆心之间的距离-它必须等于或小于
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)

首先,您必须使用
event.type==pygame.MOUSEBUTTONDOWN
检查是否单击,然后使用
event.button==0
检查是否为左键,然后清除屏幕并绘制新的圆圈。您不必运行
pygame.init()
两次。谢谢,这对我帮助很大,现在,我只需要当他点击圆圈来改变位置时,我的代码已经改变了圆圈位置,当你点击
屏幕上的任何位置时。我创建的代码使用
矩形区域
附近的
圆形
来检查鼠标点击。我正在使用
圆形区域
制作示例。我添加了使用
pygame.math的代码
现在这正是我想要的,谢谢你的帮助,我和来这里的人我添加了更多对象的示例-因为这些对象一直在移动,所以需要不同的代码组织。
    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()
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)