diff --git a/Drakora.pyw b/Drakora.pyw index 16e9a65..8c44d97 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -13,6 +13,7 @@ from StandingEnemy import StandingEnemy from FlyingEnemy import FlyingEnemy from Cloud import Cloud from Floor import Floor +from EndSceen import EndSceen class Drakora(): @@ -55,6 +56,13 @@ class Drakora(): self.speedUp() self.speedUpLabelCD = self.targetFps + def getFont(self): + return self.font + + + def getTime(self): + return self.time + def newGame(self): for enemy in self.enemies: @@ -87,6 +95,9 @@ class Drakora(): self.speedDownCheatLabelCD = 0 self.speedResetCheatLabelCD = 0 + self.time = 0 + self.endSceen.newEndScreen() + def __init__(self): random.seed() @@ -121,10 +132,10 @@ class Drakora(): self.drawBoxes = False - font = pygame.font.match_font('liberation mono') - self.fontScore = pygame.font.Font(font, 32) - self.fontMessage = pygame.font.Font(font, 56) - self.fontGodmode = pygame.font.Font(font, 12) + self.font = pygame.font.match_font('liberation mono') + self.fontScore = pygame.font.Font(self.font, 32) + self.fontMessage = pygame.font.Font(self.font, 56) + self.fontGodmode = pygame.font.Font(self.font, 12) self.charKeys = { pygame.K_a:'a', pygame.K_b:'b', pygame.K_c:'c', pygame.K_d:'d', @@ -138,6 +149,8 @@ class Drakora(): self.pressedKeys = deque(maxlen=10) self.isPressedKeysUpdated = True + self.endSceen = EndSceen(self) + self.newGame() @@ -167,23 +180,22 @@ class Drakora(): for floor in self.floors: pygame.draw.rect(self.screen, (255, 0, 0), floor.rect, 1) - self.renderText('%d'%(self.__score), - self.fontScore, (255, 255, 255), - (self.getScreenWidth()/2,20)) - if self.isGameOver: - self.renderText('GAME OVER', - self.fontMessage, (255, 255, 255), - tuple(i/2 for i in self.screenSize)) - elif self.isPaused: - self.renderText('PAUSED', - self.fontMessage, (255, 255, 255), - tuple(i/2 for i in self.screenSize)) - elif self.speedUpLabelCD > 0: - self.speedUpLabelCD -= 1 - self.renderText('SPEED UP', - self.fontMessage, (255, 255, 255), - tuple(i/2 for i in self.screenSize)) + self.endSceen.render(); + else: + self.renderText('%d'%(self.__score), + self.fontScore, (255, 255, 255), + (self.getScreenWidth()/2,20)) + + if self.isPaused: + self.renderText('PAUSED', + self.fontMessage, (255, 255, 255), + tuple(i/2 for i in self.screenSize)) + elif self.speedUpLabelCD > 0: + self.speedUpLabelCD -= 1 + self.renderText('SPEED UP', + self.fontMessage, (255, 255, 255), + tuple(i/2 for i in self.screenSize)) if self.isGodmode: self.renderText('godmode', @@ -267,6 +279,7 @@ class Drakora(): for event in pygame.event.get(): self.player.control(event) + self.endSceen.control(event) if event.type == pygame.QUIT: return False @@ -275,7 +288,7 @@ class Drakora(): if event.key in self.buttonsQuit: return False elif event.key in self.buttonsNewGame: - if self.isGameOver or self.isGodmode: self.newGame() + if self.isGodmode: self.newGame() elif event.key in self.buttonsPause: self.isPaused = not self.isPaused @@ -287,6 +300,8 @@ class Drakora(): self.doCheats() if not self.isGameOver and not self.isPaused: + self.time += 1/self.targetFps + for cloudGroup in self.cloudGroups: cloudGroup.update() self.enemies.update() self.players.update() diff --git a/EndSceen.py b/EndSceen.py new file mode 100644 index 0000000..27d3e9b --- /dev/null +++ b/EndSceen.py @@ -0,0 +1,158 @@ +""" +Enemy entity class +""" + + +import pygame + + +class EndSceen(): + def __init__(self, mainGameClass): + self.fontGameOver = pygame.font.Font(mainGameClass.getFont(), 56) + self.fontLeaderBoard = pygame.font.Font(mainGameClass.getFont(), 30) + self.fontLeaderBoardActive = pygame.font.Font(mainGameClass.getFont(), 30) + self.fontLeaderBoardActive.underline = True + self.game = mainGameClass + + def newEndScreen(self): + self.playerName = 'Player' + + self.scoresFromFile = [] + self.data = [] + + self.isBackButton = True + + fileWithData = open('leaders.txt') + + for line in fileWithData: + oneStr = line.split() + + if (len(oneStr) == 3): + self.data.append([oneStr[0][:10], int(oneStr[1]), float(oneStr[2])]) + + fileWithData.close() + + self.sortedDataByScores = sorted(enumerate(self.data), key=lambda i: i[1][1], reverse=True) + + + def renderText(self, text, font, color, center): + render = font.render(text, True, color) + rect = render.get_rect() + rect.center = center + self.game.screen.blit(render, rect) + + def drawTableLB(self, number): + j = 1 + placeFlag = False + + for i in [i[0] for i in self.sortedDataByScores[:number]]: + # print(self.data[i]) + + if (self.game.getScore() > self.data[i][1] and not placeFlag): + self.renderText('>{0:3} {1:^10} {2:6d} {3:8.2f}'.format(j, self.playerName[:10], self.game.getScore(), self.game.getTime()), + self.fontLeaderBoard, (255, 255, 255), + (self.game.getScreenWidth()/2,100 + j*50)) + j += 1 + placeFlag = True + + if (j > number): + break + + formatDataForOnePlayer = ' {0:3} {1:^10} {2:6d} {3:8.2f}'.format(j, *self.data[i]) + + self.renderText(formatDataForOnePlayer, + self.fontLeaderBoard, (255, 255, 255), + (self.game.getScreenWidth()/2,100 + j*50)) + + j += 1 + + if (j > number): + break + + if not placeFlag and j <= number: + self.renderText('>{0:3} {1:^10} {2:6d} {3:8.2f}'.format(j, self.playerName[:10], self.game.getScore(), self.game.getTime()), + self.fontLeaderBoard, (255, 255, 255), + (self.game.getScreenWidth()/2,100 + j*50)) + + + self.renderText(' {0:^10} {1:>6} {2:>8}'.format('.....', '..', '.....'), + self.fontLeaderBoard, (255, 255, 255), + (self.game.getScreenWidth()/2,100 + (number + 1)*50)) + + # for i in rows: + + def getScorePosition(self, score): + counter = 1 + for i in self.sortedDataByScores: + if i[1][1] < score: + return counter + else: + counter += 1 + return counter + + + def render(self): + self.renderText('GAME OVER', + self.fontGameOver, (255, 255, 255), + (self.game.getScreenWidth()/2,50)) + + self.renderText('Leaderboard', + self.fontLeaderBoard, (255, 255, 255), + (self.game.getScreenWidth()/2,100)) + + self.drawTableLB(5) + + self.renderText(' {0:3d} {1:^10} {2:6d} {3:8.2f}'.format(self.getScorePosition(self.game.getScore()), self.playerName[:10], self.game.getScore(), self.game.getTime()), + self.fontLeaderBoard, (255, 255, 255), + (self.game.getScreenWidth()/2,100 + 5*50 + 50 + 50)) + + self.renderText('Back', + self.fontLeaderBoard if not self.isBackButton else self.fontLeaderBoardActive, (255, 255, 255), + (self.game.getScreenWidth()/2 - 100, self.game.getScreenHeight() - 80)) + + self.renderText('Continue', + self.fontLeaderBoard if self.isBackButton else self.fontLeaderBoardActive, (255, 255, 255), + (self.game.getScreenWidth()/2 + 100, self.game.getScreenHeight() - 80)) + + def control(self, event): + if event.type == pygame.KEYDOWN and self.game.isGameOver: + if event.key == pygame.K_RIGHT: + self.isBackButton = False + + elif event.key == pygame.K_LEFT: + self.isBackButton = True + + elif event.key == pygame.K_RETURN: + self.saveResults() + + if self.isBackButton: + self.game.newGame() + else: + self.game.newGame() + + elif event.key == pygame.K_BACKSPACE: + self.playerName = self.playerName[:len(self.playerName) - 1] + + elif len(pygame.key.name(event.key)) == 1 and len(self.playerName) < 10: + if pygame.key.get_mods() & pygame.KMOD_LSHIFT: + self.playerName += pygame.key.name(event.key).upper() + else: + self.playerName += pygame.key.name(event.key).lower() + # self.playerName += self.game.charKeys[event.key] + + def saveResults(self): + with open ('leaders.txt', 'r') as fileWithData: + tmpData = fileWithData.readlines() + fileWithData.close() + + newData = [] + for line in tmpData: + if len(line.split()) == 3: + if not (line.split()[0].rstrip() == self.playerName.rstrip()): + newData.append(line) + + newData.append('{0} {1} {2:.2f}\n'.format(self.playerName, self.game.getScore(), self.game.getTime())) + + with open ('leaders.txt', 'w') as fileWithData: + fileWithData.writelines(newData) + fileWithData.close() diff --git a/leaders.txt b/leaders.txt new file mode 100644 index 0000000..9e0f24f --- /dev/null +++ b/leaders.txt @@ -0,0 +1,5 @@ +Kolya 1 11.37 +Coolguy 1 10.75 +Wow 74 185.72 +Player 0 7.16 +Cheater 1000 0.01