Feb-23-2021, 02:11 PM
I'm trying to produce a grid of stars in a pygame window but when I run the code:
import sys import pygame # contains functionality to make a game from settings import Settings from star import Star class StarrySky: """Initialise a grid of stars on the screen.""" def __init__(self): """Initialise the game and create game resources.""" pygame.init() # initialise the background settings # which the game needs to work properly self.settings = Settings() self.screen = pygame.display.set_mode((0,0), pygame.FULLSCREEN) # tells pygame to figure out a window size to fill the screen self.settings.screen_width = self.screen.get_rect().width self.settings.screen_height = self.screen.get_rect().height # updates the screen settings after fullscreen has been created pygame.display.set_caption("Starry Sky") self.star = Star(self) self.stars = pygame.sprite.Group() self.create_grid() def run_game(self): """Start the main loop for the game.""" while True: self.check_events() self.update_screen() def check_events(self): # Watch for keyboard and mouse events. for event in pygame.event.get(): if event.type == pygame.K_q: sys.exit() def create_grid(self): """Create the grid of stars.""" # create a star and find the number of stars in a row. # spacing between stars equal to 1 star width. star = Star(self) star_width, star_height = star.rect.size available_space_x = self.settings.screen_width - (2 * star_width) number_stars_x = available_space_x // (2 * star_width) # Determine the number of rows of aliens that fit on the screen. available_space_y = (self.settings.screen_height - (3 * star_height) ) number_rows = available_space_y // (2 * star_height) # Create the full sky of stars. for row_number in range(number_rows): # Create the first row of stars. for star_number in range(number_stars_x): # Create a star and place it in the row. self._create_star(star_number,row_number) def _create_star(self, row_number, star_number): star = Star(self) star_width = star.rect.width star.x = star_width + 2 * star_width * star_number star.rect.x = star.x star.rect.y = star.rect.height + 2 * star.rect.height * row_number self.stars.add(star) def update_screen(self): """Update images on the screenand flip to the new screen.""" # redraw the screen during each pass through the loop self.screen.fill(self.settings.bg_color) self.stars.draw(self.screen) pygame.display.flip() if __name__ == "__main__": # make a game instance and run the game ai = StarrySky() ai.run_game()I get this error:
Error: File "C:\Users\djwil\Documents\python\python crash course\lib\site-packages\pygame\sprite.py", line 441, in add
self.add(*sprite)
TypeError: pygame.sprite.AbstractGroup.add() argument after * must be an iterable, not Star
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "c:\Users\djwil\Documents\python\python crash course\Projects\Alien invasion\star_sky.py", line 77, in <module>
ai = StarrySky()
File "c:\Users\djwil\Documents\python\python crash course\Projects\Alien invasion\star_sky.py", line 25, in __init__
self.create_grid()
File "c:\Users\djwil\Documents\python\python crash course\Projects\Alien invasion\star_sky.py", line 58, in create_grid
self._create_star(star_number,row_number)
File "c:\Users\djwil\Documents\python\python crash course\Projects\Alien invasion\star_sky.py", line 66, in _create_star
self.stars.add(star)
File "C:\Users\djwil\Documents\python\python crash course\lib\site-packages\pygame\sprite.py", line 454, in add
sprite.add_internal(self)
AttributeError: 'Star' object has no attribute 'add_internal'
Can someone help me with this error, I'm confused as I don't have 454 lines of code but that is where the error is reported.