Init leaderboard menu

This commit is contained in:
Nikolya Andreychik
2021-04-04 10:20:21 -07:00
parent 5fb2195861
commit d986804c64
3 changed files with 199 additions and 21 deletions
+25 -10
View File
@@ -13,6 +13,7 @@ from StandingEnemy import StandingEnemy
from FlyingEnemy import FlyingEnemy from FlyingEnemy import FlyingEnemy
from Cloud import Cloud from Cloud import Cloud
from Floor import Floor from Floor import Floor
from EndSceen import EndSceen
class Drakora(): class Drakora():
@@ -55,6 +56,13 @@ class Drakora():
self.speedUp() self.speedUp()
self.speedUpLabelCD = self.targetFps self.speedUpLabelCD = self.targetFps
def getFont(self):
return self.font
def getTime(self):
return self.time
def newGame(self): def newGame(self):
for enemy in self.enemies: for enemy in self.enemies:
@@ -87,6 +95,9 @@ class Drakora():
self.speedDownCheatLabelCD = 0 self.speedDownCheatLabelCD = 0
self.speedResetCheatLabelCD = 0 self.speedResetCheatLabelCD = 0
self.time = 0
self.endSceen.newEndScreen()
def __init__(self): def __init__(self):
random.seed() random.seed()
@@ -121,10 +132,10 @@ class Drakora():
self.drawBoxes = False self.drawBoxes = False
font = pygame.font.match_font('liberation mono') self.font = pygame.font.match_font('liberation mono')
self.fontScore = pygame.font.Font(font, 32) self.fontScore = pygame.font.Font(self.font, 32)
self.fontMessage = pygame.font.Font(font, 56) self.fontMessage = pygame.font.Font(self.font, 56)
self.fontGodmode = pygame.font.Font(font, 12) self.fontGodmode = pygame.font.Font(self.font, 12)
self.charKeys = { self.charKeys = {
pygame.K_a:'a', pygame.K_b:'b', pygame.K_c:'c', pygame.K_d:'d', 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.pressedKeys = deque(maxlen=10)
self.isPressedKeysUpdated = True self.isPressedKeysUpdated = True
self.endSceen = EndSceen(self)
self.newGame() self.newGame()
@@ -167,15 +180,14 @@ class Drakora():
for floor in self.floors: for floor in self.floors:
pygame.draw.rect(self.screen, (255, 0, 0), floor.rect, 1) pygame.draw.rect(self.screen, (255, 0, 0), floor.rect, 1)
if self.isGameOver:
self.endSceen.render();
else:
self.renderText('%d'%(self.__score), self.renderText('%d'%(self.__score),
self.fontScore, (255, 255, 255), self.fontScore, (255, 255, 255),
(self.getScreenWidth()/2,20)) (self.getScreenWidth()/2,20))
if self.isGameOver: if self.isPaused:
self.renderText('GAME OVER',
self.fontMessage, (255, 255, 255),
tuple(i/2 for i in self.screenSize))
elif self.isPaused:
self.renderText('PAUSED', self.renderText('PAUSED',
self.fontMessage, (255, 255, 255), self.fontMessage, (255, 255, 255),
tuple(i/2 for i in self.screenSize)) tuple(i/2 for i in self.screenSize))
@@ -267,6 +279,7 @@ class Drakora():
for event in pygame.event.get(): for event in pygame.event.get():
self.player.control(event) self.player.control(event)
self.endSceen.control(event)
if event.type == pygame.QUIT: if event.type == pygame.QUIT:
return False return False
@@ -275,7 +288,7 @@ class Drakora():
if event.key in self.buttonsQuit: if event.key in self.buttonsQuit:
return False return False
elif event.key in self.buttonsNewGame: 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: elif event.key in self.buttonsPause:
self.isPaused = not self.isPaused self.isPaused = not self.isPaused
@@ -287,6 +300,8 @@ class Drakora():
self.doCheats() self.doCheats()
if not self.isGameOver and not self.isPaused: if not self.isGameOver and not self.isPaused:
self.time += 1/self.targetFps
for cloudGroup in self.cloudGroups: cloudGroup.update() for cloudGroup in self.cloudGroups: cloudGroup.update()
self.enemies.update() self.enemies.update()
self.players.update() self.players.update()
+158
View File
@@ -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()
+5
View File
@@ -0,0 +1,5 @@
Kolya 1 11.37
Coolguy 1 10.75
Wow 74 185.72
Player 0 7.16
Cheater 1000 0.01