1
Fork 0
This repository has been archived on 2023-03-26. You can view files and clone it, but cannot push or open issues or pull requests.
attack-on-blocks/game.py

152 lines
3.9 KiB
Python

import pygame, logging
from time import time
from random import randint
import bullet, player, textures
from bullet import Bullet
from player import Shooter
from assets import Textures, Levels
from target import Target
PLAYING_GAME = False
WINDOW_SIZE = (640,480)
FPS = 120
def update_score(window, score):
font = pygame.font.SysFont(None, 30, bold=False)
window.blit(font.render("Score: {}".format(int(score)), True, (255,0,0)), (25, WINDOW_SIZE[1] - 30))
def update_level(window, level):
font = pygame.font.SysFont(None, 20, bold=True)
window.blit(font.render("Level: {}".format(int(level)+1), True, (0,255,0)), (8.7*WINDOW_SIZE[0]/10, WINDOW_SIZE[1] - 30))
def update_lives(window, lives):
font = pygame.font.SysFont(None, 30, bold=False)
window.blit(font.render("Lives Remaining: {}".format(int(lives)), True, (0,0,255)), (4.5*WINDOW_SIZE[0]/10, WINDOW_SIZE[1] - 30))
def initialise(menu, options):
pygame.mixer.pre_init(44100, -16, 2, 2048)
pygame.init()
window = pygame.display.set_mode(WINDOW_SIZE)
exit_code = play(window) # Run main game loop
if exit_code == "QUIT":
pygame.quit()
menu.deiconify()
return exit_code
def generate_targets():
group = pygame.sprite.Group()
for i in range(5): # Number of rows
i *= 25
for j in range(50, WINDOW_SIZE[0] - 70, 30):
#logging.debug("Target generated with position ({},{})".format(j,i))
temp = Target(x=j,y=i)
group.add(temp)
del temp
return group
def play(window):
window_rect = window.get_rect()
player = Shooter(window=window)
player.set_position(WINDOW_SIZE[0]/2, WINDOW_SIZE[1]*0.83)
player_group = pygame.sprite.Group()
player_group.add(player)
player_group.draw(window)
target_group = generate_targets()
bullet_group = pygame.sprite.Group()
clock = pygame.time.Clock()
PLAYING_GAME = True
target_movement_timeout_default = FPS * 0.5
target_movement_timeout = target_movement_timeout_default
while PLAYING_GAME:
window.fill((0,0,0))
player_group.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
logging.critical("Exiting Game...")
PLAYING_GAME = False
return "QUIT"
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
temp = Bullet(player)
bullet_group.add(temp)
keys = pygame.key.get_pressed()
if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
player.move(player.speed)
if keys[pygame.K_LEFT] or keys[pygame.K_a]:
player.move(-player.speed)
if keys[pygame.K_KP4] and keys[pygame.K_KP5] and keys[pygame.K_KP6] and player.OP:
temp = Bullet(player)
bullet_group.add(temp)
for sprite in bullet_group:
if not sprite.at_top():
sprite.update()
if sprite.rect.y < 0:
bullet_group.remove(sprite)
for bullet in bullet_group:
hit_list = pygame.sprite.spritecollide(bullet, target_group, True)
for target in hit_list:
target_group.remove(target)
bullet_group.remove(bullet)
logging.info("Hit Target!")
player.score += 1
if target_movement_timeout <=0:
drop_targets = False
for target in target_group:
target.move()
if target.rect.x <= 20 or target.rect.x >=WINDOW_SIZE[0] - 20 + target.width:
drop_targets = True
if target.rect.y >= player.rect.y + 10:
PLAYING_GAME = False
for target in target_group:
target.image.fill((255,0,0))
return "player collision"
if drop_targets:
logging.debug("drop")
for target in target_group:
target.drop()
target_movement_timeout = target_movement_timeout_default
for target in target_group:
if target.type == "SHOOTING":
temp = Bullet(target)
temp.speed = -3 #So it shoots down!
bullet_group.add(temp)
update_score(window, player.score)
player_group.update()
bullet_group.draw(window)
target_group.draw(window)
player_group.draw(window)
pygame.display.update()
target_movement_timeout -= 1
clock.tick(FPS)
if __name__ == "__main__":
logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.DEBUG)
initialise(None, None)