Leo X
Leo X

Reputation: 3

Attribute error in Python Crash course alien invasion project

How to fix this error:

AttributeError: 'AlienInvasion' object has no attribute '_check_events'

This traceback happens whenever I try to run invasion.py

invasion.py:

import sys

import pygame

from settings import Settings
from ship import Ship

class AlienInvasion:

        def __init__(self):

                pygame.init()
                self.settings = Settings()

                self.screen = pygame.display.set_mode(
                        (self.settings.screen_width, self.settings.screen_height))

                pygame.display.set_caption("Aliens is invading!")

                self.ship = Ship(self)

                self.bg_color = (230, 230, 230)

        def run_game(self):

                while True:

                        self._check_events()
                        self.ship.update()
                        self._update_screen()

                def _check_events(self):

                        for event in pygame.event.get():
                                if event.type == pygame.QUIT:
                                        sys.exit()
                                elif event.type == pygame.KEYDOWN:
                                        self._check_keydown_events(event)
                                elif event.type == pygame.KEYUP:
                                        self._check_keyup_events(event)


                                def _check_keydown_events(self, event):
                                        if event.key == pygame.K_RIGHT:
                                                self.ship.moving_right = True
                                        elif event.key == pygame.K_LEFT:
                                                self.ship.moving_left = True

                                def _check_keyup_events(self,event):
                                        if event.key == pygame.K_RIGHT:
                                                self.ship.moving_right = False
                                        elif event.key == pygame.K_LEFT:
                                                self.ship.moving_left = False
                def _update_screen(self):

                        self.screen.fill(self.settings.bg_color)
                        self.ship.blitme()
                        pygame.display.flip()


if __name__ == '__main__':

        ai = AlienInvasion()
        ai.run_game()

settings.py:

class Settings:


        def __init__(self):

                self.screen_width = 1200
                self.screen_height = 800
                self.bg_color = (230, 230, 230)
                self.ship_speed = 1.5

Ship.py:

import pygame

class Ship:


        def __init__(self, ai_game):

                self.screen = ai_game.screen
                self.screen_rect = ai_game.screen.get_rect()


                self.image = pygame.image.load('images/shipdos.bmp')
                self.rect = self.image.get_rect()

                self.rect.midbottom = self.screen_rect.midbottom

                self.x = float(self.rect.x)

                self.moving_right = False

                self.moving_left = False

        def update(self):

                if self.moving_right and self.rect.right < self.screen_rect.right:
                        self.x += self.settings.ship_speed
                if self.moving_left and self.rect.left > 0:
                        self.x-= self.settings.ship_speed

                self.rect.x = self.x
        def blitme(self):

                self.screen.blit(self.image, self.rect)

Upvotes: 0

Views: 326

Answers (1)

koegl
koegl

Reputation: 584

It seems like your entire code base is incorrectly indented, also the function _update_screen(), which means it is defined inside _check_events() - if you remove one level of indentation of _update_screen() it should run without any errors. I would recommend using an IDE like PyCharm in order to help to catch those kind of errors. This is how your files should look like:

invasion.py

import sys

import pygame

from settings import Settings
from Ship import Ship


class AlienInvasion:
    def __init__(self):

        pygame.init()
        self.settings = Settings()

        self.screen = pygame.display.set_mode(
            (self.settings.screen_width, self.settings.screen_height))

        pygame.display.set_caption("Aliens is invading!")

        self.ship = Ship(self)

        self.bg_color = (230, 230, 230)

    def run_game(self):

        while True:
            self._check_events()
            self.ship.update()
            self._update_screen()

    def _check_events(self):

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)

    def _check_keydown_events(self, event):
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True

    def _check_keyup_events(self, event):
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False

    def _update_screen(self):

        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        pygame.display.flip()


if __name__ == '__main__':

    ai = AlienInvasion()
    ai.run_game()

settings.py

class Settings:

    def __init__(self):

        self.screen_width = 1200
        self.screen_height = 800
        self.bg_color = (230, 230, 230)
        self.ship_speed = 1.5

Ship.py

import pygame


class Ship:

    def __init__(self, ai_game):

        self.screen = ai_game.screen
        self.screen_rect = ai_game.screen.get_rect()
    
        self.image = pygame.image.load('images/shipdos.bmp')
        self.rect = self.image.get_rect()
    
        self.rect.midbottom = self.screen_rect.midbottom
    
        self.x = float(self.rect.x)
    
        self.moving_right = False
    
        self.moving_left = False

    def update(self):

        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.x += self.settings.ship_speed
        if self.moving_left and self.rect.left > 0:
            self.x -= self.settings.ship_speed
        self.rect.x = self.x
        
    def blitme(self):
        self.screen.blit(self.image, self.rect)

Upvotes: 3

Related Questions