gpt4 book ai didi

python - pygame 中的碰撞检测无法正常工作

转载 作者:行者123 更新时间:2023-12-01 05:02:23 24 4
gpt4 key购买 nike

我有一段代码,应该在屏幕上放置 1000 个正方形,没有重叠。

但是当我运行它时,我只是得到一堆方 block ,其中一些方 block 重叠,知道我哪里出错了吗?

import time, pygame, ctypes, random

class Block(pygame.sprite.Sprite):
def __init__(self, color, width, height):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface([width, height])
self.image.fill(color)
self.rect = self.image.get_rect()

white = (255,255,255)
black = (0, 0, 0)
user32 = ctypes.windll.user32
sw = user32.GetSystemMetrics(0)
sh = user32.GetSystemMetrics(1)

Bloqs = {}
#Bloq atributes: Position (upper left), Size, Color, Genetics

pygame.init()
all_sprites_list = pygame.sprite.Group()

def Collision(bloq):
global all_sprites_list
hit = pygame.sprite.spritecollide(bloq, all_sprites_list, True)
if len(hit) == 0:
return False
if len(hit) > 0:
return True

def InitializeSim():
global Bloqs
global white
global black
global sw
global sh
global all_sprites_list

size = sw, sh
screen = pygame.display.set_mode(size, pygame.FULLSCREEN )
screen.fill(white)
count = 0
while count < 1000:
size = 10
pos = random.seed()
posx = random.randint(0, sw-size)
posy = random.randint(0, sh-size)
#pygame.draw.rect(screen, color, (x,y,width,height), thickness)
CurrentBloq = "bloq" + str(count)
Bloqs[CurrentBloq]={}
Bloqs[CurrentBloq]["position"] = (sw, sh)
bloq = Block(black, size, size)
bloq.rect.x = posx
bloq.rect.y = posy
Bloqs[CurrentBloq]["sprite"] = bloq
all_sprites_list.add(bloq)
all_sprites_list.draw(screen)
pygame.display.update()
while Collision(bloq) == True:
all_sprites_list.remove(bloq)
posx = random.randint(0, sw-size)
posy = random.randint(0, sh-size)
bloq.rect.x = posx
bloq.rect.y = posy
all_sprites_list.add(bloq)
all_sprites_list.draw(screen)
pygame.display.update()
count += 1

InitializeSim()
time.sleep(5)
pygame.quit()

最佳答案

对于您想要做的事情来说,您的代码似乎相当复杂......

将其作为一个整体来处理,但是对您来说感觉很自然,但是在生成 block 时,我会遵循以下更多内容:

for i in range(numberofblocksyouwant):

while true:
create a block at a random x,y pos
if block collides with any existing blocks:
remove the block you just created
else:
break

对于您想要的每个 block ,此方法将不断重新创建每个 block ,直到它选择一个不会与任何其他 block 碰撞的随机 x,y。

但是,如果您的 block 填满了屏幕并使执行此操作变得不可能,则嵌套的 while 循环将永远不会结束。

希望有帮助,如果没有意义请告诉我。

关于python - pygame 中的碰撞检测无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25818693/

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