From cb83deca0cb9939f50c9d90e7705ea387dce2f96 Mon Sep 17 00:00:00 2001 From: EggMan Date: Tue, 23 Apr 2024 20:14:24 -0400 Subject: [PATCH] test init --- .idea/.gitignore | 8 + .idea/CNSA-266-FP.iml | 10 + .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 4 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + Alien.py | 100 +++++ AlienBullet.py | 68 +++ Bullet.py | 50 +++ Main.py | 401 ++++++++++++++++++ assets/Sprites/Bullets/B1.png | Bin 0 -> 1126 bytes assets/Sprites/Bullets/B2.png | Bin 0 -> 1126 bytes assets/Sprites/Bullets/B3.png | Bin 0 -> 1128 bytes assets/Sprites/Bullets/B4.png | Bin 0 -> 1127 bytes assets/Sprites/Bullets/C1.png | Bin 0 -> 1128 bytes assets/Sprites/Bullets/C2.png | Bin 0 -> 1128 bytes assets/Sprites/Bullets/C3.png | Bin 0 -> 1131 bytes assets/Sprites/Bullets/C4.png | Bin 0 -> 1126 bytes assets/Sprites/Bullets/D1.png | Bin 0 -> 1124 bytes assets/Sprites/Bullets/D2.png | Bin 0 -> 1130 bytes assets/Sprites/Bullets/D3.png | Bin 0 -> 1124 bytes assets/Sprites/Bullets/D4.png | Bin 0 -> 1129 bytes assets/Sprites/ColorFull.png | Bin 0 -> 1177 bytes assets/Sprites/ColorOrig.png | Bin 0 -> 1149 bytes assets/Sprites/Enemy/AlienDeath.png | Bin 0 -> 1145 bytes assets/Sprites/Enemy/LA1.png | Bin 0 -> 1147 bytes assets/Sprites/Enemy/LA2.png | Bin 0 -> 1147 bytes assets/Sprites/Enemy/MA1.png | Bin 0 -> 1151 bytes assets/Sprites/Enemy/MA2.png | Bin 0 -> 1149 bytes assets/Sprites/Enemy/SA1.png | Bin 0 -> 1151 bytes assets/Sprites/Enemy/SA2.png | Bin 0 -> 1148 bytes assets/Sprites/House.png | Bin 0 -> 1157 bytes assets/Sprites/Player/BulletDeath.png | Bin 0 -> 1137 bytes assets/Sprites/Player/Hit.png | Bin 0 -> 1140 bytes assets/Sprites/Player/Player.png | Bin 0 -> 1136 bytes assets/Sprites/Player/PlayerBullet.png | Bin 0 -> 1122 bytes assets/Sprites/Player/PlayerDeath1.png | Bin 0 -> 1150 bytes assets/Sprites/Player/PlayerDeath2.png | Bin 0 -> 1156 bytes assets/Sprites/Ship.png | Bin 0 -> 1147 bytes assets/Sprites/ShipDeath.png | Bin 0 -> 1167 bytes assets/Sprites/Sprites.png | Bin 0 -> 2493 bytes assets/space_invaders_taito_cop.png | Bin 0 -> 823 bytes test.py | 0 43 files changed, 661 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/CNSA-266-FP.iml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 Alien.py create mode 100644 AlienBullet.py create mode 100644 Bullet.py create mode 100644 Main.py create mode 100644 assets/Sprites/Bullets/B1.png create mode 100644 assets/Sprites/Bullets/B2.png create mode 100644 assets/Sprites/Bullets/B3.png create mode 100644 assets/Sprites/Bullets/B4.png create mode 100644 assets/Sprites/Bullets/C1.png create mode 100644 assets/Sprites/Bullets/C2.png create mode 100644 assets/Sprites/Bullets/C3.png create mode 100644 assets/Sprites/Bullets/C4.png create mode 100644 assets/Sprites/Bullets/D1.png create mode 100644 assets/Sprites/Bullets/D2.png create mode 100644 assets/Sprites/Bullets/D3.png create mode 100644 assets/Sprites/Bullets/D4.png create mode 100644 assets/Sprites/ColorFull.png create mode 100644 assets/Sprites/ColorOrig.png create mode 100644 assets/Sprites/Enemy/AlienDeath.png create mode 100644 assets/Sprites/Enemy/LA1.png create mode 100644 assets/Sprites/Enemy/LA2.png create mode 100644 assets/Sprites/Enemy/MA1.png create mode 100644 assets/Sprites/Enemy/MA2.png create mode 100644 assets/Sprites/Enemy/SA1.png create mode 100644 assets/Sprites/Enemy/SA2.png create mode 100644 assets/Sprites/House.png create mode 100644 assets/Sprites/Player/BulletDeath.png create mode 100644 assets/Sprites/Player/Hit.png create mode 100644 assets/Sprites/Player/Player.png create mode 100644 assets/Sprites/Player/PlayerBullet.png create mode 100644 assets/Sprites/Player/PlayerDeath1.png create mode 100644 assets/Sprites/Player/PlayerDeath2.png create mode 100644 assets/Sprites/Ship.png create mode 100644 assets/Sprites/ShipDeath.png create mode 100644 assets/Sprites/Sprites.png create mode 100644 assets/space_invaders_taito_cop.png create mode 100644 test.py diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/CNSA-266-FP.iml b/.idea/CNSA-266-FP.iml new file mode 100644 index 0000000..2c80e12 --- /dev/null +++ b/.idea/CNSA-266-FP.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..fdd4e11 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..66ec151 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Alien.py b/Alien.py new file mode 100644 index 0000000..5c38731 --- /dev/null +++ b/Alien.py @@ -0,0 +1,100 @@ +import arcade +import random +from AlienBullet import AlienBullet +class Alien(arcade.Sprite): + + def __init__(self, x, y, SCREEN_SCALE, DEBUG, AlienType): + super().__init__() + + self.center_x = x * SCREEN_SCALE + self.center_y = y * SCREEN_SCALE + self.scScale = SCREEN_SCALE + self.deBuggin = DEBUG + self.alienType = AlienType + self.alien_sprite = None + self.wait = 0 + self.isAlive = True + self.bullet = None + self.sizeX = 0 + self.sizeY = 0 + + if self.alienType == "LA": + self.sizeX = 6 * self.scScale + self.sizeY = 4 * self.scScale + self.image_source = "assets/Sprites/Enemy/LA1.png" + if self.deBuggin: + print(str(self.image_source)) + if self.alienType == "MA": + self.sizeX = 5 * self.scScale + self.sizeY = 4 * self.scScale + self.image_source = "assets/Sprites/Enemy/MA1.png" + if self.deBuggin: + print(str(self.image_source)) + if self.alienType == "SA": + self.sizeX = 4 * self.scScale + self.sizeY = 4 * self.scScale + self.image_source = "assets/Sprites/Enemy/SA1.png" + if self.deBuggin: + print(str(self.image_source)) + + self.alien_sprite = arcade.Sprite(self.image_source, self.scScale) + + def update(self, x, sign, movedown): + + if self.alienType == "LA" and self.wait > 0: + if self.image_source == "assets/Sprites/Enemy/LA1.png": + self.image_source = "assets/Sprites/Enemy/LA2.png" + self.alien_sprite = arcade.Sprite(self.image_source, self.scScale) + else: + self.image_source = "assets/Sprites/Enemy/LA1.png" + self.alien_sprite = arcade.Sprite(self.image_source, self.scScale) + if self.alienType == "MA" and self.wait > 0: + if self.image_source == "assets/Sprites/Enemy/MA1.png": + self.image_source = "assets/Sprites/Enemy/MA2.png" + self.alien_sprite = arcade.Sprite(self.image_source, self.scScale) + else: + self.image_source = "assets/Sprites/Enemy/MA1.png" + self.alien_sprite = arcade.Sprite(self.image_source, self.scScale) + if self.alienType == "SA" and self.wait > 0: + if self.image_source == "assets/Sprites/Enemy/SA1.png": + self.image_source = "assets/Sprites/Enemy/SA2.png" + self.alien_sprite = arcade.Sprite(self.image_source, self.scScale) + else: + self.image_source = "assets/Sprites/Enemy/SA1.png" + self.alien_sprite = arcade.Sprite(self.image_source, self.scScale) + self.wait = 1 + if movedown: + self.center_y -= 8 * self.scScale + if x: + self.center_x += 2*self.scScale*sign + self.alien_sprite.center_x = self.center_x + self.alien_sprite.center_y = self.center_y + + def getSizeX(self): + return self.sizeX + def getSizeY(self): + return self.sizeY + + def checkBullet(self): + try: + if self.bullet != None: + if self.bullet.getY() < -50: + self.bullet = None + if self.deBuggin: + print("Bullet Killed") + except Exception as e: + pass + def spawnBullet(self): + self.bullet = AlienBullet(self.scScale, self.deBuggin, self.center_x, self.center_y) + + def getX(self): + return self.center_x + def getY(self): + return self.center_y + + def getType(self): + return self.alienType + + + + diff --git a/AlienBullet.py b/AlienBullet.py new file mode 100644 index 0000000..9fad02e --- /dev/null +++ b/AlienBullet.py @@ -0,0 +1,68 @@ +import arcade +import random +BULLET_SPEED = 2 + +class AlienBullet(arcade.Sprite): + + def __init__(self, SCREEN_SCALE, DEBUG, x, y): + super().__init__() + self.isAlive = True + self.deBuggin = DEBUG + self.scScale = SCREEN_SCALE + self.i = 0 + self.image_source = None + if self.deBuggin: + print("Alien Bullet Spawning") + self.type = random.randint(1,3) + if self.type == 1: + self.image_souce = "assets/Sprites/Bullets/B1.png" + if self.type == 2: + self.image_souce = "assets/Sprites/Bullets/C1.png" + if self.type == 3: + self.image_souce = "assets/Sprites/Bullets/D1.png" + self.bullet_sprite = arcade.Sprite(self.image_source, self.scScale) + self.center_x = x + self.center_y = y + self.count = 0 + + def update(self): + self.count += 1 + self.center_y -= BULLET_SPEED*self.scScale + # if self.deBuggin: + # print(str(self.center_y)) + if self.count == 4: + if self.type == 1: + if self.image_souce == "assets/Sprites/Bullets/B1.png": + self.image_souce = "assets/Sprites/Bullets/B2.png" + elif self.image_souce == "assets/Sprites/Bullets/B2.png": + self.image_souce = "assets/Sprites/Bullets/B3.png" + elif self.image_souce == "assets/Sprites/Bullets/B3.png": + self.image_souce = "assets/Sprites/Bullets/B4.png" + elif self.image_souce == "assets/Sprites/Bullets/B4.png": + self.image_souce = "assets/Sprites/Bullets/B1.png" + if self.type == 2: + if self.image_souce == "assets/Sprites/Bullets/C1.png": + self.image_souce = "assets/Sprites/Bullets/C2.png" + elif self.image_souce == "assets/Sprites/Bullets/C2.png": + self.image_souce = "assets/Sprites/Bullets/C3.png" + elif self.image_souce == "assets/Sprites/Bullets/C3.png": + self.image_souce = "assets/Sprites/Bullets/C4.png" + elif self.image_souce == "assets/Sprites/Bullets/C4.png": + self.image_souce = "assets/Sprites/Bullets/C1.png" + if self.type == 3: + if self.image_souce == "assets/Sprites/Bullets/D1.png": + self.image_souce = "assets/Sprites/Bullets/D2.png" + elif self.image_souce == "assets/Sprites/Bullets/D2.png": + self.image_souce = "assets/Sprites/Bullets/D3.png" + elif self.image_souce == "assets/Sprites/Bullets/D3.png": + self.image_souce = "assets/Sprites/Bullets/D4.png" + elif self.image_souce == "assets/Sprites/Bullets/D4.png": + self.image_souce = "assets/Sprites/Bullets/D1.png" + self.count = 0 + self.bullet_sprite = arcade.Sprite(self.image_souce, self.scScale) + self.bullet_sprite.center_x = self.center_x + self.bullet_sprite.center_y = self.center_y + def getX(self): + return self.center_x + def getY(self): + return self.center_y \ No newline at end of file diff --git a/Bullet.py b/Bullet.py new file mode 100644 index 0000000..1c2674e --- /dev/null +++ b/Bullet.py @@ -0,0 +1,50 @@ +import arcade + + +BULLET_SPEED = 4 +class Bullet(arcade.Sprite): + + def __init__(self, SCREEN_SCALE, DEBUG, x, y): + super().__init__() + self.isAlive = True + self.deBuggin = DEBUG + self.scScale = SCREEN_SCALE + self.i = 0 + if self.deBuggin: + print("Bullet Initializing") + + image_source = "assets/Sprites/Player/PlayerBullet.png" + self.bullet_sprite = arcade.Sprite(image_source, self.scScale) + self.center_x = x + (1 * self.scScale) / 2 + self.center_y = y + 4 * self.scScale + + def update(self): + self.center_y = self.center_y + (BULLET_SPEED * self.scScale) + self.bullet_sprite.center_y = self.center_y + self.bullet_sprite.center_x = self.center_x + # self.bullet_sprite.draw(pixelated=True) + + if self.deBuggin: + self.i += 1 + if self.i >= 10: + self.i = 0 + print("Bullet Updating | X: " + str(self.center_x) + " | Y: " + str(self.center_y) + " ||| SX: " + str(self.bullet_sprite.center_x) + " | SY: " + str(self.bullet_sprite.center_y)) + + + def getX(self): + return self.center_x + def getY(self): + return self.center_y + def death(self): + + if self.deBuggin: + print("Bullet Deathing") + self.isAlive = False + self.data = None + self.__del__() + + def __del__(self): + self.isAlive = False + if self.deBuggin: + print("Bullet Dead") + diff --git a/Main.py b/Main.py new file mode 100644 index 0000000..69bea30 --- /dev/null +++ b/Main.py @@ -0,0 +1,401 @@ +import random +import sys +import time +import arcade + +from Bullet import Bullet +from Alien import Alien + +DEBUG = True +SLOW = False + +SLOW_SPEED = 0.01 + +SCREEN_SCALE = 3 + +SCREEN_HEIGHT = 256 * SCREEN_SCALE +SCREEN_WIDTH = 224 * SCREEN_SCALE +SCREEN_TITLE = "Space Invaders" + +PLAYER_SPEED = 1 + +PLAYER_BOUNDS = 32 +ALIEN_BOUNDS = 16 + + + +class MyGame(arcade.Window): + """ Main application class""" + + def __init__(self): + super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) + + self.activeBullet = False + + + self.wall_list = None + self.player_list = None + + self.Won = False + self.Score = 0 + + self.bullet = None + self.aliens = [[Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien], + [Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien], + [Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien], + [Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien], + [Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien, Alien]] + + self.alienCounterY = 4 + self.alienCounterX = 0 + self.alienChangeDir = 0 + self.alienCurrentDir = -1 + self.movedown = False + + self.player_sprite = None + + self.movePlayer = 0 + if DEBUG: + arcade.set_background_color(arcade.color.BLUE) + else: + arcade.set_background_color(arcade.csscolor.BLACK) + + self.i = 0 + + def setup(self): + """start / restart game""" + + self.scene = arcade.Scene() + + self.scene.add_sprite_list("Players") + self.scene.add_sprite_list("Walls", use_spatial_hash=True) + + self.player_list = arcade.SpriteList() + self.wall_list = arcade.SpriteList(use_spatial_hash=True) + self.rend = 0 + self.lives = 3 + self.level = 0 + # self.overlay_color = (0,255,0,128) + self.player_sprite_death = None + self.somethingalsi = True + + # set up the player + image_source = "assets/Sprites/Player/Player.png" + self.player_sprite = arcade.Sprite(image_source, SCREEN_SCALE) + self.player_sprite.center_x = 32 * SCREEN_SCALE + self.player_sprite.center_y = (32 + 4) * SCREEN_SCALE + self.player_list.append(self.player_sprite) + + + # Create Left Boundry + if DEBUG == True: + wall = arcade.SpriteSolidColor(1, SCREEN_HEIGHT, arcade.color.RED) + else: + wall = arcade.SpriteSolidColor(0, SCREEN_HEIGHT, arcade.color.BLACK) + wall.center_x = (PLAYER_BOUNDS - 8) * SCREEN_SCALE + wall.center_y = SCREEN_HEIGHT / 2 + self.wall_list.append(wall) + # Create Right Boundry + if DEBUG == True: + wall = arcade.SpriteSolidColor(1, SCREEN_HEIGHT, arcade.color.RED) + else: + wall = arcade.SpriteSolidColor(0, SCREEN_HEIGHT, arcade.color.BLACK) + wall.center_x = (224 - PLAYER_BOUNDS + 8) * SCREEN_SCALE + wall.center_y = SCREEN_HEIGHT / 2 + self.wall_list.append(wall) + + if DEBUG == True: + wall = arcade.SpriteSolidColor(1, SCREEN_HEIGHT, arcade.color.GREEN) + else: + wall = arcade.SpriteSolidColor(0, SCREEN_HEIGHT, arcade.color.BLACK) + wall.center_x = (ALIEN_BOUNDS - 8) * SCREEN_SCALE + wall.center_y = SCREEN_HEIGHT / 2 + self.wall_list.append(wall) + # Create Right Boundry + if DEBUG == True: + wall = arcade.SpriteSolidColor(1, SCREEN_HEIGHT, arcade.color.GREEN) + else: + wall = arcade.SpriteSolidColor(0, SCREEN_HEIGHT, arcade.color.BLACK) + wall.center_x = (224 - ALIEN_BOUNDS + 8) * SCREEN_SCALE + wall.center_y = SCREEN_HEIGHT / 2 + self.wall_list.append(wall) + + # Aliens + for b in range (0,5,1): + for a in range(0, 11, 1): + if b == 0: + alienType = "SA" + elif b == 1 or b == 2: + alienType = "MA" + else: + alienType = "LA" + aliena = Alien(16 * (a+1) + 16, 200 - (16 * (b+1)), SCREEN_SCALE, DEBUG,alienType) + # aliena.update(None,None,None) + self.aliens[b][a] = aliena + + def collisionCheck(self, x1, y1, x2, y2, rx, ry): + if abs(x1 - x2) <= rx and abs(y1 - y2) <= ry: + return True + else: + return False + + def on_key_press(self, key, modifiers): + + if key == arcade.key.SPACE and self.activeBullet == False: + self.bullet = Bullet(SCREEN_SCALE, DEBUG, self.player_sprite.center_x, self.player_sprite.center_y) + self.activeBullet = True + if key == arcade.key.LEFT: + self.movePlayer = -PLAYER_SPEED * SCREEN_SCALE + elif key == arcade.key.RIGHT: + self.movePlayer = PLAYER_SPEED * SCREEN_SCALE + + + def on_key_release(self, key, modifiers): + if key == arcade.key.LEFT and self.movePlayer == -PLAYER_SPEED * SCREEN_SCALE: + self.movePlayer = 0 + elif key == arcade.key.RIGHT and self.movePlayer == PLAYER_SPEED * SCREEN_SCALE: + self.movePlayer = 0 + + def on_draw(self): + self.clear() + + # try: + # self.player_sprite_death.draw(pixelated=True) + # except Exception as e: + # pass + + # Render player bullet if it exists + try: + self.bullet.bullet_sprite.draw(pixelated=True) + except Exception as e: + if DEBUG: + self.rend += 1 + if self.rend >= 20: + print(e) + self.rend = 0 + + # Render alien bullets if they exist and render aliens + try: + for alienx in self.aliens: + for alien in alienx: + try: + alien.bullet.bullet_sprite.draw(pixelated=True) + except Exception as e: + pass + alien.alien_sprite.draw(pixelated=True) + except Exception as e: + pass + + + + self.player_list.draw(pixelated=True) + self.wall_list.draw(pixelated=True) + def KillBullet(self): + self.bullet = None + self.activeBullet = False + + def respawn(self): + for alienRow in self.aliens: + for alien in alienRow: + alien.bullet = None + self.player_sprite.center_x = 32*SCREEN_SCALE + time.sleep(2) + def death(self): + if self.lives > 0: + self.somethingalsi = False + else: + if DEBUG: + print(str(self.Score)) + sys.exit() + + def update(self, delta_time): + + if self.somethingalsi: + # Picking numbers to possibly spawn an alien bullet + testx = random.randint(0, 5 + 100 - self.level) + testy = random.randint(0, 11 + 100 - self.level) + + + # Checking if player bullet is off-screen, if so, set bullet to None, else, update bullet + try: + if self.bullet.getY() >= SCREEN_HEIGHT: + self.KillBullet() + + if self.bullet != None: + self.bullet.update() + + except Exception as e: + self.error = e + + # Run the update method for each alien's bullet that exists in the self.aliens list + try: + for alienx in self.aliens: + for alien in alienx: + try: + alien.bullet.update() + except Exception as e: + pass + except Exception as e: + pass + + # Checks if the alien's bullet is below -50, if so, set alien's bullet to None + # Checks to see if testx and testy == self.alien[testx],[testy]. if yes: spawn new alien bullet + try: + for indexx, alienx in enumerate(self.aliens): + for index, alien in enumerate(alienx): + try: + alien.checkBullet() + if indexx == testx and index == testy: + alien.spawnBullet() + except Exception as e: + pass + except Exception as e: + pass + + if self.alienCounterY < 0: + # Reset the X and Y counter variables + self.alienCounterY = len(self.aliens) - 1 + self.alienCounterX = 0 + # Alien Movement + if self.Won == False: + #Left - Right Movement + + if self.alienCounterX <= len(self.aliens[self.alienCounterY]) - 1: + x = self.aliens[self.alienCounterY][self.alienCounterX].getX() + + # Right Alien Bound Check + if x <= ALIEN_BOUNDS * SCREEN_SCALE + SCREEN_SCALE: + self.alienChangeDir = 1 + # Left Alien Bound Check + elif x >= SCREEN_WIDTH - ALIEN_BOUNDS * SCREEN_SCALE - SCREEN_SCALE: + self.alienChangeDir = -1 + + # Update current alien + self.aliens[self.alienCounterY][self.alienCounterX].update(True, self.alienCurrentDir, self.movedown) + + # Move the X counter variable to the next alien + self.alienCounterX += 1 + + # If an exeption is reached, it is likely that the X counter is out of bounds + # which means we need to go to the next row of aliens + else: + + # Reset X counter + self.alienCounterX = 0 + + # Decrease Y counter so that we move to the next row of aliens + self.alienCounterY -= 1 + + # if we go outside the minimum index of our aliens list, which means we reached the + # very end of the list of aliens, raise an exception so that the except block runs + if self.alienCounterY < 0: + + # Reset the X and Y counter variables + self.alienCounterY = len(self.aliens) - 1 + self.alienCounterX = 0 + + # if the aliens are at the right alien bound + if self.alienChangeDir == -1: + + if self.alienChangeDir != self.alienCurrentDir: + self.movedown = True + else: + self.movedown = False + self.alienCurrentDir = -1 + + # Reset alienChangeDir + self.alienChangeDir = 0 + + # if the aliens are at the left alien bound + elif self.alienChangeDir == 1: + if self.alienChangeDir != self.alienCurrentDir: + self.movedown = True + else: + self.movedown = False + self.alienCurrentDir = 1 + self.alienChangeDir = 0 + else: + self.alienChangeDir = 0 + # if DEBUG: + # print(e) + if len(self.aliens) == 0: + self.Won = True + # except Exception as e: + # if DEBUG: + # print(e) + + print("You Won!") + sys.exit() + # Check to see if any aliens are colliding with a player's bullet + for alienRow in self.aliens: + if alienRow == []: + self.aliens.remove(alienRow) + for alien in alienRow: + try: + # Check for alien colliding with player bullet + if self.collisionCheck(alien.getX(), alien.getY(), self.bullet.getX(), self.bullet.getY(), + alien.getSizeX(), alien.getSizeY()): + + # For Scoring Points + type = alien.getType() + if type == "SA": + self.Score += 40 + elif type == "MA": + self.Score += 20 + elif type == "LA": + self.Score += 10 + alienRow.remove(alien) + if DEBUG: + print(str(self.Score)) + + # Kill player bullet that hit the alien + self.KillBullet() + except Exception as e: + pass + try: + # Check for player colliding with alien bullet + if self.collisionCheck(self.player_sprite.center_x, self.player_sprite.center_y, alien.bullet.getX(), alien.bullet.getY(), + 7 * SCREEN_SCALE, 5 * SCREEN_SCALE): + + self.lives -= 1 + + self.death() + + except Exception as e: + pass + + + if self.player_sprite.center_x >= 193 * SCREEN_SCALE and self.movePlayer == PLAYER_SPEED * SCREEN_SCALE: + self.movePlayer = 0 + + elif self.player_sprite.center_x <= (PLAYER_BOUNDS - 2) * SCREEN_SCALE and self.movePlayer == -PLAYER_SPEED * SCREEN_SCALE: + self.movePlayer = 0 + + else: + self.player_sprite.center_x += self.movePlayer + + + if SLOW: + time.sleep(SLOW_SPEED) + + else: + test = False + if test: + self.player_sprite = arcade.Sprite("assets/Sprites/Player/PlayerDeath1.png", SCREEN_SCALE) + self.player_list.draw() + else: + + self.player_sprite = arcade.Sprite("assets/Sprites/Player/PlayerDeath2.png", SCREEN_SCALE) + self.player_list.draw() + + + +def main(): + window = MyGame() + window.setup() + arcade.run() + +if __name__ == "__main__": + main() + + diff --git a/assets/Sprites/Bullets/B1.png b/assets/Sprites/Bullets/B1.png new file mode 100644 index 0000000000000000000000000000000000000000..afd0609b7c7b490684a017ec540b032cd3ed6402 GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y+0V25#xB3C8Q<=`r0nVkxCHc7w3=&h56B6#6 zV_@;&LflrzF189feup? z#}a#njUHAr&YoaOQg^%|q)=Ar>Bu=@Epw8(xJcs-2XW&MBCRZz%s1^EwmDb{S#x&I zofI{PC*?T9&5IoSpPo-o*zn`ffde*ziqlMb8xyOonVXNuw#+!?#K!h7jIAwqx?s}$ zzX$)NidctCiV9>B`gplKMZ-hKtL1ms$r~I=`Z_%;xEPXb4K*)n%2tAW8Q>G*3iO?W zg98J@e;{P|{~ttvDKHZ#ISNKYU^s^W$I~`Jp#L}vJR*x382Ao>Fr%o3R|8N`qQo_# zBsf2{_5KgQu&X%Q~loCID9Ne&hfE literal 0 HcmV?d00001 diff --git a/assets/Sprites/Bullets/B2.png b/assets/Sprites/Bullets/B2.png new file mode 100644 index 0000000000000000000000000000000000000000..425a6a43ab158f72e2fc210b67ea71969980ebae GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y+0V25#xB3C8Q<=`r0nVkxCHc7w3=&h56B6#6 zV_@;&LflrzF189feup? z#}a#njUHAr&YoaOQg^%|q)=Ar>Bu=@Epw8(xJcs-2XW&MBCRZz%s1^EwmDb{S#x&I zofI{PC*?T9&5IoSpPo-o*zn`ffde*ziqlMb8xyOonVXNuw#+!?#K!h7jIAwqx?s}$ zzX$)NidctCiV9>B`gplKMZ-hKtL1ms$r~I=`Z_%;xEPXb4K*)n%2tAW8Q>G*3iO?W zg98J@e;{P|{~ttvDKHZ#ISNKYU^s^W$I~`Jp#L}vJR*x382Ao>Fr%o3R|8N`qQo_# zBsf2LflrzF189feup? z#}a#njUHAr&YoaOQg^%|q)=Ar>Bu=@Epw8(xJcs-2XW&MBCRZz%s1^EwmDb{S#x&I zofI{PC*?T9&5IoSpPo-o*zn`ffde*ziqlMb8xyOonVXNuw#+!?#K!h7jIAwqx?s}$ zzX$)NidctCiV9>B`gplKMZ-hKtL1ms$r~I=`Z_%;xEPXb4K*)n%2tAW8Q>G*3iO?W zg98J@e;{P|{~ttvDKHZ#ISNKYU^s^W$I~`Jp#L}vJR*x382Ao>Fr%o3R|8N`qQo_# zBsf2LflrzF189feup? z#}a#njUHAr&YoaOQg^%|q)=Ar>Bu=@Epw8(xJcs-2XW&MBCRZz%s1^EwmDb{S#x&I zofI{PC*?T9&5IoSpPo-o*zn`ffde*ziqlMb8xyOonVXNuw#+!?#K!h7jIAwqx?s}$ zzX$)NidctCiV9>B`gplKMZ-hKtL1ms$r~I=`Z_%;xEPXb4K*)n%2tAW8Q>G*3iO?W zg98J@e;{P|{~ttvDKHZ#ISNKYU^s^W$I~`Jp#L}vJR*x382Ao>Fr%o3R|8N`qQo_# zBsf2LflrzF189feup? z#}a#njUHAr&YoaOQg^%|q)=Ar>Bu=@Epw8(xJcs-2XW&MBCRZz%s1^EwmDb{S#x&I zofI{PC*?T9&5IoSpPo-o*zn`ffde*ziqlMb8xyOonVXNuw#+!?#K!h7jIAwqx?s}$ zzX$)NidctCiV9>B`gplKMZ-hKtL1ms$r~I=`Z_%;xEPXb4K*)n%2tAW8Q>G*3iO?W zg98J@e;{P|{~ttvDKHZ#ISNKYU^s^W$I~`Jp#L}vJR*x382Ao>Fr%o3R|8N`qQo_# zBsf2LflrzF189feup? z#}a#njUHAr&YoaOQg^%|q)=Ar>Bu=@Epw8(xJcs-2XW&MBCRZz%s1^EwmDb{S#x&I zofI{PC*?T9&5IoSpPo-o*zn`ffde*ziqlMb8xyOonVXNuw#+!?#K!h7jIAwqx?s}$ zzX$)NidctCiV9>B`gplKMZ-hKtL1ms$r~I=`Z_%;xEPXb4K*)n%2tAW8Q>G*3iO?W zg98J@e;{P|{~ttvDKHZ#ISNKYU^s^W$I~`Jp#L}vJR*x382Ao>Fr%o3R|8N`qQo_# zBsf2bP0l+XkKL#%#O literal 0 HcmV?d00001 diff --git a/assets/Sprites/Bullets/C3.png b/assets/Sprites/Bullets/C3.png new file mode 100644 index 0000000000000000000000000000000000000000..47a539b6325b61670249ee8b5db84d3a85aed8f0 GIT binary patch literal 1131 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y+0V25#xB3C8Q<=`r0nVkxCHc7w3=&h56B6#6 zV_@;&LflrzF189feup? z#}a#njUHAr&YoaOQg^%|q)=Ar>Bu=@Epw8(xJcs-2XW&MBCRZz%s1^EwmDb{S#x&I zofI{PC*?T9&5IoSpPo-o*zn`ffde*ziqlMb8xyOonVXNuw#+!?#K!h7jIAwqx?s}$ zzX$)NidctCiV9>B`gplKMZ-hKtL1ms$r~I=`Z_%;xEPXb4K*)n%2tAW8Q>G*3iO?W zg98J@e;{P|{~ttvDKHZ#ISNKYU^s^W$I~`Jp#L}vJR*x382Ao>Fr%o3R|8N`qQo_# zBsf2t;!34^DrpUXO@geCyBEq?d_ literal 0 HcmV?d00001 diff --git a/assets/Sprites/Bullets/C4.png b/assets/Sprites/Bullets/C4.png new file mode 100644 index 0000000000000000000000000000000000000000..0de55d71f14053fc6734b0e1f4537c1fb650bc87 GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y+0V25#xB3C8Q<=`r0nVkxCHc7w3=&h56B6#6 zV_@;&LflrzF189feup? z#}a#njUHAr&YoaOQg^%|q)=Ar>Bu=@Epw8(xJcs-2XW&MBCRZz%s1^EwmDb{S#x&I zofI{PC*?T9&5IoSpPo-o*zn`ffde*ziqlMb8xyOonVXNuw#+!?#K!h7jIAwqx?s}$ zzX$)NidctCiV9>B`gplKMZ-hKtL1ms$r~I=`Z_%;xEPXb4K*)n%2tAW8Q>G*3iO?W zg98J@e;{P|{~ttvDKHZ#ISNKYU^s^W$I~`Jp#L}vJR*x382Ao>Fr%o3R|8N`qQo_# zBsf2LflrzF189feup? z#}a#njUHAr&YoaOQg^%|q)=Ar>Bu=@Epw8(xJcs-2XW&MBCRZz%s1^EwmDb{S#x&I zofI{PC*?T9&5IoSpPo-o*zn`ffde*ziqlMb8xyOonVXNuw#+!?#K!h7jIAwqx?s}$ zzX$)NidctCiV9>B`gplKMZ-hKtL1ms$r~I=`Z_%;xEPXb4K*)n%2tAW8Q>G*3iO?W zg98J@e;{P|{~ttvDKHZ#ISNKYU^s^W$I~`Jp#L}vJR*x382Ao>Fr%o3R|8N`qQo_# zBsf2#XV)z4*}Q$iB}UHyJO literal 0 HcmV?d00001 diff --git a/assets/Sprites/Bullets/D2.png b/assets/Sprites/Bullets/D2.png new file mode 100644 index 0000000000000000000000000000000000000000..6b8acd0ef535f07bc0b3aa019765fa9baddba166 GIT binary patch literal 1130 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y+0V25#xB3C8Q<=`r0nVkxCHc7w3=&h56B6#6 zV_@;&LflrzF189feup? z#}a#njUHAr&YoaOQg^%|q)=Ar>Bu=@Epw8(xJcs-2XW&MBCRZz%s1^EwmDb{S#x&I zofI{PC*?T9&5IoSpPo-o*zn`ffde*ziqlMb8xyOonVXNuw#+!?#K!h7jIAwqx?s}$ zzX$)NidctCiV9>B`gplKMZ-hKtL1ms$r~I=`Z_%;xEPXb4K*)n%2tAW8Q>G*3iO?W zg98J@e;{P|{~ttvDKHZ#ISNKYU^s^W$I~`Jp#L}vJR*x382Ao>Fr%o3R|8N`qQo_# zBsf2LflrzF189feup? z#}a#njUHAr&YoaOQg^%|q)=Ar>Bu=@Epw8(xJcs-2XW&MBCRZz%s1^EwmDb{S#x&I zofI{PC*?T9&5IoSpPo-o*zn`ffde*ziqlMb8xyOonVXNuw#+!?#K!h7jIAwqx?s}$ zzX$)NidctCiV9>B`gplKMZ-hKtL1ms$r~I=`Z_%;xEPXb4K*)n%2tAW8Q>G*3iO?W zg98J@e;{P|{~ttvDKHZ#ISNKYU^s^W$I~`Jp#L}vJR*x382Ao>Fr%o3R|8N`qQo_# zBsf2#XV)z4*}Q$iB}UHyJO literal 0 HcmV?d00001 diff --git a/assets/Sprites/Bullets/D4.png b/assets/Sprites/Bullets/D4.png new file mode 100644 index 0000000000000000000000000000000000000000..6281a7a4d283c9f270cfe78c5de6942082bcb7ee GIT binary patch literal 1129 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y+0V25#xB3C8Q<=`r0nVkxCHc7w3=&h56B6#6 zV_@;&LflrzF189feup? z#}a#njUHAr&YoaOQg^%|q)=Ar>Bu=@Epw8(xJcs-2XW&MBCRZz%s1^EwmDb{S#x&I zofI{PC*?T9&5IoSpPo-o*zn`ffde*ziqlMb8xyOonVXNuw#+!?#K!h7jIAwqx?s}$ zzX$)NidctCiV9>B`gplKMZ-hKtL1ms$r~I=`Z_%;xEPXb4K*)n%2tAW8Q>G*3iO?W zg98J@e;{P|{~ttvDKHZ#ISNKYU^s^W$I~`Jp#L}vJR*x382Ao>Fr%o3R|8N`qQo_# zBsf2J)#U=T<3=9%elM@o| zoMT||;p5@iS*hyk_|A_@aAF`AkB5Tc&K(Vm<_ReYKgxJrj0|F~@#-W#J-%2>`hgBp z6vq;KhK(LpGtQo1N>X>cA*4`N>FLNhVJ&l#y0}Q=4F_@K4J)#U=T<3=9%elM@o| zoMT||;p5@iS*hyk_|A_@aAF`AkB5Tc&K(Vm<_ReYKgxJrj0|F~@#-W#J-%2>`hgBp z6vq;KhK(LpGtQo1N>X>cA*4`N>FLNhVJ&l#y0}Q=4F_@K4!*~Nar wt4QIGrIzPJ6=OMrBPxye97P?uS>{Y)DE=fC_)p#JJ5UpYr>mdKI;Vst0H0loSO5S3 literal 0 HcmV?d00001 diff --git a/assets/Sprites/Enemy/AlienDeath.png b/assets/Sprites/Enemy/AlienDeath.png new file mode 100644 index 0000000000000000000000000000000000000000..962f11b084027a3ef4f9cff028e312642c21bb13 GIT binary patch literal 1145 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~c!3-piujpS2q)ufzI|n$I7MJAbGB8L?O-@L- zbB=+i=?6MY zQ5;L`88&)Y%{Y64DM{V&hLA#8rKcn3gtg2`>f$1eHyp%`KZvxlSTf(VbJ*r!C1lOn zId@Xj9G;Zp3^y-w?0L-LkAAn2r5o9>1|A`wq|ZVBHJ?KloK16h%|2PXgB8wRq_zrmdKI;Vst0Cg~kbN~PV literal 0 HcmV?d00001 diff --git a/assets/Sprites/Enemy/LA1.png b/assets/Sprites/Enemy/LA1.png new file mode 100644 index 0000000000000000000000000000000000000000..cf70296659c6451756de0d0bbaf74a6b1c19cceb GIT binary patch literal 1147 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~c!3-piujpS2q)ufzI|n$I7MJAbGB8L?O-@L- zbB=+i=?6MY zQ5;L`88&)Y%{Y64DM{V&hLA#8rKcn3gtg2`>f$1eHyp%`KZvxlSTf(VbJ*r!C1lOn zId@Xj9G;Zp3^y-w?0L-LkAAn2r5o9>1|A`wq|ZVBHJ?KloK16h%|2PXgB8wRq_zri=?6MY zQ5;L`88&)Y%{Y64DM{V&hLA#8rKcn3gtg2`>f$1eHyp%`KZvxlSTf(VbJ*r!C1lOn zId@Xj9G;Zp3^y-w?0L-LkAAn2r5o9>1|A`wq|ZVBHJ?KloK16h%|2PXgB8wRq_zri=?6MY zQ5;L`88&)Y%{Y64DM{V&hLA#8rKcn3gtg2`>f$1eHyp%`KZvxlSTf(VbJ*r!C1lOn zId@Xj9G;Zp3^y-w?0L-LkAAn2r5o9>1|A`wq|ZVBHJ?KloK16h%|2PXgB8wRq_zrSJ literal 0 HcmV?d00001 diff --git a/assets/Sprites/Enemy/MA2.png b/assets/Sprites/Enemy/MA2.png new file mode 100644 index 0000000000000000000000000000000000000000..7efaa05825cdf6a8d5c8207606d1dac7155d23b9 GIT binary patch literal 1149 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~c!3-piujpS2q)ufzI|n$I7MJAbGB8L?O-@L- zbB=+i=?6MY zQ5;L`88&)Y%{Y64DM{V&hLA#8rKcn3gtg2`>f$1eHyp%`KZvxlSTf(VbJ*r!C1lOn zId@Xj9G;Zp3^y-w?0L-LkAAn2r5o9>1|A`wq|ZVBHJ?KloK16h%|2PXgB8wRq_zr*yM079~K5m?o2h_yi>FVdQ&MBb@08Lwm82|tP literal 0 HcmV?d00001 diff --git a/assets/Sprites/Enemy/SA1.png b/assets/Sprites/Enemy/SA1.png new file mode 100644 index 0000000000000000000000000000000000000000..0cd3c150e2570383b7f6142970c15117392265f1 GIT binary patch literal 1151 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~c!3-piujpS2q)ufzI|n$I7MJAbGB8L?O-@L- zbB=+i=?6MY zQ5;L`88&)Y%{Y64DM{V&hLA#8rKcn3gtg2`>f$1eHyp%`KZvxlSTf(VbJ*r!C1lOn zId@Xj9G;Zp3^y-w?0L-LkAAn2r5o9>1|A`wq|ZVBHJ?KloK16h%|2PXgB8wRq_zrktq#r8o<$ViNI{NoYC4p6U3|nUjr;!TSfJqT_B(F`zaEPgg&ebxsLQ0Evx<&;S4c literal 0 HcmV?d00001 diff --git a/assets/Sprites/Enemy/SA2.png b/assets/Sprites/Enemy/SA2.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb4010182e7882dbf8c0c9dc16c92750d728d30 GIT binary patch literal 1148 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~c!3-piujpS2q)ufzI|n$I7MJAbGB8L?O-@L- zbB=+i=?6MY zQ5;L`88&)Y%{Y64DM{V&hLA#8rKcn3gtg2`>f$1eHyp%`KZvxlSTf(VbJ*r!C1lOn zId@Xj9G;Zp3^y-w?0L-LkAAn2r5o9>1|A`wq|ZVBHJ?KloK16h%|2PXgB8wRq_zrktq#r8o<$ViHkJ5Is?o!ga3Y1EWs^qhLtJ*FvBk22WQ%mvv4FO#l&?h}i%D literal 0 HcmV?d00001 diff --git a/assets/Sprites/House.png b/assets/Sprites/House.png new file mode 100644 index 0000000000000000000000000000000000000000..d4a06c78aec5d297522791f228373b6d3b538e38 GIT binary patch literal 1157 zcmeAS@N?(olHy`uVBq!ia0vp^5LflrzF189feup? z#}a#njUHAr&YoaOQg^%|q)=Ar>Bu=@Epw8(xJcs-2XW&MBCRZz%s1^EwmDb{S#x&I zofI{PC*?T9&5IoSpPo-o*zn`ffde*ziqlMb8xyOonVXNuw#+!?#K!h7jIAwqx?s}$ zzX$)NidctCiV9>B`gplKMZ-hKtL1ms$r~I=`Z_%;xEPXb4K*)n%2qNkFf#=Bgt!8I z=iuPL!0;ak8UFtV5nu|;1WJyA(GVEUA;9spO%Uim&H|6fVg?4jLm%#G9w zM-z=^JQ9%1d6Y17p=P5PSAkm9j)M^$45(han89ZJ6T-G@yGywoT C(~Ft_ literal 0 HcmV?d00001 diff --git a/assets/Sprites/Player/BulletDeath.png b/assets/Sprites/Player/BulletDeath.png new file mode 100644 index 0000000000000000000000000000000000000000..86083a13c908e2b6fe136f8621942bf9f63a4133 GIT binary patch literal 1137 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxfPGvef2RN4&m*nR%Fi1>IPDr?O zj)BF8kB4VxrK+prJ3lVLiGf@^9tws#cQi1XC!{3&DC2c8GKjgxtCRTj_+l~X2Rckq z982sOHhNgiID3LAN!{^=kV09drz7WtwaiKC;v$VV9K?-3h_td;GT*dw*ydm*WX;(* zcT&_Go|NMZH!pJRe|kPWVZ)C@2M*W>Do!)$ZA`4TW^O(r+cM*n6C2yVFt)bb>4Hh~ z{~r98DqFe~Y;9^L!HPpPQDO<_Fz|0Wf6XFW= zor8k|1H*qHWcdFdM1UzU6DTIPDr?O zj)BF8kB4VxrK+prJ3lVLiGf@^9tws#cQi1XC!{3&DC2c8GKjgxtCRTj_+l~X2Rckq z982sOHhNgiID3LAN!{^=kV09drz7WtwaiKC;v$VV9K?-3h_td;GT*dw*ydm*WX;(* zcT&_Go|NMZH!pJRe|kPWVZ)C@2M*W>Do!)$ZA`4TW^O(r+cM*n6C2yVFt)bb>4Hh~ z{~r98DqFe~Y;9^L!HPpPQDO<_Fz|0Wf6XFW= zor8k|1H*qHWcdFdM1UzU6DTq*w{Os lF)&SFn8EbfLcm6Vg+X`*!^OWTDIq|$44$rjF6*2UngHRNga7~l literal 0 HcmV?d00001 diff --git a/assets/Sprites/Player/Player.png b/assets/Sprites/Player/Player.png new file mode 100644 index 0000000000000000000000000000000000000000..efc6eb08a9e5d290343da6d483b23033149e3dfc GIT binary patch literal 1136 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~c!3-piujpS2q)ufzI|n$I7MJAbGB8L?O-@L- zbB=+i=?6MY zQ5;L`88&)Y%{Y64DM{V&hLA#8rKcn3gtg2`>f$1eHyp%`KZvxlSTf(VbJ*r!C1lOn zId@Xj9G;Zp3^y-w?0L-LkAAn2r5o9>1|A`wq|ZVBHJ?KloK16h%|2PXgB8wRq_zr*j|IEHY{OipNE;$sUraPVNG jdjm7$g`Wa~L97fJ5=@4NzAZ8Zs$=kU^>bP0l+XkKz_o<1 literal 0 HcmV?d00001 diff --git a/assets/Sprites/Player/PlayerBullet.png b/assets/Sprites/Player/PlayerBullet.png new file mode 100644 index 0000000000000000000000000000000000000000..d530535a73dc8e9f67a8e03f9aa0b2e2a9fb988d GIT binary patch literal 1122 zcmeAS@N?(olHy`uVBq!ia0vp^j6lr6!3-q%kE9j@sZ*KG&H>J)#U=T<3=9%elM@o| zoMT||;p5@iS*hyk_|A_@aAF`AkB5Tc&K(Vm<_ReYKgxJrj0|F~@#-W#J-%2>`hgBp z6vq;KhK(LpGtQo1N>X>cA*4`N>FLNhVJ&l#y0}Q=4F_@K4i=?6MY zQ5;L`88&)Y%{Y64DM{V&hLA#8rKcn3gtg2`>f$1eHyp%`KZvxlSTf(VbJ*r!C1lOn zId@Xj9G;Zp3^y-w?0L-LkAAn2r5o9>1|A`wq|ZVBHJ?KloK16h%|2PXgB8wRq_zri=?6MY zQ5;L`88&)Y%{Y64DM{V&hLA#8rKcn3gtg2`>f$1eHyp%`KZvxlSTf(VbJ*r!C1lOn zId@Xj9G;Zp3^y-w?0L-LkAAn2r5o9>1|A`wq|ZVBHJ?KloK16h%|2PXgB8wRq_zrG6*_3#gaD)78&qol`;+ E031V)+5i9m literal 0 HcmV?d00001 diff --git a/assets/Sprites/Ship.png b/assets/Sprites/Ship.png new file mode 100644 index 0000000000000000000000000000000000000000..71de4ab55c8c8d82d73d74b1b9a172c20d19951b GIT binary patch literal 1147 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 literal 0 HcmV?d00001 diff --git a/assets/space_invaders_taito_cop.png b/assets/space_invaders_taito_cop.png new file mode 100644 index 0000000000000000000000000000000000000000..14107e07047c0a6f771ba4b97947b9a80e241ac5 GIT binary patch literal 823 zcmV-71IYY|P)Ifo$Cg2hH7@KZ5;Se z)3|yL+6)YkljS*j7#!wNnisvy z&d#GWFM651okw|&-s)#uf2#k0`S3Fo{7Ktr!&d8p)cnf{=B;*R)l24$P%Ov z1m&&rQ^Jn4W=G~-!CO9_e5xG$G!#Wq6ywA~nn5h2dlU;f{tyfCUM!@xVj;T+v5<$I zSX)FfWJR)u5OPi;Q`eRN;|GaM=P^i4x0lEqj{^an_YxWJF-SXq6v=x>7?h2|sUDq3 zacmR4k76Ot$tAy!DEWOv74D-6AoNhce!mByhXNWJK9nkomIm7C5K?t@ z;$W%{yyMrrMo3Eo{n+MC+KG$Cr9Dd3Awq8m+-j=sN6KrnH=ROWqxg_vtd=0RdI<*V zAz0oq2m5#I_WQsvX9OPC%A-KNPiP{{Ts9J(2T7o0>rQk?a4n7erL7wJd z{!2unwY17g!HJcFtPcgZk5bV}+S4Zo+Yr_z`w+$r2S1LYDB*WJAIkor$A9WhNph$g z*r>)?1?Km2I@c_3>`=n~IcOvNX~?7*B^+l$7^8|og5c%N0ORKW5~IpNZq?=B>o)`J zwcw7GgRkBUu-Agty5ci7S6Xej&G}Rf!KrQl