0

I'm trying to make a simple game using pygame. I want my character to be able to shoot bullets. I made a class called Bullet and give it the attribute bullet_update so the bullets can move across the screen.

I made a group of bullets and tried to store each bullet in it. But I get an error message that says the following:

Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\EDX\python\Rocket\Rocket.py", line 92, in run_game
    bullets.bullet_update()
AttributeError: 'Group' object has no attribute 'bullet_update'

It seems like for some reason I can't access to the bullet_update method and I don't know why. Also the bullets are stored correctly in the group so my guess is that the Bullet class is correctly being used. What am I missing?

import sys
import pygame
from pygame.sprite import *

class Display_setting():
    def __init__(self):
        self.width = 800
        self.height = 600
        self.background = (255, 255, 255)
        self.rk_speed_factor = 1.5
        #adding bullets
        self.bullet_speed_factor = 1
        self.bullet_width = 3
        self.bullet_height = 15
        self.bullet_color = 255, 0, 0
    
 class Rocket_man():
    def __init__(self, Display_setting, display_screen):
        self.display_screen = display_screen
        self.Display_setting = Display_setting
        self.image = pygame.image.load('rocket_man.bmp')
        self.rect = self.image.get_rect()
        self.display_screen_rect = display_screen.get_rect()
        self.rect.centery = self.display_screen_rect.centery
        self.center = float(self.rect.centery)
        self.moving_up = False
        self.moving_down = False

    def update(self):
        if self.moving_up and self.rect.top > 0:
            self.rect.centery -= self.Display_setting.rk_speed_factor
        if self.moving_down and self.rect.bottom < self.display_screen_rect.bottom:
            self.rect.centery += self.Display_setting.rk_speed_factor
        
    def blitme(self):
        self.display_screen.blit(self. image, self.rect)

class Bullet(Sprite):
    def __init__(self,
                 Display_setting,
                 display_screen,
                 rk):
        super(Bullet, self).__init__()
        self.display_screen = display_screen
        self.rect = pygame.Rect(0, 0,
                                Display_setting.bullet_width,
                                Display_setting.bullet_height)
        self.rect.centerx = rk.rect.centerx
        self.rect.top = rk.rect.centery
        self.x = float(self.rect.x)
        self.color = Display_setting.bullet_color
        self.speed_factor = Display_setting.bullet_speed_factor
    
    def bullet_update(self):
        self.x += self.speed_factor
        self.rect.x = self.x

    def draw_bullet(self):
        pygame.draw.rect(self.display_screen,
                         self.color,
                         self.rect)

def run_game():
    pygame.init()
    display_screen = pygame.display.set_mode((Display_setting().width,
                                              Display_setting().height))
    pygame.display.set_caption("Rocket Man")
    rk = Rocket_man(Display_setting(), display_screen)
            
    bullets = Group()

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    rk.moving_up = True
                elif event.key == pygame.K_DOWN:
                    rk.moving_down = True
                elif event.key == pygame.K_SPACE:
                    new_bullet = Bullet(Display_setting(),
                                        display_screen,
                                        rk)
                    bullets.add(new_bullet)
                
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_UP:
                    rk.moving_up = False
                elif event.key == pygame.K_DOWN:
                    rk.moving_down = False
        rk.update()
        bullets.bullet_update() 
        display_screen.fill(Display_setting().background)
        for bullet in bullets.sprites():
            bullet.draw_bullet()
        rk.blitme()
        pygame.display.flip()
    
run_game()
Tomerikoo
  • 18,379
  • 16
  • 47
  • 61
  • 3
    `bullets` refers to the group of bullets, but the `bullet_update` method is on each individual bullet... – Jiří Baum Mar 06 '22 at 10:27
  • 4
    Did you mean `for bullet in bullets: bullet.update_bullet()`? (just how you did with `draw_bullet`... Why did you think here it would be different?) – Tomerikoo Mar 06 '22 at 10:30

0 Answers0