-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
8d56aba
commit c668a6b
Showing
1 changed file
with
214 additions
and
41 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,89 +1,262 @@ | ||
import pygame | ||
import os | ||
import time | ||
import time | ||
import random | ||
pygame.font.init() | ||
|
||
|
||
WIDTH, HEIGHT = 850, 750 | ||
WIDTH, HEIGHT = 750, 750 | ||
WIN = pygame.display.set_mode((WIDTH, HEIGHT)) | ||
pygame.display.set_caption("Space Invader") | ||
pygame.display.set_caption("Space Shooter Tutorial") | ||
|
||
# Load images | ||
RED_SPACE_SHIP = pygame.image.load(os.path.join("assets", "pixel_ship_red_small.png")) | ||
GREEN_SPACE_SHIP = pygame.image.load(os.path.join("assets", "pixel_ship_green_small.png")) | ||
BLUE_SPACE_SHIP = pygame.image.load(os.path.join("assets", "pixel_ship_blue_small.png")) | ||
|
||
RED_SPACE_player = pygame.image.load(os.path.join("Assets", "pixel_ship_red_small.png")) | ||
GREEN_SPACE_player = pygame.image.load(os.path.join("Assets", "pixel_ship_green_small.png")) | ||
BLUE_SPACE_player = pygame.image.load(os.path.join("Assets", "pixel_ship_blue_small.png")) | ||
# Player player | ||
YELLOW_SPACE_SHIP = pygame.image.load(os.path.join("assets", "pixel_ship_yellow.png")) | ||
|
||
# Lasers | ||
RED_LASER = pygame.image.load(os.path.join("assets", "pixel_laser_red.png")) | ||
GREEN_LASER = pygame.image.load(os.path.join("assets", "pixel_laser_green.png")) | ||
BLUE_LASER = pygame.image.load(os.path.join("assets", "pixel_laser_blue.png")) | ||
YELLOW_LASER = pygame.image.load(os.path.join("assets", "pixel_laser_yellow.png")) | ||
|
||
YELLOW_SPACE_player = pygame.image.load(os.path.join("Assets", "pixel_ship_yellow.png")) | ||
# Background | ||
BG = pygame.transform.scale(pygame.image.load(os.path.join("assets", "background-black.png")), (WIDTH, HEIGHT)) | ||
|
||
class Laser: | ||
def __init__(self, x, y, img): | ||
self.x = x | ||
self.y = y | ||
self.img = img | ||
self.mask = pygame.mask.from_surface(self.img) | ||
|
||
def draw(self, window): | ||
window.blit(self.img, (self.x, self.y)) | ||
|
||
def move(self, vel): | ||
self.y += vel | ||
|
||
RED_LASER = pygame.image.load(os.path.join("Assets", "pixel_laser_red.png")) | ||
GREEN_LASER = pygame.image.load(os.path.join("Assets", "pixel_laser_green.png")) | ||
BLUE_LASER = pygame.image.load(os.path.join("Assets", "pixel_laser_blue.png")) | ||
YELLOW_LASER = pygame.image.load(os.path.join("Assets", "pixel_laser_yellow.png")) | ||
def off_screen(self, height): | ||
return not(self.y <= height and self.y >= 0) | ||
|
||
def collision(self, obj): | ||
return collide(self, obj) | ||
|
||
BG = pygame.transform.scale(pygame.image.load(os.path.join("Assets", "background-black.png")), (WIDTH, HEIGHT)) | ||
|
||
class Ship: | ||
COOLDOWN = 30 | ||
|
||
class player: | ||
def __init__(self, x, y, health = 100): | ||
def __init__(self, x, y, health=100): | ||
self.x = x | ||
self.y = y | ||
self.health = health | ||
self.player_img = None | ||
self.ship_img = None | ||
self.laser_img = None | ||
self.lasers = [] | ||
self.cool_down_counter = 0 | ||
self.cool_down_counter = 0 | ||
|
||
def draw(self, window): | ||
window.blit(self.player_img, (self.x, self.y)) | ||
window.blit(self.ship_img, (self.x, self.y)) | ||
for laser in self.lasers: | ||
laser.draw(window) | ||
|
||
def move_lasers(self, vel, obj): | ||
self.cooldown() | ||
for laser in self.lasers: | ||
laser.move(vel) | ||
if laser.off_screen(HEIGHT): | ||
self.lasers.remove(laser) | ||
elif laser.collision(obj): | ||
obj.health -= 10 | ||
self.lasers.remove(laser) | ||
|
||
def cooldown(self): | ||
if self.cool_down_counter >= self.COOLDOWN: | ||
self.cool_down_counter = 0 | ||
elif self.cool_down_counter > 0: | ||
self.cool_down_counter += 1 | ||
|
||
def shoot(self): | ||
if self.cool_down_counter == 0: | ||
laser = Laser(self.x, self.y, self.laser_img) | ||
self.lasers.append(laser) | ||
self.cool_down_counter = 1 | ||
|
||
def get_width(self): | ||
return self.ship_img.get_width() | ||
|
||
def get_height(self): | ||
return self.ship_img.get_height() | ||
|
||
|
||
class Player(player): | ||
def __init__(self, x, y, health = 100): | ||
class Player(Ship): | ||
def __init__(self, x, y, health=100): | ||
super().__init__(x, y, health) | ||
self.player_img = YELLOW_SPACE_player | ||
self.ship_img = YELLOW_SPACE_SHIP | ||
self.laser_img = YELLOW_LASER | ||
self.mask = pygame.mask.from_surface(self.player_img) | ||
self.mask = pygame.mask.from_surface(self.ship_img) | ||
self.max_health = health | ||
|
||
def move_lasers(self, vel, objs): | ||
self.cooldown() | ||
for laser in self.lasers: | ||
laser.move(vel) | ||
if laser.off_screen(HEIGHT): | ||
self.lasers.remove(laser) | ||
else: | ||
for obj in objs: | ||
if laser.collision(obj): | ||
objs.remove(obj) | ||
if laser in self.lasers: | ||
self.lasers.remove(laser) | ||
|
||
def draw(self, window): | ||
super().draw(window) | ||
self.healthbar(window) | ||
|
||
def healthbar(self, window): | ||
pygame.draw.rect(window, (255,0,0), (self.x, self.y + self.ship_img.get_height() + 10, self.ship_img.get_width(), 10)) | ||
pygame.draw.rect(window, (0,255,0), (self.x, self.y + self.ship_img.get_height() + 10, self.ship_img.get_width() * (self.health/self.max_health), 10)) | ||
|
||
|
||
class Enemy(Ship): | ||
COLOR_MAP = { | ||
"red": (RED_SPACE_SHIP, RED_LASER), | ||
"green": (GREEN_SPACE_SHIP, GREEN_LASER), | ||
"blue": (BLUE_SPACE_SHIP, BLUE_LASER) | ||
} | ||
|
||
def __init__(self, x, y, color, health=100): | ||
super().__init__(x, y, health) | ||
self.ship_img, self.laser_img = self.COLOR_MAP[color] | ||
self.mask = pygame.mask.from_surface(self.ship_img) | ||
|
||
def move(self, vel): | ||
self.y += vel | ||
|
||
def shoot(self): | ||
if self.cool_down_counter == 0: | ||
laser = Laser(self.x-20, self.y, self.laser_img) | ||
self.lasers.append(laser) | ||
self.cool_down_counter = 1 | ||
|
||
|
||
def collide(obj1, obj2): | ||
offset_x = obj2.x - obj1.x | ||
offset_y = obj2.y - obj1.y | ||
return obj1.mask.overlap(obj2.mask, (offset_x, offset_y)) != None | ||
|
||
def main(): | ||
run = True | ||
FPS = 60 | ||
level = 1 | ||
level = 0 | ||
lives = 5 | ||
main_font = pygame.font.SysFont("comicsans", 30) | ||
player_velo = 5 | ||
player = Player(300, 650) | ||
main_font = pygame.font.SysFont("comicsans", 50) | ||
lost_font = pygame.font.SysFont("comicsans", 60) | ||
|
||
enemies = [] | ||
wave_length = 5 | ||
enemy_vel = 1 | ||
|
||
player_vel = 5 | ||
laser_vel = 5 | ||
|
||
player = Player(300, 630) | ||
|
||
clock = pygame.time.Clock() | ||
|
||
lost = False | ||
lost_count = 0 | ||
|
||
def redraw_window(): | ||
WIN.blit(BG, (0, 0)) | ||
lives_lable = main_font.render(f"Lives: {lives}", 1, (255, 255, 255)) | ||
level_lable = main_font.render(f"Level: {level}", 1, (255, 255, 255)) | ||
WIN.blit(BG, (0,0)) | ||
# draw text | ||
lives_label = main_font.render(f"Lives: {lives}", 1, (255,255,255)) | ||
level_label = main_font.render(f"Level: {level}", 1, (255,255,255)) | ||
|
||
WIN.blit(lives_lable, (10, 10)) | ||
WIN.blit(level_lable, (WIDTH - level_lable.get_width() - 10, 10)) | ||
WIN.blit(lives_label, (10, 10)) | ||
WIN.blit(level_label, (WIDTH - level_label.get_width() - 10, 10)) | ||
|
||
for enemy in enemies: | ||
enemy.draw(WIN) | ||
|
||
player.draw(WIN) | ||
|
||
if lost: | ||
lost_label = lost_font.render("You Lost!!", 1, (255,255,255)) | ||
WIN.blit(lost_label, (WIDTH/2 - lost_label.get_width()/2, 350)) | ||
|
||
pygame.display.update() | ||
|
||
while run: | ||
clock.tick(FPS) | ||
redraw_window() | ||
|
||
if lives <= 0 or player.health <= 0: | ||
lost = True | ||
lost_count += 1 | ||
|
||
if lost: | ||
if lost_count > FPS * 3: | ||
run = False | ||
else: | ||
continue | ||
|
||
if len(enemies) == 0: | ||
level += 1 | ||
wave_length += 5 | ||
for i in range(wave_length): | ||
enemy = Enemy(random.randrange(50, WIDTH-100), random.randrange(-1500, -100), random.choice(["red", "blue", "green"])) | ||
enemies.append(enemy) | ||
|
||
for event in pygame.event.get(): | ||
if event.type == pygame.QUIT: | ||
run = False | ||
quit() | ||
|
||
keys = pygame.key.get_pressed() | ||
if keys[pygame.K_a] and player.x - player_velo > 0: | ||
player.x -= player_velo | ||
if keys[pygame.K_d] and player.x + player_velo + 50 < WIDTH: | ||
player.x += player_velo | ||
if keys[pygame.K_w] and player.y - player_velo > 0: | ||
player.y -= player_velo | ||
if keys[pygame.K_s] and player.y + player_velo + 50 < HEIGHT: | ||
player.y += player_velo | ||
main() | ||
if keys[pygame.K_a] and player.x - player_vel > 0: # left | ||
player.x -= player_vel | ||
if keys[pygame.K_d] and player.x + player_vel + player.get_width() < WIDTH: # right | ||
player.x += player_vel | ||
if keys[pygame.K_w] and player.y - player_vel > 0: # up | ||
player.y -= player_vel | ||
if keys[pygame.K_s] and player.y + player_vel + player.get_height() + 15 < HEIGHT: # down | ||
player.y += player_vel | ||
if keys[pygame.K_SPACE]: | ||
player.shoot() | ||
|
||
for enemy in enemies[:]: | ||
enemy.move(enemy_vel) | ||
enemy.move_lasers(laser_vel, player) | ||
|
||
if random.randrange(0, 2*60) == 1: | ||
enemy.shoot() | ||
|
||
if collide(enemy, player): | ||
player.health -= 10 | ||
enemies.remove(enemy) | ||
elif enemy.y + enemy.get_height() > HEIGHT: | ||
lives -= 1 | ||
enemies.remove(enemy) | ||
|
||
player.move_lasers(-laser_vel, enemies) | ||
|
||
def main_menu(): | ||
title_font = pygame.font.SysFont("comicsans", 70) | ||
run = True | ||
while run: | ||
WIN.blit(BG, (0,0)) | ||
title_label = title_font.render("Press the mouse to begin...", 1, (255,255,255)) | ||
WIN.blit(title_label, (WIDTH/2 - title_label.get_width()/2, 350)) | ||
pygame.display.update() | ||
for event in pygame.event.get(): | ||
if event.type == pygame.QUIT: | ||
run = False | ||
if event.type == pygame.MOUSEBUTTONDOWN: | ||
main() | ||
pygame.quit() | ||
|
||
|
||
main_menu() |