Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pygame精灵重叠问题_Python_Pygame_Sprite_Overlap - Fatal编程技术网

Python Pygame精灵重叠问题

Python Pygame精灵重叠问题,python,pygame,sprite,overlap,Python,Pygame,Sprite,Overlap,我正在自学python,从一个简单的pygame游戏开始。 到目前为止,游戏由一个被其他球追逐的球组成,我创建了一个循环,以避免追逐的球重叠。 循环的工作方式是通过嵌套循环,该循环在包含所有追逐球的列表中移动,然后测量它们之间的距离,如果距离小于球半径,则将其移开。 它似乎大部分时间都有效,但有时球会重叠。我不知道为什么,如果有人能看一下我的代码,给我一个提示,我会欣赏它,我认为错误发生在有3个以上的球,在球员的球(佩洛塔)碰撞的时刻 import pygame, random, math py

我正在自学python,从一个简单的pygame游戏开始。 到目前为止,游戏由一个被其他球追逐的球组成,我创建了一个循环,以避免追逐的球重叠。 循环的工作方式是通过嵌套循环,该循环在包含所有追逐球的列表中移动,然后测量它们之间的距离,如果距离小于球半径,则将其移开。 它似乎大部分时间都有效,但有时球会重叠。我不知道为什么,如果有人能看一下我的代码,给我一个提示,我会欣赏它,我认为错误发生在有3个以上的球,在球员的球(佩洛塔)碰撞的时刻

import pygame, random, math
pygame.init()

ancho , alto = 800 , 600
negro = (0,0,0)
blanco=(255,255,255)
FPS = 60     
velocidad = 7
velocidadnalguis = velocidad - 2
contadordecolisiones = 1
perseguidores =  []

pantalla=pygame.display.set_mode((ancho,alto))
pygame.display.set_caption("un jueguito")
reloj=pygame.time.Clock()

