From 04639f6778897dac71fc0fbcf803b0652d2b1696 Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 12 Aug 2024 11:27:10 +0200 Subject: [PATCH] Edited player class Added lifes for players Edited life decrease for player after it gets hit --- GameObject.py | 47 +++++++++++++++++----------- test.py | 86 ++++++++++++++++++++++++++++++--------------------- 2 files changed, 79 insertions(+), 54 deletions(-) diff --git a/GameObject.py b/GameObject.py index 0cfd4a7..1a554a6 100644 --- a/GameObject.py +++ b/GameObject.py @@ -11,7 +11,6 @@ class GameObject(object): self.image = image self.rect:pygame.Rect self.objects.append(self) - self.keymap = {"up":False, "down":False, "left":False, "right":False} def get_objectinfo(self): @@ -23,7 +22,7 @@ class GameObject(object): def render(self, screen:pygame.Surface): if(self.image is not None): - self.rect = screen.blit(self.image, (self.pos_x, self.pos_y, )) + self.rect = screen.blit(self.image, (self.pos_x, self.pos_y)) else: print("Kein Image hinterlegt!") return @@ -42,6 +41,7 @@ class Player(GameObject): self._speed = 10 self.screen = screen self.points = 0 + self.lifes = 2 def handle_input(self, event:pygame.event.EventType): if(event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT): @@ -113,24 +113,32 @@ class Player2(Player): print("Feuer!") self.fire(self.screen) - - - + def firecontrol(self, screen): + if(len(Projectile.shots) > 0): + for objects in Projectile.shots: + objects:dict + for key, object in objects.items(): + object:Projectile + if(key == "Enemy"): + object.animate("DOWN") + class Enemy(GameObject): - shots_fired = list() def __init__(self, name, pos_x, pos_y, width, height, screen, image=None) -> None: super().__init__(name, pos_x, pos_y, width, height, image) + self.screen = screen def fire(self, screen): #print("Schieße!!!!") - shot = Projectile("Enemy", self.pos_x+(self.width/2),self.pos_y+self.height,5,10, screen) - self.shots_fired.append(shot) + shot = Projectile("Enemy", self.pos_x+(self.width/2),self.pos_y+self.height,5,10, screen, 2) - def shoot(self): - if(len(self.shots_fired) > 0): - for shots in self.shots_fired: - shots:Projectile - shots.animate("DOWN") + def firecontrol(self, screen): + if(len(Projectile.shots) > 0): + for objects in Projectile.shots: + objects:dict + for key, object in objects.items(): + object:Projectile + if(key == "Enemy"): + object.animate("DOWN") def move(self, x=0, y=0): if(x != 0): @@ -140,15 +148,19 @@ class Enemy(GameObject): class Projectile(GameObject): shots = list() - def __init__(self, name, pos_x, pos_y, width, height, screen, image=None) -> None: + _id_count = 0 + def __init__(self, name, pos_x, pos_y, width, height, screen, speed:int=None, image=None) -> None: super().__init__(name, pos_x, pos_y, width, height, image) self.screen:pygame.Surface = screen - self.speed = 10 - + self._id_count += 1 + if speed is None: + self.speed = 10 + else: + self.speed = speed self.shot = {name:self} + #self.shot = {"id":self._id_count, name:self} self.shots.append(self.shot) - def animate(self, direction): self.rect = pygame.draw.rect(self.screen, (190,4,21), (self.pos_x, self.pos_y, self.width, self.height)) if(direction == "UP"): @@ -157,7 +169,6 @@ class Projectile(GameObject): self.pos_y += self.speed if(self.pos_y >= self.screen.get_size()[1]): pass - #print() class Item(GameObject): def __init__(self, name, pos_x, pos_y, width, height, image=None) -> None: diff --git a/test.py b/test.py index 64f603c..f4c9677 100644 --- a/test.py +++ b/test.py @@ -9,35 +9,36 @@ pygame.init() pygame.display.set_caption("TESTFENSTER") pygame.mouse.set_visible(True) #pygame.key.set_repeat(1, 30) -screen = pygame.display.set_mode((1024,768)) +screen = pygame.display.set_mode((1024,768)) #TODO Add fullscreen mode clock = pygame.time.Clock() image_enemy = Utils.load_image("Rastergrafik.png") testimage = Utils.load_image("Rastergrafik.png") -font1 = pygame.font.SysFont("Arial", 32) +font1 = pygame.font.Font("/usr/share/fonts/TTF/Inconsolata-UltraExpandedExtraBold.ttf", 30) #testimage.set_colorkey((255,0,255), pygame.RLEACCELOK) -enemy = GameObject.Enemy("Enemy-1", (screen.get_size()[0]/2) -30,30,35,35, screen, testimage) player1 = GameObject.Player("Player", screen,(screen.get_size()[0]/2)-17, screen.get_size()[1]-100, 35, 35, testimage) player2 = GameObject.Player2("Player2", screen,(screen.get_size()[0]/2)-17, screen.get_size()[1]-100, 35, 35, testimage) - spawned_enemys = list() - i = 0 -startpos_x = 0 -for enemys in range(15): - spawned_enemys.append(GameObject.Enemy(F"Enemy-{i}", startpos_x,30,35,35, screen, testimage)) - startpos_x += 50 - i += 1 +startpos_x = 50 +startpos_y = 30 +for enemys in range(80): + tmp = GameObject.Enemy(F"Enemy-{i}", startpos_x,startpos_y,35,35, screen, testimage) + if(startpos_x >= (screen.get_size()[0]-150)): + startpos_y += 50 + startpos_x = 0 + spawned_enemys.append(tmp) + startpos_x += 50 + + i += 1 gamestate = True -pos_x = 50 -pos_y = 50 while(gamestate): @@ -82,30 +83,44 @@ while(gamestate): player1.firecontrol(screen) player2.firecontrol(screen) + + + print("Spieler1 Lifes: ", player1.lifes) + print("Spieler2 Lifes: ", player2.lifes) for projectiles in GameObject.Projectile.shots: projectiles:dict for key, projectile in projectiles.items(): projectile:GameObject.Projectile #Check if player hits an enemy delete it - print(projectile.rect) for enemy in spawned_enemys: enemy:GameObject.Enemy if(pygame.Rect.colliderect(projectile.rect, enemy.rect)): - print("HIT") - player1.points += 10 - player2.points += 10 - index = spawned_enemys.index(enemy) - del spawned_enemys[index] - index = GameObject.Projectile.shots.index(projectiles) - del GameObject.Projectile.shots[index] - print(F"Player-Points: {player1.points}") - print(F"Player-Points: {player2.points}") + #print("HIT") + #Check if only a playerhit despawn enemys + if(projectile.name == "Player" or projectile.name == "Player2"): + player1.points += 10 + player2.points += 10 + index = spawned_enemys.index(enemy) + del spawned_enemys[index] + index = GameObject.Projectile.shots.index(projectiles) + del GameObject.Projectile.shots[index] + print(F"Player-Points: {player1.points}") + print(F"Player-Points: {player2.points}") + + #TODO Buggy pygame colliderect is true until projectile passed the hole playrect + # Life decrease only once! if(pygame.Rect.colliderect(projectile.rect, player1.rect)): - print("Game-Over") + #print("Game-Over") + player1.lifes -= 1 + index = GameObject.Projectile.shots.index(projectiles) + del GameObject.Projectile.shots[index] #TODO Add Gameover event if(pygame.Rect.colliderect(projectile.rect, player2.rect)): - print("Game-Over") + #print("Game-Over") + player2.lifes -= 1 + index = GameObject.Projectile.shots.index(projectiles) + del GameObject.Projectile.shots[index] #TODO Add Gameover event #Check for bullets out of playground and delete it @@ -119,22 +134,21 @@ while(gamestate): rand = random.randint(0, 100) for enemy in spawned_enemys: - enemy:GameObject.Enemy - - if rand == 50: - enemy.fire(screen) - if rand == 20: + enemy:GameObject.Enemy + if rand == 20: enemy.move(5) - if rand == 50: - enemy.move(-5) - enemy.shoot() - enemy.render(screen) - - + if rand == 50: + enemy.move(-5) + rand1 = random.randint(0, 1000) + if rand1 == 50: + enemy.fire(screen) + enemy.render(screen) + + enemy.firecontrol(screen) + label1 = font1.render(F"Score: {player1.points}", True, (255,0,0)) screen.blit(label1, ((screen.get_size()[0]/2)-(label1.get_size()[0]/2), screen.get_size()[1]-50)) - #if(mouse_pos <= (image.topleft+image.size) and mouse_pos >= image.topleft): # print("HIIIIITTT!!!!")