Search code examples
pythonpygamesprite

Pygame - Enemy shoot, problem with groups


Just got problem with a'la Space Invaders game. Just make some upgrades, and wanna to my boss shoot to player centraly from center, not from corner. Game looks now:Game - For mostly time, i got a error:

self.rect.left = bosss.rect.right
AttributeError: 'Group' object has no attribute 'rect'
  • Boss is also moving down and up.

My code from Bullet and Boss:

class PociskBoss(Sprite):

def __init__(self, ai_settings, screen, bosss):

    super(PociskBoss, self).__init__()
    self.ai_settings = ai_settings
    self.screen = screen
    
    self.image = pygame.image.load('C:/Users/Kamil/Pictures/bossbullet.png').convert_alpha()
    self.image = pygame.Surface([12, 4])

    self.rect = self.image.get_rect()
    self.screen_rect = screen.get_rect()
    #self.rect.center = self.screen_rect.midright #this work ofc (screen)
    self.rect.left = bosss.rect.right #GROUP RECT(?)
    
    self.rect.y = random.randrange(0, 50)
    

    rects = pygame.sprite.spritecollide(self, bosss, False)
    for platform in rects:
  
       self.rect.add_internal(platform) #like that?
       self.rect.right = platform.rect.left 

    self.speed_factor = ai_settings.boss_bullet_speed_factor
    self.x = float(self.rect.x)


def update(self, bosss):
    self.x = self.speed_factor
    self.rect.x += self.x
    #self.rect.y += self.y

def draw_pocisk(self):
    self.screen.blit(self.image, self.rect)

class boss(Sprite):

def __init__(self, ai_settings, screen):
    super(boss, self).__init__()
    self.screen = screen
    self.ai_settings = ai_settings



    self.image = pygame.image.load('C:/Users/Kamil/Pictures/boss.png').convert_alpha()
    self.rect = self.image.get_rect()
    self.screen_rect = screen.get_rect()
    self.rect.right = self.screen_rect.right
    #self.center = float(self.rect.centery)
    self.y = self.rect.y
    self.x = self.rect.x
    self.y = float(self.rect.y)
    #self.center = float(self.rect.centery)

def update(self):
  
    self.y -= (self.ai_settings.boss_speed_factor *
                    self.ai_settings.fleet_direction)
    self.rect.y = self.y


def check_edges(self):
    screen_rect = self.screen.get_rect()
    if self.rect.top <= screen_rect.top:
        return True
    elif self.rect.bottom >= screen_rect.bottom:
        return True

def blitme(self):
     self.screen.blit(self.image, self.rect)

Main loop of game:


def game():
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode((ai_settings.SCREEN_WIDTH, ai_settings.SCREEN_HEIGHT))
    clock = pygame.time.Clock()
    pygame.display.set_caption("Shootin")
    koloo = Character(ai_settings, screen)
    # Utworzenie grupy przeznaczonej do przechowywania pocisków.
    new_bullet = Group()
    boss_bullet = Group()
    all_sprites = Group()
    aliens = Group()
    starr = Group()
    deszcz = Group()
    bosss = Group()
    enemyPlayer = Group()
    gf.create_fleet(ai_settings, screen, koloo, aliens)
    #gf.create_fleet_starss(ai_settings, screen, koloo, starr)
    gf.create_fleet_drop(ai_settings, screen, koloo, deszcz)
    gf.create_boss(ai_settings, screen, bosss)
    gf.create_enemy(ai_settings, screen, enemyPlayer)
    clock=pygame.time.Clock()
    FPS = 60
    #GŁÓWNA PĘTLA GRY
    while True:
        gf.check_events(ai_settings, screen, koloo, new_bullet, aliens, boss_bullet, bosss,all_sprites)
        koloo.update()
        new_bullet.update()
        gf.update_bullets(ai_settings, screen, koloo, new_bullet, aliens, bosss, boss_bullet, enemyPlayer)
        boss_bullet.update(bosss)
        gf.boss_bullet_update(ai_settings, screen, bosss, boss_bullet)
        gf.update_rain(ai_settings, deszcz)
        gf.update_aliens(ai_settings, aliens)
        gf.update_boss(ai_settings, bosss)
        gf.update_screen(ai_settings, screen, koloo, bosss, deszcz, aliens, starr, new_bullet, boss_bullet,
                         enemyPlayer, all_sprites, sprites_list, bullet_list)

        clock.tick(FPS)

Solution

  • You can get a list of the Sprties in a pygame.sprite.Group with the method sprites(). The sprites in the list cam be accessed by subscription.
    If bosss contains exactly 1 Sprite, you can get the rect attribute of the Sprite with:

    rect = bosss.sprites()[0].rect