class Pelota(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("pelota.png").convert()
        self.image = pygame.transform.scale(self.image, (30, 30))
        self.image.set_colorkey(negro)
        self.rect = self.image.get_rect()
        self.rect.center = (ancho/2,alto/2) 
        self.speed = 0

    def update(self):
        self.speedx = 0
        self.speedy = 0
        tecla  = pygame.key.get_pressed()
        
        if tecla[pygame.K_LEFT]:
            self.speedx = -velocidad
        
        if tecla[pygame.K_RIGHT]:
            self.speedx = velocidad      

        if tecla[pygame.K_UP]:
            self.speedy = -velocidad

        if tecla[pygame.K_DOWN]:
            self.speedy = velocidad

        self.rect.x += self.speedx
        self.rect.y += self.speedy

        if self.rect.right > ancho:
            self.rect.right = ancho

        if self.rect.bottom > alto:
            self.rect.bottom = alto

        if self.rect.left < 0:
            self.rect.left = 0

        if self.rect.top < 0:
            self.rect.top = 0

pelota = Pelota()

class Perseguidor(pygame.sprite.Sprite):
    def __init__(self,):
        super().__init__()
        self.image = pygame.image.load('nalguis.png').convert()
        self.image = pygame.transform.scale(self.image, (30, 30))
        self.image.set_colorkey(negro)
        self.rect = self.image.get_rect()
        self.velocidad = velocidadnalguis
        self.radius = self.rect.width/2
        self.center = self.rect.center
        self.contadordecolisiones = 1
        self.enerandom = random.randint(0,4)

        if self.enerandom == 0:
             self.rect.center = (random.randrange(-130,-30),random.randrange(-130,alto+130))
        if self.enerandom == 1:
             self.rect.center = (random.randrange(-130,ancho+130),random.randrange(-130,-30))
        if self.enerandom == 2:
             self.rect.center = (random.randrange(ancho+30,ancho+130),random.randrange(-130,alto+130))
        if self.enerandom == 3:
            self.rect.center = (random.randrange(-130,ancho+130),random.randrange(alto+30,alto+130))

    def update(self):
        
        self.pely = pelota.rect.y
        self.pelx = pelota.rect.x
        self.perx = self.rect.x
        self.pery = self.rect.y

        self.dist = math.sqrt(((self.pely-self.pery)**2) + ((self.pelx-self.perx)**2))/velocidadnalguis

        self.angulo = math.atan2(self.pely-self.pery,self.pelx-self.perx)

        self.speedx = 0
        self.speedy = 0
        self.speedx = math.cos(self.angulo) 
        self.speedy = math.sin(self.angulo) 
        
        if self.dist>=1:
            self.rect.x += velocidadnalguis * self.speedx
            self.rect.y += velocidadnalguis * self.speedy

all_sprites = pygame.sprite.Group()
perseguidor_grupo = pygame.sprite.Group()
all_sprites.add(pelota)

terminar=False

while not terminar:
    reloj.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            terminar=True
    
    if len(perseguidor_grupo)<1:
        perseguidor=Perseguidor()
        perseguidor_grupo.add(perseguidor)
        all_sprites.add(perseguidor)

    hit = pygame.sprite.spritecollide(pelota, perseguidor_grupo, True, pygame.sprite.collide_circle)

    if hit: 
        
        if len(perseguidor_grupo)<25:
            perseguidor = Perseguidor()
            perseguidor1 = Perseguidor()
            all_sprites.add(perseguidor, perseguidor1)
            perseguidor_grupo.add(perseguidor, perseguidor1)
            perseguidores.append(perseguidor1)
            perseguidores.append(perseguidor)
            
        else :
            perseguidor = Perseguidor()
            all_sprites.add(perseguidor)
            perseguidor_grupo.add(perseguidor)
            perseguidores.append(perseguidor)
        
    dist=1
    
    for i in  range (len(perseguidores)):
        for j in range(i+1,len(perseguidores)):
            perseguidoresxy = [perseguidores[i].rect.centerx,perseguidores[i].rect.centery]
            dist=math.hypot(perseguidores[i].rect.centerx - perseguidores[j].rect.centerx , perseguidores[i].rect.centery - perseguidores[j].rect.centery)
                            
            if dist <= perseguidor.radius*2:
                if perseguidores[i].rect.centerx < perseguidores[j].rect.centerx:
                    perseguidores[i].rect.centerx -= 3
                if perseguidores[i].rect.centery < perseguidores[j].rect.centery:
                    perseguidores[i].rect.centery -= 3
                if perseguidores[i].rect.centerx > perseguidores[j].rect.centerx:
                    perseguidores[i].rect.centerx += 3  
                if perseguidores[i].rect.centery > perseguidores[j].rect.centery:   
                    perseguidores[i].rect.centery -= 3
                                        
    if len(perseguidores)> len(perseguidor_grupo):
        del perseguidores [0]       
    
    all_sprites.update()
    pantalla .fill(negro)
    all_sprites.draw(pantalla)
    
    pygame.display.flip()
    
pygame.quit()
quit()
导入pygame、random、math
pygame.init()
安科,中音=800600
黑人=(0,0,0)
布兰科=(255255)
FPS=60
velocidad=7
Velocidandnalguis=velocidad-2
Contadordescolisiones=1
珀尔斯圭多雷斯=[]
pantalla=pygame.display.set_模式((安科,中音))
pygame.display.set_标题(“un jueguito”)
reloj=pygame.time.Clock()
Pelota类(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.image.load(“pelota.png”).convert()
self.image=pygame.transform.scale(self.image,(30,30))
self.image.set_colorkey(黑人)
self.rect=self.image.get_rect()
self.rect.center=(主播/2,副播/2)
自身速度=0
def更新(自我):
self.speedx=0
self.speeded=0
tecla=pygame.key.get_pressed()
如果tecla[pygame.K_左]:
self.speedx=-velocidad
如果tecla[pygame.K_RIGHT]:
self.speedx=velocidad
如果tecla[pygame.K_UP]:
self.speedy=-velocidad
如果tecla[pygame.K_DOWN]:
self.speedy=velocidad
self.rect.x+=self.speedx
self.rect.y+=自加速
如果self.rect.right>ancho:
self.rect.right=ancho
如果self.rect.bottom>alto:
self.rect.bottom=alto
如果self.rect.left<0:
self.rect.left=0
如果self.rect.top<0:
self.rect.top=0
佩洛塔=佩洛塔()
类Perseguidor(pygame.sprite.sprite):
定义初始值(self,):
super()。\uuuu init\uuuuu()
self.image=pygame.image.load('nalguis.png').convert()
self.image=pygame.transform.scale(self.image,(30,30))
self.image.set_colorkey(黑人)
self.rect=self.image.get_rect()
self.velocidad=velocidadnalguis
self.radius=self.rect.width/2
self.center=self.rect.center
self.contadorDeclisions=1
self.enerandom=random.randint(0,4)
如果self.enerandom==0:
self.rect.center=(random.randrange(-130,-30),random.randrange(-130,alto+130))
如果self.enerandom==1:
self.rect.center=(random.randrange(-130,ancho+130),random.randrange(-130,-30))
如果self.enerandom==2:
self.rect.center=(random.randrange(ancho+30,ancho+130),random.randrange(-130,alto+130))
如果self.enerandom==3:
self.rect.center=(random.randrange(-130,ancho+130),random.randrange(alto+30,alto+130))
def更新(自我):
self.pely=pelota.rect.y
self.pelx=pelota.rect.x
self.perx=self.rect.x
self.pery=self.rect.y
self.dist=math.sqrt(((self.pely-self.pery)**2)+((self.pelx-self.perx)**2))/velocidadnalguis
self.angulo=math.atan2(self.pely-self.pery,self.pelx-self.perx)
self.speedx=0
self.speeded=0
self.speedx=math.cos(self.angulo)
self.speedy=math.sin(self.angulo)
如果self.dist>=1:
self.rect.x+=velocidadnalguis*self.speedx
self.rect.y+=velocidandnalguis*self.speeded
all_sprites=pygame.sprite.Group()
perseguidor_grupo=pygame.sprite.Group()
所有精灵。添加(佩洛塔)
terminar=False
虽然不是终点:
重新启动勾号(FPS)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
terminar=真
如果len(perseguidor_grupo)len(perseguidor_grupo):
德尔珀尔塞吉多雷斯[0]
所有精灵更新()
pantalla.fill(黑人)
所有精灵。绘制(潘塔拉)
pygame.display.flip()
pygame.quit()
退出
[…]然后测量它们之间的距离,如果距离小于球半径,则将其移开。它似乎大部分时间都有效,但有时球会重叠。[……]

当然,在移动球时,你只考虑2个球。 这意味着,如果你把一个球从一个球上移开,你可能会直接把它移到另一个球上。 您需要检查在您移动球的位置是否没有其他球

确保球在产卵时不会重叠:

请求的球=1
虽然不是终点:
# [...]
hit=pygame.sprite.spritecollide(pelota,perseguidor_grupo,True,pygame.sprite.collide_circle)
如果击中:
请求的球=最小值(25,请求的球+1)
如果len(perseguidor_grupo)<要求的球:
perseguidor=perseguidor()
如果不是pygame.sprite.spritecollide(perseguidor,perseguidor_grupo,True,pygame.sprite.collide_circle):
所有精灵。添加(perseguidor)
perseguidor_grupo.add(perseguidor)
perseguidores.append(perseguidor)
仅在球的新位置尚未被球占据时移动球:

类Perseguidor(pygame.sprite.sprite): # [...] def更新(自我): # [...] old_rect=self.rect.copy() 如果self.dist>=1: self.rect.x+=velocidadnalguis*self.speedx self.rect.y+=velocidandnalguis*self.speeded hit=pygame.sprite.spritecollide(self,perseguidor\u grupo,False,pygame.sprite.collide\u circle) 如果len(hit)>1:#最后是1,因为球会击中自己