The Belt - Final Build
unknown
python
10 days ago
12 kB
2
Indexable
import pygame import random from os import path #Defines where the image folder is into a variable. image_folder = path.join(path.dirname(__file__), "Images") WIDTH = 480 HEIGHT = 600 FPS = 60 POWERUP_DURATION = 5000 #Define colours. WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) GREEN = (0, 255, 0) #Initalises pygame, sets screen, caption and clock. pygame.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("The Belt") clock = pygame.time.Clock() #Defines the default font. font_name = pygame.font.match_font("Arial") def draw_text(surface, text, size, x, y): font = pygame.font.Font(font_name, size) text_surface = font.render(text, True, WHITE) text_rect = text_surface.get_rect() text_rect.midtop = (x, y) surface.blit(text_surface, text_rect) def new_asteroid(): a = Asteroid() all_sprites.add(a) asteroids.add(a) def draw_health_bar(surface, x, y, percentage): if percentage < 0: percentage = 0 BAR_LENGTH = 100 BAR_HEIGHT = 10 health_draw = (percentage/100) * BAR_LENGTH outline_rect = pygame.Rect(x, y, BAR_LENGTH, BAR_HEIGHT) health_rect = pygame.Rect(x, y, health_draw, BAR_HEIGHT) pygame.draw.rect(surface, GREEN, health_rect) pygame.draw.rect(surface, WHITE, outline_rect, 2) def draw_lives(surface, x, y, lives, img): for i in range(lives): img_rect = img.get_rect() img_rect.x = x + 32.5 * i img_rect.y = y surface.blit(img, img_rect) '''-----CLASSES-----''' class Player(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = pygame.transform.scale(player_img, (50, 40)) self.rect = self.image.get_rect() self.radius = 20 # pygame.draw.circle(self.image, RED, self.rect.center, self.radius) self.rect.centerx = WIDTH / 2 self.rect.bottom = HEIGHT - 10 self.speedx = 0 self.health = 100 self.shoot_delay = 250 self.last_shot = pygame.time.get_ticks() self.lives = 3 self.hidden = False self.time_hidden = pygame.time.get_ticks() self.power = 1 self.power_duration = pygame.time.get_ticks() def update(self): #The time that the power-ups remain active. if self.power >= 2 and pygame.time.get_ticks() - self.power_duration > POWERUP_DURATION: self.power -= 1 self.power_duration = pygame.time.get_ticks() #This will unhide the player if they are still hidden. if self.hidden and pygame.time.get_ticks() - self.time_hidden > 1000: self.hidden = False self.rect.centerx = WIDTH / 2 self.rect.bottom = HEIGHT - 10 self.speedx = 0 keystate = pygame.key.get_pressed() if keystate[pygame.K_LEFT]: self.speedx = -8 if keystate[pygame.K_RIGHT]: self.speedx = 8 if keystate[pygame.K_SPACE]: self.shoot() self.rect.x += self.speedx if self.rect.right > WIDTH: self.rect.right = WIDTH if self.rect.left < 0: self.rect.left = 0 def powerup(self): self.power += 1 self.power_duration = pygame.time.get_ticks() def shoot(self): now = pygame.time.get_ticks() if now - self.last_shot > self.shoot_delay: self.last_shot = now if self.power == 1: bullet = Bullet(self.rect.centerx, self.rect.top) all_sprites.add(bullet) bullets.add(bullet) if self.power >= 2: bullet1 = Bullet(self.rect.left, self.rect.centery) bullet2 = Bullet(self.rect.right, self.rect.centery) all_sprites.add(bullet1) all_sprites.add(bullet2) bullets.add(bullet1) bullets.add(bullet2) def hide_player(self): #This will temporarily hide the player when they lose a life. self.hidden = True self.time_hidden = pygame.time.get_ticks() self.rect.center = (WIDTH / 2, HEIGHT + 200) class Asteroid(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image_orig = random.choice(asteroid_images) self.image = self.image_orig self.rect = self.image.get_rect() self.radius = int(self.rect.width * 0.85 / 2) # pygame.draw.circle(self.image, RED, self.rect.center, self.radius) self.rect.x = random.randrange(WIDTH - self.rect.width) self.rect.y = random.randrange(-100, -40) self.speedy = random.randrange(1, 8) self.speedx = random.randrange(-3, 3) def update(self): self.rect.x += self.speedx self.rect.y += self.speedy if self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20: self.rect.x = random.randrange(WIDTH - self.rect.width) self.rect.y = random.randrange(-100, -40) self.speedy = random.randrange(1, 8) class Bullet(pygame.sprite.Sprite): def __init__(self, x, y): pygame.sprite.Sprite.__init__(self) self.image = bullet_img self.rect = self.image.get_rect() self.rect.bottom = y self.rect.centerx = x self.speedy = -10 def update(self): self.rect.y += self.speedy #Kill the bullet if it moves off-screen. if self.rect.bottom < 0: self.kill() class Powers(pygame.sprite.Sprite): def __init__(self, center): pygame.sprite.Sprite.__init__(self) self.type = random.choice(["Shield", "Multiplier"]) self.image = powerup_images[self.type] self.image.set_colorkey(BLACK) self.rect = self.image.get_rect() self.rect.center = center self.speedy = 5 def update(self): self.rect.y += self.speedy #Kill the power up if it moves off-screen. if self.rect.top > HEIGHT: self.kill() class Explosion(pygame.sprite.Sprite): def __init__(self, center, size): pygame.sprite.Sprite.__init__(self) self.size = size self.image = explosion_anim[self.size][0] self.rect = self.image.get_rect() self.rect.center = center self.frame = 0 self.last_update = pygame.time.get_ticks() self.frame_rate = 75 def update(self): now = pygame.time.get_ticks() if now - self.last_update > self.frame_rate: self.last_update = now self.frame += 1 if self.frame == len(explosion_anim[self.size]): self.kill() else: center = self.rect.center self.image = explosion_anim[self.size][self.frame] self.rect = self.image.get_rect() self.rect.center = center def title_screen(): screen.blit(background, background_rect) draw_text(screen, "The Belt", 64, WIDTH / 2, HEIGHT / 4) draw_text(screen, "Arrow keys move, Space to fire.", 22, WIDTH / 2, HEIGHT / 2) draw_text(screen, "Press a key to begin.", 18, WIDTH / 2, HEIGHT * 3 / 4) pygame.display.flip() waiting = True while waiting: clock.tick(FPS) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() if event.type == pygame.KEYUP: waiting = False '''-----GRAPHICS-----''' #Background loading. background = pygame.image.load(path.join(image_folder, "Background.png")).convert() background_rect = background.get_rect() #Player Ship images loading. player_img = pygame.image.load(path.join(image_folder, "Ship.png")).convert() player_mini_img = pygame.transform.scale(player_img, (25, 19)) #Bullet loading. bullet_img = pygame.image.load(path.join(image_folder, "Beam.png")).convert() #Asteroid images loading. asteroid_images = [] asteroid_list = ["Asteroid.png", "Asteroid_Small.png", "Asteroid_Mini.png", "Asteroid_Big.png"] for Images in asteroid_list: asteroid_images.append(pygame.image.load(path.join(image_folder, Images)).convert()) #Expolsion Animations. explosion_anim = {} explosion_anim["asteroid"] = [] explosion_anim["player"] = [] for i in range(8): #Asteroid Explosion. filename = "Explosion 0{}.png".format(i) img = pygame.image.load(path.join(image_folder, filename)).convert() img.set_colorkey(BLACK) img_asteroid = pygame.transform.scale(img, (75, 75)) explosion_anim["asteroid"].append(img_asteroid) #Player Explosion. filename = "shipExplosion 0{}.png".format(i) img = pygame.image.load(path.join(image_folder, filename)).convert() img.set_colorkey(BLACK) explosion_anim["player"].append(img) #Power-Up Images. powerup_images = {} powerup_images["Shield"] = pygame.image.load(path.join(image_folder, "Shield Power Up.png")).convert() powerup_images["Multiplier"] = pygame.image.load(path.join(image_folder, "x2 Power Up.png")).convert() '''-----GAME LOOP-----''' game_over = True running = True while running: if game_over: title_screen() game_over = False #Group sprites. all_sprites = pygame.sprite.Group() asteroids = pygame.sprite.Group() bullets = pygame.sprite.Group() powerups = pygame.sprite.Group() player = Player() all_sprites.add(player) for i in range(8): new_asteroid() score = 0 clock.tick(FPS) #Keep the game running at the correct speed. for event in pygame.event.get(): if event.type == pygame.QUIT: #Close the game when the player closes the window. running = False #Update screen. all_sprites.update() '''-----COLLISION-----''' #Check to see if a bullet has made contact with an asteroid. hits = pygame.sprite.groupcollide(asteroids, bullets, True, True) for hit in hits: if hit.radius == 6: score += 50 elif hit.radius == 13: score += 35 elif hit.radius == 27: score += 20 else: score += 10 expl = Explosion(hit.rect.center, "asteroid") all_sprites.add(expl) if random.random() > 0.95: #Power Up spawn rate. powers = Powers(hit.rect.center) all_sprites.add(powers) powerups.add(powers) new_asteroid() #Check to see if an asteroid has made contact with the player. hits = pygame.sprite.spritecollide(player, asteroids, False, pygame.sprite.collide_circle) for hit in hits: if hit.radius == 6: player.health -= 10 elif hit.radius == 13: player.health -= 15 elif hit.radius == 27: player.health -= 20 else: player.health -= 25 new_asteroid() if player.health <= 0: death_explosion = Explosion(player.rect.center, "player") all_sprites.add(death_explosion) player.hide_player() player.lives -= 1 player.health = 100 #Check to see if the player has made contact with a power up. hits = pygame.sprite.spritecollide(player, powerups, True) for hit in hits: if hit.type == "Shield": player.health += random.randrange(10, 30) if player.health >= 100: player.health = 100 if hit.type == "Multiplier": player.powerup() #When Player Lives equal 0 and the explosion is complete, end the game. if player.lives == 0 and not death_explosion.alive(): game_over = True #Draw/Render everything. screen.fill(BLACK) screen.blit(background, background_rect) #Draws the background image. all_sprites.draw(screen) draw_text(screen, str(score), 18, WIDTH / 2, 10) #Draws the score on-screen. draw_health_bar(screen, 5, 5, player.health) draw_lives(screen, WIDTH - 100, 5, player.lives, player_mini_img) #After drawing the screen, flip the display. pygame.display.flip() pygame.quit()
Editor is loading...
Leave a Comment