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()