""" Main game class """ import pygame import random from collections import deque from Player import Player from StandingEnemy import StandingEnemy from FlyingEnemy import FlyingEnemy from Cloud import Cloud from Floor import Floor class Drakora(): def getGameSpeed(self): return self.__gameSpeed def getScore(self): return self.__score def getScreenWidth(self): return self.screenSize[0] def getScreenHeight(self): return self.screenSize[1] def getFloorHeight(self): return self.floorHeight def addScore(self, score): self.__score += score if self.__score%self.speedUpRate == 0: self.__gameSpeed += self.__score/self.speedUpRate self.speedUpLabelCD = self.targetFps def newGame(self): for enemy in self.enemies: enemy.kill() if self.player: self.player.kill() self.player = Player() self.sprites.add(self.player) self.__score = 0 self.isGameOver = False self.isPaused = False self.__gameSpeed = 2 self.enemyCount = 0 self.enemyChance = 100.0 self.speedUpLabelCD = 0 self.nextEnemyMustBeFlying = False self.enemyCD = self.getNextEnemyCD() def __init__(self): self.buttonsPause = (pygame.K_p,) self.buttonsQuit = (pygame.K_F10,) self.buttonsNewGame = (pygame.K_RETURN,) self.screenSize = (800, 600) self.targetFps = 120 self.floorHeight = 50 self.floors = pygame.sprite.Group() self.enemies = pygame.sprite.Group() self.clouds = pygame.sprite.Group() self.player = None self.speedUpRate = 25 self.godmodeCount = 0 self.isGodmode = False random.seed() pygame.init() self.screen = pygame.display.set_mode(self.screenSize) pygame.display.set_caption('Drakora') self.clock = pygame.time.Clock() self.sprites = pygame.sprite.Group() self.floors.add(Floor(self)) self.sprites.add(self.floors) 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.charKeys = { pygame.K_a:'a', pygame.K_b:'b', pygame.K_c:'c', pygame.K_d:'d', pygame.K_e:'e', pygame.K_f:'f', pygame.K_g:'g', pygame.K_h:'h', pygame.K_i:'i', pygame.K_j:'j', pygame.K_k:'k', pygame.K_l:'l', pygame.K_m:'m', pygame.K_n:'n', pygame.K_o:'o', pygame.K_p:'p', pygame.K_q:'q', pygame.K_r:'r', pygame.K_s:'s', pygame.K_t:'t', pygame.K_u:'u', pygame.K_v:'v', pygame.K_w:'w', pygame.K_x:'x', pygame.K_y:'y', pygame.K_z:'z', } self.pressedKeys = deque(maxlen=10) self.isPressedKeysUpdated = True self.newGame() def __del__(self): pygame.quit() def renderText(self, text, font, color, center): render = font.render(text, True, color) rect = render.get_rect() rect.center = center self.screen.blit(render, rect) def render(self): self.screen.fill((102, 153, 255)) self.sprites.draw(self.screen) self.floors.draw(self.screen) 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)) if self.isGodmode: self.renderText('godmode', self.fontGodmode, (255, 255, 255), (self.getScreenWidth()/2,40)) pressedKeysStr = ''.join(self.pressedKeys) self.renderText(pressedKeysStr, self.fontGodmode, (255, 255, 255), (self.getScreenWidth()/2,70)) pygame.display.flip() def getNextEnemyCD(self): if self.enemyCount == 0: return 1000 elif self.enemyCount <= 5: return 800 - 100*self.enemyCount elif self.enemyCount%self.speedUpRate == 0: return 1000 elif self.nextEnemyMustBeFlying: return 600 else: return 300 def collideCheck(self): if pygame.sprite.spritecollideany(self.player, self.enemies): if not self.isGodmode: self.isGameOver = True self.player.isOnFloor = False while pygame.sprite.spritecollideany(self.player, self.floors): self.player.isOnFloor = True self.player.rect.y -= 1 def doCheats(self): if self.isPressedKeysUpdated: pressedKeysStr = ''.join(self.pressedKeys) if pressedKeysStr.endswith('godmode'): self.isGodmode = not self.isGodmode self.isPressedKeysUpdated = False def logic(self): self.player.updateSpeed(self.__gameSpeed) for event in pygame.event.get(): self.player.control(event) if event.type == pygame.QUIT: return False elif event.type == pygame.KEYDOWN: if event.key in self.buttonsQuit: return False elif event.key in self.buttonsNewGame: if self.isGameOver or self.isGodmode: self.newGame() elif event.key in self.buttonsPause: self.isPaused = not self.isPaused elif event.type == pygame.KEYUP: if event.key in self.charKeys: self.pressedKeys.append(self.charKeys[event.key]) self.isPressedKeysUpdated = True self.doCheats() if not self.isGameOver and not self.isPaused: self.sprites.update() self.enemyCD -= self.__gameSpeed if random.randint(1, 200) == 1: cloud = Cloud(self) self.clouds.add(cloud) self.sprites.add(cloud) if self.enemyCD <= 0: self.enemyChance += (1/self.targetFps) * self.enemyChance/8 if random.randint(1, 150) < self.enemyChance: self.enemyCount += 1 self.enemyChance = 1 if self.nextEnemyMustBeFlying: enemy = FlyingEnemy(self) else: enemy = StandingEnemy(self) if self.__score < 10: self.nextEnemyMustBeFlying = False elif self.__score < 20: self.nextEnemyMustBeFlying = random.randint(1, 100) > 95 elif self.__score < 40: self.nextEnemyMustBeFlying = random.randint(1, 100) > 85 else: self.nextEnemyMustBeFlying = random.randint(1, 100) > 75 self.enemyCD = self.getNextEnemyCD() self.enemies.add(enemy) self.sprites.add(enemy) self.collideCheck() return True def play(self): isRunning = True while isRunning: self.clock.tick(self.targetFps) self.render() isRunning = self.logic() if __name__ == '__main__': drakora = Drakora() drakora.play() del Drakora