下面是我的circle课程:
class circle:
def __init__(self):
self.x = random.randint(10, SW-10)
self.y = random.randint(10, SH-10)
self.radius = random.randint(5, 50)
self.color = (random.randint(1, 255),random.randint(1, 255), random.randint(1, 255))
def draw(self):
pygame.draw.circle(d, (self.color), (self.x, self.y), self.radius)
def move(self):
self.x = X
self.y = Y
在这个circle类中,我通过执行user = circle()
创建了一个用户循环,通过执行user = circle()
创建了20个随机循环
circles = list()
for i in range(20):
circles.append(circle())`
这是我的验尸报告:
def circle_collision(cir1, cir2):
a = abs(cir2.x - cir1.x)**2
b = abs(cir2.y - cir1.y)**2
distance = math.sqrt((a) + (b))
if distance < cir1.radius + cir2.radius:
return True
else:
return False
我的问题是我不能将列表circles
作为冲突检测的参数之一,但我还希望程序在user = circle()
循环与任何其他随机循环发生冲突时进行检测。
最初,我尝试这样做来解决我的问题:
def foo():
for i in range(len(circles)):
result = circles[i]
return result
我希望它能返回列表中的每一项,以便在while True
循环中调用冲突检测,如下所示:
collided = circle_collision(user, foo())
但是foo
函数只返回一个值,因此碰撞检测只能检测一个圆。我该怎么做才能让collision_detection
检查每个圆?有没有办法让函数返回多个值?还是我必须完全改变我的逻辑?谢谢你的帮助。你知道吗
这是我的整个程序供参考。你知道吗
import pygame, math, os, random
os.environ["SDL_VIDEO_CENTERED"]="1"
pygame.init()
win = pygame.display
win.set_caption("A lot a circles")
SW = 1200
SH = 600
d = win.set_mode((SW, SH))
pygame.time.Clock().tick(60)
def write(size, text, x, y):
font = pygame.font.SysFont("Aeiral", size)
text = font.render(text, True, (0, 0, 0))
d.blit(text, (x, y))
def circle_collision(cir1, cir2):
a = abs(cir2.x - cir1.x)**2
b = abs(cir2.y - cir1.y)**2
distance = math.sqrt((a) + (b))
if distance < cir1.radius + cir2.radius:
return True
else:
return False
class circle:
def __init__(self):
self.x = random.randint(10, SW-10)
self.y = random.randint(10, SH-10)
self.radius = random.randint(5, 50)
self.color = (random.randint(1, 255),random.randint(1, 255), random.randint(1, 255))
def draw(self):
pygame.draw.circle(d, (self.color), (self.x, self.y), self.radius)
def move(self):
self.x = X
self.y = Y
user = circle()
def foo():
for i in range(len(circles)):
result = circles[i]
return result
circles = list()
for i in range(20):
circles.append(circle())
mainloop = True
while mainloop:
X, Y = pygame.mouse.get_pos()
d.fill((98, 98, 98))
for i in circles:
i.draw()
user.draw()
user.move()
write(user.radius, "USER", user.x - user.radius + 2, user.y - 7)
collided = circle_collision(user, foo())
if collided == True:
user.color = (255, 0, 0)
if collided == False:
user.color = (255, 255, 255)
for event in pygame.event.get():
if event.type == pygame.QUIT:
mainloop = False
win.flip()
pygame.quit()
quit()
必须添加另一个函数,该函数计算圆是否与列表中的圆碰撞,并使用碰撞的圆创建新列表:
甚至更短:
测试} 元素:
collidelist
是否有^{如果只想计算是否有任何圆发生碰撞,则根本不需要列表和单独的函数:
是的,您可以返回一个列表。而且,不需要执行
for i in range(len(circles))
;您可以更轻松地编写for circle in circles
。而且,在这种情况下,没有理由循环circles
列表来返回该列表的副本。确保你没有重置每个圆的颜色,如果发生任何碰撞,你只想设置颜色,如果你每次通过循环设置颜色,你最终只会使用上一个循环的碰撞。尝试:相关问题 更多 >
编程相关推荐