title: add() argument after * must be a sequence, not Settings
body: <p>I'm trying to build a game that moves a ship left and right with the arrow keys and fires bullets when the spacebar is pressed. When I press the spacebar my game crashes and this error is shown:
  Traceback (most recent call last):</p>
  
  <pre><code>TypeError: add() argument after * must be a sequence, not Settings
  </code></pre>
  
  <p>Here's my code:</p>
  
  <pre><code>class Settings():
      """A class to store all settings for Alien Invasion."""
  
      def __init__(self):
          """Initialize the game's settings."""
          # Screen settings
          self.screen_width = 800
          self.screen_height = 480
          self.bg_color = (230, 230, 230)
  
          # Ship settings 
          self.ship_speed_factor = 1.5
  
          # Bullet settings
          self.bullet_speed_factor = 1
          self.bullet_width = 3
          self.bullet_height = 15
          self.bullet_color = 60, 60, 60
  
  import pygame
  from pygame.sprite import Sprite
  
  class Bullet(Sprite):
      """A class to manage bullets fired from the ship"""
  
      def _init__(self, ai_settings, screen, ship):
          """Create a bullet object at the ship's current position."""
          super(Bullet, self).__init__()
          self.screen = screen
  
          # Create a bullet rect at (0, 0) and then set correct position.
          self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height)
          self.rect.centerx = ship.rect.centerx
          self.rect.top = ship.rect.top
  
          # Store the bullet's position as a decimal value.
          self.y = float(self.rect.y)
  
          self.color = ai_settings.bullet_color
          self.speed_factor = ai_settings.bullet_speed_factor
  
      def update(self):
          """Move the bullet up the screen"""
          # Update the decimal position of the bullet.
          self.y -= self.speed_factor
          # Update the rect position.
          self.rect.y = self.y
  
      def draw_bullet(self):
          """Draw the bullet to the screen."""
          pygame.draw.rect(self.screen, self.color, self.rect)
  
  import sys
  
  import pygame
  
  from bullet import Bullet
  
  def check_keydown_events(event, ai_settings, screen, ship, bullets):
      """Respond to keypresses."""
      if event.key == pygame.K_RIGHT:
          ship.moving_right = True
      elif event.key == pygame.K_LEFT:
          ship.moving_left = True
      elif event.key == pygame.K_SPACE:
          # Create a new bullet and add it to the bullets group.
          new_bullet = Bullet(ai_settings, screen, ship)
          bullets.add(new_bullet)
  
  def check_keyup_events(event, ship):
      """Respind to key releases."""
      if event.key == pygame.K_RIGHT:
          ship.moving_right = False
      elif event.key == pygame.K_LEFT:
          ship.moving_left = False
  
  
  def check_events(ai_settings, screen, ship, bullets):
      """Respond to keypresses and mouse events."""
      for event in pygame.event.get():
          if event.type == pygame.QUIT:
              sys.exit()
  
          elif event.type == pygame.KEYDOWN:
              check_keydown_events(event, ai_settings, screen, ship, bullets)
          elif event.type == pygame.KEYUP:
              check_keyup_events(event, ship)
  </code></pre>
  
  <p>And finally the main file:</p>
  
  <pre><code>import pygame
  from pygame.sprite import Group
  
  from settings import Settings
  from ship import Ship
  import game_functions as gf
  
  def run_game():
      # Initialize pygame, settings, and screen object.
      pygame.init()
      ai_settings = Settings()
      screen = pygame.display.set_mode(
          (ai_settings.screen_width, ai_settings.screen_height))
      pygame.display.set_caption("Alien Invasion")
  
      # Make a ship.
      ship = Ship(ai_settings, screen)
      # Make a group to store bullets in.
      bullets = Group()
  
      # Start the main loop for the game.
      while True:
  
          # Watch the keyboard and mouse events.
          gf.check_events(ai_settings, screen, ship, bullets)
          ship.update()
          bullets.update()
          gf.update_screen(ai_settings, screen, ship, bullets)
  
  run_game()
  </code></pre>
  
  <p>The trace: </p>
  
  <pre><code>Traceback (most recent call last):
    File "C:\Users\martin\Desktop\python_work\alien_invasion\alien_invasion.py", line 30, in &lt;module&gt;
      run_game()
    File "C:\Users\martin\Desktop\python_work\alien_invasion\alien_invasion.py", line 25, in run_game
      gf.check_events(ai_settings, screen, ship, bullets)
    File "C:\Users\martin\Desktop\python_work\alien_invasion\game_functions.py", line 33, in check_events
      check_keydown_events(event, ai_settings, screen, ship, bullets)
    File "C:\Users\martin\Desktop\python_work\alien_invasion\game_functions.py", line 15, in check_keydown_events
      new_bullet = Bullet(ai_settings, screen, ship)
    File "C:\Users\martin\Anaconda3\lib\site-packages\pygame\sprite.py", line 124, in __init__
      self.add(*groups)
    File "C:\Users\martin\Anaconda3\lib\site-packages\pygame\sprite.py", line 142, in add
      self.add(*group)
  TypeError: add() argument after * must be a sequence, not Settings
  </code></pre>