[PyGame] object has no attribute 'add_internal' - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: Game Development (https://python-forum.io/forum-11.html) +--- Thread: [PyGame] object has no attribute 'add_internal' (/thread-32639.html) |
object has no attribute 'add_internal' - djwilson0495 - Feb-23-2021 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: 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.
RE: object has no attribute 'add_internal' - michael1789 - Feb-23-2021 (Feb-23-2021, 02:11 PM)djwilson0495 Wrote: 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. Look and see how the error is from "pygame\sprite.py" not your game. You try to add an object to a sprite group, which can only accept pygame sprite objects. Make sure your sprites are initialized:class Star(pygame.sprite.Sprite): pygame.sprite.Sprite.__init__(self): RE: object has no attribute 'add_internal' - djwilson0495 - Feb-24-2021 Thanks for your response. I edited my code for the Star class to this: import pygame from pygame.sprite import Sprite class Star(pygame.sprite.Sprite): pygame.sprite.Sprite.__init__(self): def __init__(self,ai_game): """Initialise the star and its starting position.""" super().__init__() self.screen = ai_game.screen # Load the star image and set its rect attribute self.image = pygame.image.load(r'C:\Users\djwil\Documents\python\python crash course\Projects\Alien invasion\Images\star.bmp') self.rect = self.image.get_rect() # Start each star near the top left of the screen. self.rect.x = self.rect.width self.rect.y = self.rect.height # Store the stars exact horizontal position self.x = float(self.rect.x)I then got this error: I then tried this :import pygame from pygame.sprite import Sprite class Star(pygame.sprite.Sprite): pygame.sprite.Sprite.__init__(self) def __init__(self,ai_game): """Initialise the star and its starting position.""" super().__init__() self.screen = ai_game.screen # Load the star image and set its rect attribute self.image = pygame.image.load(r'C:\Users\djwil\Documents\python\python crash course\Projects\Alien invasion\Images\star.bmp') self.rect = self.image.get_rect() # Start each star near the top left of the screen. self.rect.x = self.rect.width self.rect.y = self.rect.height # Store the stars exact horizontal position self.x = float(self.rect.x)I then got this error: Could you offer any further advice?
RE: object has no attribute 'add_internal' - ndc85430 - Feb-24-2021 It's pretty self-explanatory, you try to use a variable called self that isn't defined. But really, what are you trying to do with line 5? You're already calling the superclass constructor on line 9.
RE: object has no attribute 'add_internal' - michael1789 - Feb-24-2021 My bad. class Star(pygame.sprite.Sprite): def __init__(self,ai_game): super().__init__() OR pygame.sprite.Sprite.__init__(self)You can also get a two in one with: def __init__(self, game): self.groups = game.your_sprite_group#, another group, another group........ pg.sprite.Sprite.__init__(self, self.groups) game is wherever you create the sprite from.
RE: object has no attribute 'add_internal' - djwilson0495 - Feb-25-2021 I have the lines: def __init__(self,ai_game): """Initialise the star and its starting position.""" super().__init__()In my code above so I'm not sure why this is happening. RE: object has no attribute 'add_internal' - michael1789 - Feb-25-2021 I've never used super__init__ , but you maybe have two sets of empty brackets. Maybe super(self, ai_game).__init__(self, ai_game) or something like that. One of those needs the self and/or ai_game as arguments.... I think.
RE: object has no attribute 'add_internal' - nilamo - Feb-26-2021 We don't need to guess: >>> class Base: ... def __init__(self, arg): ... print(f"Base class __init__: {arg}") ... >>> class Child(Base): ... def __init__(self): ... print("child __init__") ... super().__init__(42) ... >>> x = Child() child __init__ Base class __init__: 42Anyway, what's your code currently look like? What's the error you're currently getting? There's been a few changes so far, and I've lost track of where we are. |