gpt4 book ai didi

python - 如何从屏幕上删除单个 pygame 绘图?

转载 作者:行者123 更新时间:2023-12-05 01:10:36 25 4
gpt4 key购买 nike

当大圆圈接触小圆圈时,我希望它接触的小圆圈从屏幕上消失。但是,我无法弄清楚你是如何在 pygame 中删除单个绘图的。我该如何解决这个问题? pygame 有内置这个功能吗?

from pygame import *
import random as rd
import math as m

init()
screen = display.set_mode((800, 600))

p_1_x = 200
p_1_y = 200
p_1_change_x = 0
p_1_change_y = 0

def p_1(x, y):
player_1 = draw.circle(screen, (0, 0, 0), (x, y), 15)

def pick_up(x, y, xx, yy):
distance = m.sqrt(m.pow(xx - x, 2) + m.pow(yy - y, 2))
if distance < 19:
# I think the code to delete should go here
pass

dots = []
locations = []

for i in range(5):
x = rd.randint(100, 700)
y = rd.randint(100, 500)
locations.append((x, y))

while True:
screen.fill((255, 255, 255))
for events in event.get():
if events.type == QUIT:
quit()
if events.type == KEYDOWN:
if events.key == K_RIGHT:
p_1_change_x = 1
if events.key == K_LEFT:
p_1_change_x = -1
if events.key == K_UP:
p_1_change_y += 1
if events.key == K_DOWN:
p_1_change_y -= 1

if events.type == KEYUP:
if events.key == K_RIGHT or K_LEFT or K_UP or K_DOWN:
p_1_change_x = 0
p_1_change_y = 0

p_1_x += p_1_change_x
p_1_y -= p_1_change_y
for i, locate in enumerate(locations):
dot = draw.circle(screen, (0, 0, 0), locate, 5)
dots.append(dot)
for l in enumerate(locate):
pick_up(p_1_x, p_1_y, locate[0], locate[1])

p_1(p_1_x, p_1_y)
display.update()

最佳答案

您的代码非常困惑且难以维护,首先我为 Balls & Dots 创建了 2 个类。我通过 pygame.Rect.colliderect 检测碰撞,首先我制作 2 个矩形,然后像这样检查碰撞:

def pick_up(ball, dot):
ball_rect = Rect( ball.x - ball.SIZE , ball.y - ball.SIZE , ball.SIZE*2, ball.SIZE*2)
dot_rect = Rect( dot.x - dot.SIZE , dot.y - dot.SIZE , dot.SIZE*2, dot.SIZE*2)
if ball_rect.colliderect(dot_rect):
return True
return False

如果检测到碰撞,我会在 while 循环中将其从点数组中删除:

for dot in dots:
if pick_up(ball, dot): # if dot in range ball
dots.remove(dot)
dot.draw()

这是完整的来源:

from pygame import *
import random as rd

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
NUMBER_OF_DOTS = 5

class Ball():
SIZE = 15
def __init__(self, x, y):
self.x = x
self.y = y

def draw(self):
draw.circle(screen, (0, 0, 0), (self.x, self.y), Ball.SIZE)
def move(self, vx, vy):
self.x += vx
self.y += vy

class Dot():
SIZE = 5
def __init__(self, x, y):
self.x = x
self.y = y

def draw(self):
draw.circle(screen, (0, 0, 0), (self.x, self.y), Dot.SIZE)


def pick_up(ball, dot):
ball_rect = Rect( ball.x - ball.SIZE , ball.y - ball.SIZE , ball.SIZE*2, ball.SIZE*2)
dot_rect = Rect( dot.x - dot.SIZE , dot.y - dot.SIZE , dot.SIZE*2, dot.SIZE*2)
if ball_rect.colliderect(dot_rect):
return True
return False



init()
screen = display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

dots = []
ball = Ball(200,200)

# generate dots
for i in range(NUMBER_OF_DOTS):
x = rd.randint(100, 700)
y = rd.randint(100, 500)
dots.append(Dot(x,y))

# the main game loop
while True:
screen.fill((255, 255, 255))
keys=key.get_pressed()

for events in event.get():
keys=key.get_pressed()
if events.type == QUIT:
quit()

if keys[K_RIGHT]:
ball.move(+1,0)
if keys[K_LEFT]:
ball.move(-1,0)
if keys[K_UP]:
ball.move(0,-1)
if keys[K_DOWN]:
ball.move(0,+1)

for dot in dots:
dot.draw()

if pick_up(ball, dot):
dots.remove(dot)

ball.draw()
display.update()
time.delay(1) # Speed down

更新1:

PyGame 矩形碰撞 http://www.pygame.org/docs/ref/rect.html#pygame.Rect.colliderect

更新2:

我在github上做了一个repo,做了一些修改,
点是彩色的,新点的颜色是随机的,每当吃到一个点时球就会变大。 shot

https://github.com/peymanmajidi/Ball-And-Dots-Game__Pygame

关于python - 如何从屏幕上删除单个 pygame 绘图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63985871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com