239 lines
7.4 KiB
Python
239 lines
7.4 KiB
Python
|
import pygame
|
||
|
import os
|
||
|
import time
|
||
|
import random
|
||
|
pygame.font.init()
|
||
|
width,height=1368,768
|
||
|
WINDOW=pygame.display.set_mode((width,height))
|
||
|
pygame.display.set_caption("gra-projekt")
|
||
|
|
||
|
#load images
|
||
|
#enemies
|
||
|
enemy1=pygame.image.load(os.path.join("img1","enemy1.png"))
|
||
|
enemy2=pygame.image.load(os.path.join("img1","enemy2.png"))
|
||
|
enemy3=pygame.image.load(os.path.join("img1","enemy3.png"))
|
||
|
#playerplayer
|
||
|
ourself=pygame.image.load(os.path.join("img1","me.png"))
|
||
|
#lasers
|
||
|
violetlaser=pygame.image.load(os.path.join("img1","fioletowylaser.png"))
|
||
|
bluelaser=pygame.image.load(os.path.join("img1","niebieskilaser.png"))
|
||
|
yellowlaser=pygame.image.load(os.path.join("img1","zoltylaser.png"))
|
||
|
greylaser=pygame.image.load(os.path.join("img1","szarylaser.png"))
|
||
|
#background
|
||
|
bg=pygame.image.load(os.path.join("img1","bg.jpg"))
|
||
|
|
||
|
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
|
||
|
|
||
|
def off_screen(self,height):
|
||
|
return not (self.y<=height and self.y>=0)
|
||
|
|
||
|
def collision(self, obj):
|
||
|
return collide(self, obj)
|
||
|
class ship: #to interact
|
||
|
COOLDOWN= 30
|
||
|
|
||
|
def __init__(self, x, y, health=100):
|
||
|
self.x = x
|
||
|
self.y = y
|
||
|
self.health = health
|
||
|
self.ship_img = None
|
||
|
self.laser_img = None
|
||
|
self.lasers = []
|
||
|
self.cool_down_counter = 0
|
||
|
|
||
|
def draw(self, window):
|
||
|
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+25,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(ship):
|
||
|
def __init__(self,x,y,health=100):
|
||
|
super().__init__(x,y,health)
|
||
|
self.ship_img=ourself
|
||
|
self.laser_img=violetlaser
|
||
|
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):
|
||
|
ENEMY_MAP={
|
||
|
"enemy1":(enemy1, greylaser),
|
||
|
"enemy2":(enemy2,yellowlaser),
|
||
|
"enemy3":(enemy3,bluelaser)
|
||
|
}
|
||
|
def __init__(self,x,y,enemy,health=100):
|
||
|
super().__init__(x,y,health)
|
||
|
self.ship_img,self.laser_img=self.ENEMY_MAP[enemy]
|
||
|
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+10, 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 #(x,y)
|
||
|
|
||
|
def main():
|
||
|
run=True
|
||
|
FPS=60
|
||
|
level=0
|
||
|
lives=5
|
||
|
player_vel=5
|
||
|
player=Player(600,650)
|
||
|
main_font=pygame.font.SysFont("comicsans",50)
|
||
|
lost_font=pygame.font.SysFont("comicsans",60)
|
||
|
|
||
|
enemies=[]
|
||
|
wave_length=0
|
||
|
enemy_vel=1
|
||
|
|
||
|
laser_vel=6
|
||
|
lost=False
|
||
|
lost_count=0
|
||
|
clock=pygame.time.Clock()
|
||
|
|
||
|
def redraw_window():
|
||
|
WINDOW.blit(bg,(0,0))
|
||
|
#draw text
|
||
|
lives_label=main_font.render(f"Lives:{lives}",1,(240,0,0))
|
||
|
level_label=main_font.render(f"Level:{level}",1,(240,0,0))
|
||
|
WINDOW.blit(lives_label,(10,10))
|
||
|
WINDOW.blit(level_label,(width-level_label.get_width()-10,10))
|
||
|
|
||
|
for enemy in enemies:
|
||
|
enemy.draw(WINDOW)
|
||
|
|
||
|
player.draw(WINDOW)
|
||
|
if lost:
|
||
|
lost_label=lost_font.render("You Lost!",1,(255,255,255))
|
||
|
WINDOW.blit(lost_label,(width/2-lost_label.get_width()/2,height/2))
|
||
|
pygame.display.update() #lastone
|
||
|
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(-100,0),random.choice(["enemy1","enemy2","enemy3"]))
|
||
|
enemies.append(enemy)
|
||
|
|
||
|
for event in pygame.event.get():
|
||
|
if event.type==pygame.QUIT:
|
||
|
quit()
|
||
|
keys=pygame.key.get_pressed()#to chceck 2 keys in 1 time
|
||
|
|
||
|
if keys[pygame.K_UP]and player.y -player_vel:
|
||
|
player.y -=player_vel
|
||
|
if keys[pygame.K_DOWN] and player.y+player_vel+player.get_height()<height:
|
||
|
player.y+=player_vel
|
||
|
if keys[pygame.K_LEFT]and player.x -player_vel>0:
|
||
|
player.x -= player_vel
|
||
|
if keys[pygame.K_RIGHT]and player.x +player_vel +player.get_width()<width:
|
||
|
player.x += 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,5*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:
|
||
|
WINDOW.blit(bg, (0,0))
|
||
|
title_label = title_font.render("Press the mouse to begin...", 1, (255,255,255))
|
||
|
WINDOW.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()
|
||
|
main()
|