From 05197680c8ab0c74a2006ea0e2ba53d81c80a0ef Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Sat, 27 Mar 2021 12:53:56 +0300 Subject: [PATCH 01/12] Added class for game logic --- Drakora.pyw | 375 ++++++++++++++++++++++++++-------------------------- 1 file changed, 190 insertions(+), 185 deletions(-) diff --git a/Drakora.pyw b/Drakora.pyw index 7526c32..97fdf3c 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -4,46 +4,22 @@ First test Pygame project Written in Python 3.X using Pygame library """ + import pygame import random -buttonsPause = (pygame.K_p,) -buttonsQuit = (pygame.K_F10,) -buttonsNewGame = (pygame.K_RETURN,) -buttonsJump = (pygame.K_UP, pygame.K_SPACE,) -buttonsCrouch = (pygame.K_DOWN,) - -screenSize = (800, 600) -targetFps = 60 - -floorHeight = 50 - -gameSpeed = 0.0 -score = 0 -isGameOver = False -isPaused = False - -isDownJump = False -isDownCrouch = False - -enemyCD = 0 -enemyChance = 0.0 - -floors = pygame.sprite.Group() -enemies = pygame.sprite.Group() -clouds = pygame.sprite.Group() -player = None class Floor(pygame.sprite.Sprite): - def __init__(self): + def __init__(self, screenSize, floorHeight): pygame.sprite.Sprite.__init__(self) self.image = pygame.Surface((screenSize[0], floorHeight)) self.image.fill((255, 204, 102)) self.rect = self.image.get_rect() self.rect.center = (screenSize[0]/2, screenSize[1]-floorHeight/2) + class Cloud(pygame.sprite.Sprite): - def __init__(self): + def __init__(self, screenSize, gameSpeed): pygame.sprite.Sprite.__init__(self) self.image = pygame.Surface((random.randint(150, 350), random.randint(50, 150))) @@ -54,12 +30,12 @@ class Cloud(pygame.sprite.Sprite): self.rect.center = (screenSize[0] + self.rect.width, screenSize[1]/2 - random.randint(100, screenSize[1]/2-100)) - self.speed = random.randint(150, 300)/100 + self.speed = random.randint(150, 300)/100*gameSpeed + def update(self): - self.rect.x -= gameSpeed*self.speed - if (self.rect.x < -self.rect.width): - self.kill() + self.rect.x -= self.speed + class Player(pygame.sprite.Sprite): def __init__(self): @@ -72,66 +48,30 @@ class Player(pygame.sprite.Sprite): self.isJumping = False self.isCrouching = False self.hoverCount = 0 + self.isOnFloor = False + def crouch(self): if not self.isCrouching: self.isCrouching = True self.rect = self.rect.inflate(0, -25) + def standup(self): if self.isCrouching: self.isCrouching = False self.rect = self.rect.inflate(0, 25) + def update(self): - global isGameOver - - if pygame.sprite.spritecollideany(player, enemies): - isGameOver = True - pass - if not self.speed: self.rect.y += 1 self.speed += 0.35 self.rect.y += self.speed - isOnFloor = False - while pygame.sprite.spritecollideany(player, floors): - isOnFloor = True - self.rect.y -= 1 - - if not isDownJump: - self.hoverCount = 0 - - if isOnFloor: - self.speed = 0 - - if isDownJump: - self.isJumping = True - - if self.isCrouching: - self.standup() - - elif isDownCrouch: - if not self.isCrouching: - self.crouch() - - elif self.isCrouching: - self.standup() - - - if self.isJumping: - if isDownJump and self.hoverCount < 10: - self.speed -= 1 - self.speed/(15+self.hoverCount*3) - self.hoverCount += 1 - - else: - self.isJumping = False - - class Enemy(pygame.sprite.Sprite): - def setNextEnemyType(self): + def setNextEnemyType(self, score): if score < 10: self.type = 1 @@ -147,16 +87,20 @@ class Enemy(pygame.sprite.Sprite): if random.randint(1, 100) < 75: self.type = 1 else: self.type = 2 + def setNextEnemySubtype(self): if self.type == 1: self.subtype = random.randint(1, 5) elif self.type == 2: self.subtype = random.randint(1, 3) - def __init__(self): + + def __init__(self, screenSize, floorHeight, gameSpeed, score): pygame.sprite.Sprite.__init__(self) - self.setNextEnemyType() + self.speed = gameSpeed + + self.setNextEnemyType(score) self.setNextEnemySubtype() self.height = screenSize[1] - floorHeight @@ -181,142 +125,203 @@ class Enemy(pygame.sprite.Sprite): self.rect.center = (screenSize[0] + self.rect.width, self.height) + def update(self): - global score, gameSpeed - self.rect.x -= gameSpeed - if (self.rect.x < -self.rect.width): - self.kill() - score += 1 - gameSpeed += 0.025 - -def newGame(): - global player, floor, enemies, sprites, score - global gameSpeed, isGameOver, enemyCD, enemyChance - - for enemy in enemies: - enemy.kill() - - if player: player.kill() - - player = Player() - sprites.add(player) - - gameSpeed = 3.0 - score = 0 - isGameOver = False - isPaused = False - - enemyCD = 0 - enemyChance = 100.0 + self.rect.x -= self.speed -def init(): - global player, floor, enemies, sprites, score +class Drakora(): + def newGame(self): + for enemy in self.enemies: + enemy.kill() - random.seed() - pygame.init() - screen = pygame.display.set_mode(screenSize) - pygame.display.set_caption('Drakora') - clock = pygame.time.Clock() + if self.player: self.player.kill() - sprites = pygame.sprite.Group() - floors.add(Floor()) - sprites.add(floors) + self.player = Player() + self.sprites.add(self.player) - newGame() + self.score = 0 + self.isGameOver = False + self.isPaused = False - return screen, clock, sprites + self.gameSpeed = 3 -def deinit(): - pygame.quit() + self.enemyCD = 0 + self.enemyChance = 100.0 -def render(screen, sprites): - screen.fill((102, 153, 255)) - sprites.draw(screen) - font = pygame.font.Font(pygame.font.match_font('liberation mono'), 32) - text = font.render('%d'%(score), True, (255, 255, 255)) - rect = text.get_rect() - rect.midtop = (rect.width/2+10,10) - screen.blit(text, rect) + def __init__(self): + self.buttonsPause = (pygame.K_p,) + self.buttonsQuit = (pygame.K_F10,) + self.buttonsNewGame = (pygame.K_RETURN,) + self.buttonsJump = (pygame.K_UP, pygame.K_SPACE,) + self.buttonsCrouch = (pygame.K_DOWN,) - if isGameOver: - font = pygame.font.Font(pygame.font.match_font('liberation mono'), 56) - text = font.render('GAME OVER', True, (255, 255, 255)) + self.screenSize = (800, 600) + self.targetFps = 60 + + self.floorHeight = 50 + + self.isDownJump = False + self.isDownCrouch = False + + self.floors = pygame.sprite.Group() + self.enemies = pygame.sprite.Group() + self.clouds = pygame.sprite.Group() + self.player = None + + 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.screenSize, self.floorHeight)) + self.sprites.add(self.floors) + + self.newGame() + + + def __del__(self): + pygame.quit() + + + def render(self): + self.screen.fill((102, 153, 255)) + self.sprites.draw(self.screen) + + font = pygame.font.Font(pygame.font.match_font('liberation mono'), 32) + text = font.render('%d'%(self.score), True, (255, 255, 255)) rect = text.get_rect() - rect.midtop = tuple(i/2 for i in screenSize) - screen.blit(text, rect) - elif isPaused: - font = pygame.font.Font(pygame.font.match_font('liberation mono'), 56) - text = font.render('PAUSED', True, (255, 255, 255)) - rect = text.get_rect() - rect.midtop = tuple(i/2 for i in screenSize) - screen.blit(text, rect) + rect.midtop = (rect.width/2+10,10) + self.screen.blit(text, rect) + + if self.isGameOver: + font = pygame.font.Font(pygame.font.match_font('liberation mono'), 56) + text = font.render('GAME OVER', True, (255, 255, 255)) + rect = text.get_rect() + rect.midtop = tuple(i/2 for i in self.screenSize) + self.screen.blit(text, rect) + elif self.isPaused: + font = pygame.font.Font(pygame.font.match_font('liberation mono'), 56) + text = font.render('PAUSED', True, (255, 255, 255)) + rect = text.get_rect() + rect.midtop = tuple(i/2 for i in self.screenSize) + self.screen.blit(text, rect) + + pygame.display.flip() - pygame.display.flip() + def collideCheck(self): + if pygame.sprite.spritecollideany(self.player, self.enemies): + self.isGameOver = True + + for enemy in self.enemies: + if (enemy.rect.x < -enemy.rect.width): + enemy.kill() + self.score += 1 + self.gameSpeed += 0.025 + for enemy in self.enemies: enemy.speed = self.gameSpeed + + for cloud in self.clouds: + if (cloud.rect.x < -cloud.rect.width): + cloud.kill() + + self.player.isOnFloor = False + while pygame.sprite.spritecollideany(self.player, self.floors): + self.player.isOnFloor = True + self.player.rect.y -= 1 + + if not self.isDownJump: + self.player.hoverCount = 0 + + if self.player.isOnFloor: + self.player.speed = 0 + + if self.isDownJump: + self.player.isJumping = True + + if self.player.isCrouching: + self.player.standup() + + elif self.isDownCrouch: + if not self.player.isCrouching: + self.player.crouch() + + elif self.player.isCrouching: + self.player.standup() + + if self.player.isJumping: + if self.isDownJump and self.player.hoverCount < 10: + self.player.speed -= 1 - self.player.speed/(15+ + self.player.hoverCount*3) + self.player.hoverCount += 1 + + else: + self.player.isJumping = False -def logic(clock, sprites): - global enemyCD, enemyChance, isDownJump, isDownCrouch, isPaused - - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False - - elif event.type == pygame.KEYDOWN: - if event.key in buttonsQuit: + def logic(self): + for event in pygame.event.get(): + if event.type == pygame.QUIT: return False - if event.key in buttonsCrouch: - isDownCrouch = True - elif event.key in buttonsJump: - isDownJump = True - elif event.key in buttonsNewGame: - if isGameOver: newGame() - elif event.key in buttonsPause: - isPaused = not isPaused - elif event.type == pygame.KEYUP: - if event.key in buttonsCrouch: - isDownCrouch = False - if event.key in buttonsJump: - isDownJump = False + elif event.type == pygame.KEYDOWN: + if event.key in self.buttonsQuit: + return False + if event.key in self.buttonsCrouch: + self.isDownCrouch = True + elif event.key in self.buttonsJump: + self.isDownJump = True + elif event.key in self.buttonsNewGame: + if self.isGameOver: self.newGame() + elif event.key in self.buttonsPause: + self.isPaused = not self.isPaused - if not isGameOver and not isPaused: - sprites.update() + elif event.type == pygame.KEYUP: + if event.key in self.buttonsCrouch: + self.isDownCrouch = False + if event.key in self.buttonsJump: + self.isDownJump = False - enemyCD -= gameSpeed + if not self.isGameOver and not self.isPaused: + self.sprites.update() - if random.randint(1, 100) == 1: - cloud = Cloud() - clouds.add(cloud) - sprites.add(cloud) + self.enemyCD -= self.gameSpeed - if enemyCD <= 0: - enemyChance += (1/targetFps) * enemyChance/8 + if random.randint(1, 100) == 1: + cloud = Cloud(self.screenSize, self.gameSpeed) + self.clouds.add(cloud) + self.sprites.add(cloud) - if random.randint(1, 100) < enemyChance: - enemyCD = 200 - enemyChance = 1 - enemy = Enemy() - enemies.add(enemy) - sprites.add(enemy) + if self.enemyCD <= 0: + self.enemyChance += (1/self.targetFps) * self.enemyChance/8 + + if random.randint(1, 100) < self.enemyChance: + self.enemyCD = 200 + self.enemyChance = 1 + enemy = Enemy(self.screenSize, self.floorHeight, + self.gameSpeed, self.score) + self.enemies.add(enemy) + self.sprites.add(enemy) + + self.collideCheck() + + self.clock.tick(self.targetFps) + + return True - clock.tick(targetFps) + def play(self): + isRunning = True - return True + while isRunning: + isRunning = self.logic() + self.render() -def main_loop(screen, clock, sprites): - global isGameOver - - isRunning = True - - while isRunning: - isRunning = logic(clock, sprites) - render(screen, sprites) if __name__ == '__main__': - screen, clock, sprites = init() - main_loop(screen, clock, sprites) - deinit() + drakora = Drakora() + drakora.play() + del Drakora From f861763c277edefd07103d6949a80707b34c5765 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Sat, 27 Mar 2021 14:03:17 +0300 Subject: [PATCH 02/12] Added renderText() func --- Drakora.pyw | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/Drakora.pyw b/Drakora.pyw index 97fdf3c..888d3c4 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -73,7 +73,7 @@ class Player(pygame.sprite.Sprite): class Enemy(pygame.sprite.Sprite): def setNextEnemyType(self, score): if score < 10: - self.type = 1 + self.type = 2 elif score < 25: if random.randint(1, 100) < 95: self.type = 1 @@ -92,7 +92,7 @@ class Enemy(pygame.sprite.Sprite): if self.type == 1: self.subtype = random.randint(1, 5) elif self.type == 2: - self.subtype = random.randint(1, 3) + self.subtype = random.randint(1, 7) def __init__(self, screenSize, floorHeight, gameSpeed, score): @@ -121,13 +121,16 @@ class Enemy(pygame.sprite.Sprite): self.image = pygame.Surface((50, 25)) self.image.fill((51, 51, 0)) self.rect = self.image.get_rect() - self.height -= self.rect.height/2 + 10 + 25*self.subtype + self.height -= self.rect.height/2 + 10 + 10*self.subtype self.rect.center = (screenSize[0] + self.rect.width, self.height) def update(self): - self.rect.x -= self.speed + if self.type == 1: + self.rect.x -= self.speed + else: + self.rect.x -= self.speed*2 class Drakora(): @@ -180,6 +183,10 @@ class Drakora(): self.floors.add(Floor(self.screenSize, self.floorHeight)) 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.newGame() @@ -187,28 +194,29 @@ class Drakora(): 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) - font = pygame.font.Font(pygame.font.match_font('liberation mono'), 32) - text = font.render('%d'%(self.score), True, (255, 255, 255)) - rect = text.get_rect() - rect.midtop = (rect.width/2+10,10) - self.screen.blit(text, rect) + self.renderText('%d'%(self.score), + self.fontScore, (255, 255, 255), + (self.screenSize[0]/2,20)) if self.isGameOver: - font = pygame.font.Font(pygame.font.match_font('liberation mono'), 56) - text = font.render('GAME OVER', True, (255, 255, 255)) - rect = text.get_rect() - rect.midtop = tuple(i/2 for i in self.screenSize) - self.screen.blit(text, rect) + self.renderText('GAME OVER', + self.fontMessage, (255, 255, 255), + tuple(i/2 for i in self.screenSize)) elif self.isPaused: - font = pygame.font.Font(pygame.font.match_font('liberation mono'), 56) - text = font.render('PAUSED', True, (255, 255, 255)) - rect = text.get_rect() - rect.midtop = tuple(i/2 for i in self.screenSize) - self.screen.blit(text, rect) + self.renderText('PAUSED', + self.fontMessage, (255, 255, 255), + tuple(i/2 for i in self.screenSize)) pygame.display.flip() @@ -222,6 +230,7 @@ class Drakora(): enemy.kill() self.score += 1 self.gameSpeed += 0.025 + """Quick fix of running cacti. Some good fix needed""" for enemy in self.enemies: enemy.speed = self.gameSpeed for cloud in self.clouds: From 0a39f6be22ffc12cff54360266f6505431fa8cfe Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Sat, 27 Mar 2021 14:05:09 +0300 Subject: [PATCH 03/12] Fixed first enemies type --- Drakora.pyw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Drakora.pyw b/Drakora.pyw index 888d3c4..9c23e57 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -73,7 +73,7 @@ class Player(pygame.sprite.Sprite): class Enemy(pygame.sprite.Sprite): def setNextEnemyType(self, score): if score < 10: - self.type = 2 + self.type = 1 elif score < 25: if random.randint(1, 100) < 95: self.type = 1 From 74b757e3bfe83a07a2d5257295be134f6f2be858 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Sat, 27 Mar 2021 19:25:36 +0300 Subject: [PATCH 04/12] Tried to fix lags --- Drakora.pyw | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/Drakora.pyw b/Drakora.pyw index 9c23e57..ce62d3b 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -7,6 +7,10 @@ Written in Python 3.X using Pygame library import pygame import random +import time + + +timeDiff = 0 class Floor(pygame.sprite.Sprite): @@ -34,7 +38,7 @@ class Cloud(pygame.sprite.Sprite): def update(self): - self.rect.x -= self.speed + self.rect.x -= self.speed*timeDiff class Player(pygame.sprite.Sprite): @@ -66,8 +70,8 @@ class Player(pygame.sprite.Sprite): def update(self): if not self.speed: self.rect.y += 1 - self.speed += 0.35 - self.rect.y += self.speed + self.speed += 0.17 + self.rect.y += self.speed*timeDiff class Enemy(pygame.sprite.Sprite): @@ -128,9 +132,9 @@ class Enemy(pygame.sprite.Sprite): def update(self): if self.type == 1: - self.rect.x -= self.speed + self.rect.x -= self.speed*timeDiff else: - self.rect.x -= self.speed*2 + self.rect.x -= self.speed*2*timeDiff class Drakora(): @@ -147,7 +151,7 @@ class Drakora(): self.isGameOver = False self.isPaused = False - self.gameSpeed = 3 + self.gameSpeed = 2 self.enemyCD = 0 self.enemyChance = 100.0 @@ -161,7 +165,7 @@ class Drakora(): self.buttonsCrouch = (pygame.K_DOWN,) self.screenSize = (800, 600) - self.targetFps = 60 + self.targetFps = 120 self.floorHeight = 50 @@ -187,6 +191,8 @@ class Drakora(): self.fontScore = pygame.font.Font(font, 32) self.fontMessage = pygame.font.Font(font, 56) + self.timeOfLastFrameInNs = time.time_ns() + self.newGame() @@ -262,7 +268,7 @@ class Drakora(): self.player.standup() if self.player.isJumping: - if self.isDownJump and self.player.hoverCount < 10: + if self.isDownJump and self.player.hoverCount < 7: self.player.speed -= 1 - self.player.speed/(15+ self.player.hoverCount*3) self.player.hoverCount += 1 @@ -317,17 +323,21 @@ class Drakora(): self.collideCheck() - self.clock.tick(self.targetFps) - return True def play(self): - isRunning = True + global timeDiff + isRunning = True while isRunning: - isRunning = self.logic() + timeOfNewFrameInNs = time.time_ns() + timeDiff = (timeOfNewFrameInNs-self.timeOfLastFrameInNs)/10000000 + self.timeOfLastFrameInNs = timeOfNewFrameInNs + + self.clock.tick(self.targetFps) self.render() + isRunning = self.logic() if __name__ == '__main__': From 5509eabb725c527a0b61e92f9955c0b12ecce243 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Sat, 27 Mar 2021 20:54:39 +0300 Subject: [PATCH 05/12] Lag fix reverted. Minor changes --- Drakora.pyw | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/Drakora.pyw b/Drakora.pyw index ce62d3b..cc5a6e1 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -7,10 +7,6 @@ Written in Python 3.X using Pygame library import pygame import random -import time - - -timeDiff = 0 class Floor(pygame.sprite.Sprite): @@ -38,7 +34,7 @@ class Cloud(pygame.sprite.Sprite): def update(self): - self.rect.x -= self.speed*timeDiff + self.rect.x -= self.speed class Player(pygame.sprite.Sprite): @@ -71,7 +67,7 @@ class Player(pygame.sprite.Sprite): if not self.speed: self.rect.y += 1 self.speed += 0.17 - self.rect.y += self.speed*timeDiff + self.rect.y += self.speed class Enemy(pygame.sprite.Sprite): @@ -79,11 +75,11 @@ class Enemy(pygame.sprite.Sprite): if score < 10: self.type = 1 - elif score < 25: + elif score < 20: if random.randint(1, 100) < 95: self.type = 1 else: self.type = 2 - elif score < 50: + elif score < 40: if random.randint(1, 100) < 85: self.type = 1 else: self.type = 2 @@ -132,9 +128,9 @@ class Enemy(pygame.sprite.Sprite): def update(self): if self.type == 1: - self.rect.x -= self.speed*timeDiff + self.rect.x -= self.speed else: - self.rect.x -= self.speed*2*timeDiff + self.rect.x -= self.speed*2 class Drakora(): @@ -191,8 +187,6 @@ class Drakora(): self.fontScore = pygame.font.Font(font, 32) self.fontMessage = pygame.font.Font(font, 56) - self.timeOfLastFrameInNs = time.time_ns() - self.newGame() @@ -235,7 +229,8 @@ class Drakora(): if (enemy.rect.x < -enemy.rect.width): enemy.kill() self.score += 1 - self.gameSpeed += 0.025 + if self.score%25 == 0: + self.gameSpeed += 1 """Quick fix of running cacti. Some good fix needed""" for enemy in self.enemies: enemy.speed = self.gameSpeed @@ -305,7 +300,7 @@ class Drakora(): self.enemyCD -= self.gameSpeed - if random.randint(1, 100) == 1: + if random.randint(1, 150) == 1: cloud = Cloud(self.screenSize, self.gameSpeed) self.clouds.add(cloud) self.sprites.add(cloud) @@ -327,14 +322,8 @@ class Drakora(): def play(self): - global timeDiff - isRunning = True while isRunning: - timeOfNewFrameInNs = time.time_ns() - timeDiff = (timeOfNewFrameInNs-self.timeOfLastFrameInNs)/10000000 - self.timeOfLastFrameInNs = timeOfNewFrameInNs - self.clock.tick(self.targetFps) self.render() isRunning = self.logic() From 90ffbb6e099b08171d0bd7dd20899b0c3014fbde Mon Sep 17 00:00:00 2001 From: Nikolya Andreychik Date: Sat, 27 Mar 2021 14:26:05 -0700 Subject: [PATCH 06/12] Splitted Drakora.pyw for Enemy.py and Player.py Player.py - not final version, must be more function from Drakora added. Player - may be must control funtion included. --- Drakora.pyw | 145 ++++++++++------------------------------------------ Enemy.py | 70 +++++++++++++++++++++++++ Player.py | 34 ++++++++++++ 3 files changed, 131 insertions(+), 118 deletions(-) create mode 100644 Enemy.py create mode 100644 Player.py diff --git a/Drakora.pyw b/Drakora.pyw index cc5a6e1..92ce0fa 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -8,6 +8,9 @@ Written in Python 3.X using Pygame library import pygame import random +from Player import Player +from Enemy import Enemy + class Floor(pygame.sprite.Sprite): def __init__(self, screenSize, floorHeight): @@ -34,106 +37,25 @@ class Cloud(pygame.sprite.Sprite): def update(self): + if (self.rect.x < -self.rect.width): + self.kill() + self.rect.x -= self.speed - -class Player(pygame.sprite.Sprite): - def __init__(self): - pygame.sprite.Sprite.__init__(self) - self.image = pygame.Surface((50, 75)) - self.image.fill((153, 151, 0)) - self.rect = self.image.get_rect() - self.rect.center = (100, 400) - self.speed = 0.0 - self.isJumping = False - self.isCrouching = False - self.hoverCount = 0 - self.isOnFloor = False - - - def crouch(self): - if not self.isCrouching: - self.isCrouching = True - self.rect = self.rect.inflate(0, -25) - - - def standup(self): - if self.isCrouching: - self.isCrouching = False - self.rect = self.rect.inflate(0, 25) - - - def update(self): - if not self.speed: self.rect.y += 1 - - self.speed += 0.17 - self.rect.y += self.speed - - -class Enemy(pygame.sprite.Sprite): - def setNextEnemyType(self, score): - if score < 10: - self.type = 1 - - elif score < 20: - if random.randint(1, 100) < 95: self.type = 1 - else: self.type = 2 - - elif score < 40: - if random.randint(1, 100) < 85: self.type = 1 - else: self.type = 2 - - else: - if random.randint(1, 100) < 75: self.type = 1 - else: self.type = 2 - - - def setNextEnemySubtype(self): - if self.type == 1: - self.subtype = random.randint(1, 5) - elif self.type == 2: - self.subtype = random.randint(1, 7) - - - def __init__(self, screenSize, floorHeight, gameSpeed, score): - pygame.sprite.Sprite.__init__(self) - - self.speed = gameSpeed - - self.setNextEnemyType(score) - self.setNextEnemySubtype() - - self.height = screenSize[1] - floorHeight - - if self.type == 1: - if self.subtype == 1: self.image = pygame.Surface((25, 75)) - elif self.subtype == 2: self.image = pygame.Surface((25, 25)) - elif self.subtype == 3: self.image = pygame.Surface((75, 25)) - elif self.subtype == 4: self.image = pygame.Surface((50, 25)) - elif self.subtype == 5: self.image = pygame.Surface((50, 50)) - else: self.image = pygame.Surface((25, 50)) - - self.image.fill((0, 153, 0)) - self.rect = self.image.get_rect() - self.height -= self.rect.height/2 - - elif self.type == 2: - self.image = pygame.Surface((50, 25)) - self.image.fill((51, 51, 0)) - self.rect = self.image.get_rect() - self.height -= self.rect.height/2 + 10 + 10*self.subtype - - self.rect.center = (screenSize[0] + self.rect.width, self.height) - - - def update(self): - if self.type == 1: - self.rect.x -= self.speed - else: - self.rect.x -= self.speed*2 - - class Drakora(): + def getGameSpeed(self): + return self.__gameSpeed + + def getScore(self): + return self.__score + + def addScore(self, score): + self.__score += score + + if self.__score%25 == 0: + self.__gameSpeed += 1 + + def newGame(self): for enemy in self.enemies: enemy.kill() @@ -143,11 +65,11 @@ class Drakora(): self.player = Player() self.sprites.add(self.player) - self.score = 0 + self.__score = 0 self.isGameOver = False self.isPaused = False - self.gameSpeed = 2 + self.__gameSpeed = 2 self.enemyCD = 0 self.enemyChance = 100.0 @@ -205,7 +127,7 @@ class Drakora(): self.screen.fill((102, 153, 255)) self.sprites.draw(self.screen) - self.renderText('%d'%(self.score), + self.renderText('%d'%(self.__score), self.fontScore, (255, 255, 255), (self.screenSize[0]/2,20)) @@ -224,21 +146,9 @@ class Drakora(): def collideCheck(self): if pygame.sprite.spritecollideany(self.player, self.enemies): self.isGameOver = True - - for enemy in self.enemies: - if (enemy.rect.x < -enemy.rect.width): - enemy.kill() - self.score += 1 - if self.score%25 == 0: - self.gameSpeed += 1 - """Quick fix of running cacti. Some good fix needed""" - for enemy in self.enemies: enemy.speed = self.gameSpeed - - for cloud in self.clouds: - if (cloud.rect.x < -cloud.rect.width): - cloud.kill() - + self.player.isOnFloor = False + while pygame.sprite.spritecollideany(self.player, self.floors): self.player.isOnFloor = True self.player.rect.y -= 1 @@ -298,10 +208,10 @@ class Drakora(): if not self.isGameOver and not self.isPaused: self.sprites.update() - self.enemyCD -= self.gameSpeed + self.enemyCD -= self.__gameSpeed if random.randint(1, 150) == 1: - cloud = Cloud(self.screenSize, self.gameSpeed) + cloud = Cloud(self.screenSize, self.__gameSpeed) self.clouds.add(cloud) self.sprites.add(cloud) @@ -311,8 +221,7 @@ class Drakora(): if random.randint(1, 100) < self.enemyChance: self.enemyCD = 200 self.enemyChance = 1 - enemy = Enemy(self.screenSize, self.floorHeight, - self.gameSpeed, self.score) + enemy = Enemy(self.screenSize, self.floorHeight, self) self.enemies.add(enemy) self.sprites.add(enemy) diff --git a/Enemy.py b/Enemy.py new file mode 100644 index 0000000..6fb198c --- /dev/null +++ b/Enemy.py @@ -0,0 +1,70 @@ +import pygame +import random + +class Enemy(pygame.sprite.Sprite): + def setNextEnemyType(self, score): + if score < 10: + self.type = 1 + + elif score < 20: + if random.randint(1, 100) < 95: self.type = 1 + else: self.type = 2 + + elif score < 40: + if random.randint(1, 100) < 85: self.type = 1 + else: self.type = 2 + + else: + if random.randint(1, 100) < 75: self.type = 1 + else: self.type = 2 + + + def setNextEnemySubtype(self): + if self.type == 1: + self.subtype = random.randint(1, 5) + elif self.type == 2: + self.subtype = random.randint(1, 7) + + + def __init__(self, screenSize, floorHeight, mainGameClass): + pygame.sprite.Sprite.__init__(self) + + self.thisGame = mainGameClass + + self.speed = self.thisGame.getGameSpeed() + + self.setNextEnemyType(self.thisGame.getScore()) + self.setNextEnemySubtype() + + self.height = screenSize[1] - floorHeight + + if self.type == 1: + if self.subtype == 1: self.image = pygame.Surface((25, 75)) + elif self.subtype == 2: self.image = pygame.Surface((25, 25)) + elif self.subtype == 3: self.image = pygame.Surface((75, 25)) + elif self.subtype == 4: self.image = pygame.Surface((50, 25)) + elif self.subtype == 5: self.image = pygame.Surface((50, 50)) + else: self.image = pygame.Surface((25, 50)) + + self.image.fill((0, 153, 0)) + self.rect = self.image.get_rect() + self.height -= self.rect.height/2 + + elif self.type == 2: + self.image = pygame.Surface((50, 25)) + self.image.fill((51, 51, 0)) + self.rect = self.image.get_rect() + self.height -= self.rect.height/2 + 10 + 10*self.subtype + + self.rect.center = (screenSize[0] + self.rect.width, self.height) + + + def update(self): + if (self.rect.x < -self.rect.width): + self.kill() + self.thisGame.addScore(1) + + if self.type == 1: + self.rect.x -= self.speed + else: + self.rect.x -= self.speed*2 diff --git a/Player.py b/Player.py new file mode 100644 index 0000000..a514e30 --- /dev/null +++ b/Player.py @@ -0,0 +1,34 @@ +import pygame + +class Player(pygame.sprite.Sprite): + def __init__(self): + pygame.sprite.Sprite.__init__(self) + self.image = pygame.Surface((50, 75)) + self.image.fill((153, 151, 0)) + self.rect = self.image.get_rect() + self.rect.center = (100, 400) + self.speed = 0.0 + self.isJumping = False + self.isCrouching = False + self.hoverCount = 0 + self.isOnFloor = False + + + def crouch(self): + if not self.isCrouching: + self.isCrouching = True + self.rect = self.rect.inflate(0, -25) + + + def standup(self): + if self.isCrouching: + self.isCrouching = False + self.rect = self.rect.inflate(0, 25) + + + def update(self): + if not self.speed: self.rect.y += 1 + + self.speed += 0.17 + self.rect.y += self.speed + From 01d42cb80e8ef3e2ca14d32b5a5a10fdef6b09b4 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Sun, 28 Mar 2021 01:35:45 +0300 Subject: [PATCH 07/12] More splitting and minor changes --- Cloud.py | 30 ++++++++++++++++++++++++ Drakora.pyw | 66 ++++++++++++++++++++--------------------------------- Enemy.py | 14 ++++++++---- Floor.py | 18 +++++++++++++++ Player.py | 7 +++++- 5 files changed, 89 insertions(+), 46 deletions(-) create mode 100644 Cloud.py create mode 100644 Floor.py diff --git a/Cloud.py b/Cloud.py new file mode 100644 index 0000000..75446b9 --- /dev/null +++ b/Cloud.py @@ -0,0 +1,30 @@ +""" +Cloud entity class +""" + + +import pygame +import random + + +class Cloud(pygame.sprite.Sprite): + def __init__(self, mainGameClass): + pygame.sprite.Sprite.__init__(self) + self.image = pygame.Surface((random.randint(150, 350), + random.randint(50, 150))) + self.image.fill((random.randint(235, 255), + random.randint(235, 255), + random.randint(235, 255))) + self.rect = self.image.get_rect() + self.rect.center = (mainGameClass.getScreenWidth() + self.rect.width, + mainGameClass.getScreenHeight()/2 - + random.randint(100, + mainGameClass.getScreenHeight()/2-100)) + self.speed = random.randint(2, 4)*mainGameClass.getGameSpeed() + + + def update(self): + if (self.rect.x < -self.rect.width): + self.kill() + + self.rect.x -= self.speed diff --git a/Drakora.pyw b/Drakora.pyw index 92ce0fa..f9c1d26 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -1,7 +1,5 @@ """ -First test Pygame project - -Written in Python 3.X using Pygame library +Main game class """ @@ -10,45 +8,31 @@ import random from Player import Player from Enemy import Enemy +from Cloud import Cloud +from Floor import Floor -class Floor(pygame.sprite.Sprite): - def __init__(self, screenSize, floorHeight): - pygame.sprite.Sprite.__init__(self) - self.image = pygame.Surface((screenSize[0], floorHeight)) - self.image.fill((255, 204, 102)) - self.rect = self.image.get_rect() - self.rect.center = (screenSize[0]/2, screenSize[1]-floorHeight/2) - - -class Cloud(pygame.sprite.Sprite): - def __init__(self, screenSize, gameSpeed): - pygame.sprite.Sprite.__init__(self) - self.image = pygame.Surface((random.randint(150, 350), - random.randint(50, 150))) - self.image.fill((random.randint(235, 255), - random.randint(235, 255), - random.randint(235, 255))) - self.rect = self.image.get_rect() - self.rect.center = (screenSize[0] + self.rect.width, - screenSize[1]/2 - - random.randint(100, screenSize[1]/2-100)) - self.speed = random.randint(150, 300)/100*gameSpeed - - - def update(self): - if (self.rect.x < -self.rect.width): - self.kill() - - self.rect.x -= self.speed - 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 @@ -102,7 +86,7 @@ class Drakora(): self.clock = pygame.time.Clock() self.sprites = pygame.sprite.Group() - self.floors.add(Floor(self.screenSize, self.floorHeight)) + self.floors.add(Floor(self)) self.sprites.add(self.floors) font = pygame.font.match_font('liberation mono') @@ -129,7 +113,7 @@ class Drakora(): self.renderText('%d'%(self.__score), self.fontScore, (255, 255, 255), - (self.screenSize[0]/2,20)) + (self.getScreenWidth()/2,20)) if self.isGameOver: self.renderText('GAME OVER', @@ -146,7 +130,7 @@ class Drakora(): def collideCheck(self): if pygame.sprite.spritecollideany(self.player, self.enemies): self.isGameOver = True - + self.player.isOnFloor = False while pygame.sprite.spritecollideany(self.player, self.floors): @@ -210,18 +194,18 @@ class Drakora(): self.enemyCD -= self.__gameSpeed - if random.randint(1, 150) == 1: - cloud = Cloud(self.screenSize, self.__gameSpeed) + if random.randint(1, 50) == 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, 100) < self.enemyChance: - self.enemyCD = 200 + if random.randint(1, 150) < self.enemyChance: + self.enemyCD = 300 self.enemyChance = 1 - enemy = Enemy(self.screenSize, self.floorHeight, self) + enemy = Enemy(self) self.enemies.add(enemy) self.sprites.add(enemy) diff --git a/Enemy.py b/Enemy.py index 6fb198c..210ae45 100644 --- a/Enemy.py +++ b/Enemy.py @@ -1,6 +1,11 @@ -import pygame +""" +Enemy entity class +""" + + import random + class Enemy(pygame.sprite.Sprite): def setNextEnemyType(self, score): if score < 10: @@ -26,7 +31,7 @@ class Enemy(pygame.sprite.Sprite): self.subtype = random.randint(1, 7) - def __init__(self, screenSize, floorHeight, mainGameClass): + def __init__(self, mainGameClass): pygame.sprite.Sprite.__init__(self) self.thisGame = mainGameClass @@ -36,7 +41,7 @@ class Enemy(pygame.sprite.Sprite): self.setNextEnemyType(self.thisGame.getScore()) self.setNextEnemySubtype() - self.height = screenSize[1] - floorHeight + self.height = mainGameClass.getScreenHeight() - mainGameClass.floorHeight if self.type == 1: if self.subtype == 1: self.image = pygame.Surface((25, 75)) @@ -56,7 +61,8 @@ class Enemy(pygame.sprite.Sprite): self.rect = self.image.get_rect() self.height -= self.rect.height/2 + 10 + 10*self.subtype - self.rect.center = (screenSize[0] + self.rect.width, self.height) + self.rect.center = (mainGameClass.getScreenWidth() + self.rect.width, + self.height) def update(self): diff --git a/Floor.py b/Floor.py new file mode 100644 index 0000000..577c1c5 --- /dev/null +++ b/Floor.py @@ -0,0 +1,18 @@ +""" +Floor entity class +""" + + +import pygame + + +class Floor(pygame.sprite.Sprite): + def __init__(self, mainGameClass): + pygame.sprite.Sprite.__init__(self) + self.image = pygame.Surface((mainGameClass.getScreenWidth(), + mainGameClass.getFloorHeight())) + self.image.fill((255, 204, 102)) + self.rect = self.image.get_rect() + self.rect.center = (mainGameClass.getScreenWidth()/2, + mainGameClass.getScreenHeight() - + mainGameClass.getFloorHeight()/2) diff --git a/Player.py b/Player.py index a514e30..c92183a 100644 --- a/Player.py +++ b/Player.py @@ -1,5 +1,11 @@ +""" +Player entity class +""" + + import pygame + class Player(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) @@ -31,4 +37,3 @@ class Player(pygame.sprite.Sprite): self.speed += 0.17 self.rect.y += self.speed - From aa187f1339727c0de3a7378c0e0dc3520542e797 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Sun, 28 Mar 2021 20:32:49 +0300 Subject: [PATCH 08/12] Fixed speeding up. Added 'speed up' message and godmode --- Drakora.pyw | 65 ++++++++++++++++++++++++++++++++++++++++++++++++----- Enemy.py | 1 + 2 files changed, 60 insertions(+), 6 deletions(-) diff --git a/Drakora.pyw b/Drakora.pyw index f9c1d26..822cdc1 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -36,8 +36,9 @@ class Drakora(): def addScore(self, score): self.__score += score - if self.__score%25 == 0: + if self.__score%self.speedUpRate == 0: self.__gameSpeed += 1 + self.speedUpLabelCD = self.targetFps def newGame(self): @@ -55,9 +56,12 @@ class Drakora(): self.__gameSpeed = 2 - self.enemyCD = 0 + self.enemyCount = 0 + self.enemyCD = self.getNextEnemyCD() self.enemyChance = 100.0 + self.speedUpLabelCD = 0 + def __init__(self): self.buttonsPause = (pygame.K_p,) @@ -79,6 +83,11 @@ class Drakora(): 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) @@ -92,6 +101,7 @@ class Drakora(): 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.newGame() @@ -123,13 +133,35 @@ class Drakora(): 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)) pygame.display.flip() + def getNextEnemyCD(self): + if self.enemyCount <= 5: + return 1000 + elif self.enemyCount <= 5: + return 800 - 100*self.enemyCount + elif self.enemyCount%self.speedUpRate == 0: + return 1000 + else: + return 300 + def collideCheck(self): if pygame.sprite.spritecollideany(self.player, self.enemies): - self.isGameOver = True + if not self.isGodmode: self.isGameOver = True self.player.isOnFloor = False @@ -174,7 +206,7 @@ class Drakora(): elif event.type == pygame.KEYDOWN: if event.key in self.buttonsQuit: return False - if event.key in self.buttonsCrouch: + elif event.key in self.buttonsCrouch: self.isDownCrouch = True elif event.key in self.buttonsJump: self.isDownJump = True @@ -186,8 +218,28 @@ class Drakora(): elif event.type == pygame.KEYUP: if event.key in self.buttonsCrouch: self.isDownCrouch = False - if event.key in self.buttonsJump: + godmodeCount = 0 + elif event.key in self.buttonsJump: self.isDownJump = False + godmodeCount = 0 + elif event.key == pygame.K_g: + if self.godmodeCount == 0: self.godmodeCount += 1 + else: self.godmodeCount == 0 + elif event.key == pygame.K_o: + if (self.godmodeCount == 1 or + self.godmodeCount == 4): self.godmodeCount += 1 + else: self.godmodeCount == 0 + elif event.key == pygame.K_d: + if (self.godmodeCount == 2 or + self.godmodeCount == 5): self.godmodeCount += 1 + else: self.godmodeCount == 0 + elif event.key == pygame.K_m: + if self.godmodeCount == 3: self.godmodeCount += 1 + else: self.godmodeCount == 0 + elif event.key == pygame.K_e: + if self.godmodeCount == 6: + self.godmodeCount == 0 + self.isGodmode = not self.isGodmode if not self.isGameOver and not self.isPaused: self.sprites.update() @@ -203,7 +255,8 @@ class Drakora(): self.enemyChance += (1/self.targetFps) * self.enemyChance/8 if random.randint(1, 150) < self.enemyChance: - self.enemyCD = 300 + self.enemyCount += 1 + self.enemyCD = self.getNextEnemyCD() self.enemyChance = 1 enemy = Enemy(self) self.enemies.add(enemy) diff --git a/Enemy.py b/Enemy.py index 210ae45..e760c40 100644 --- a/Enemy.py +++ b/Enemy.py @@ -3,6 +3,7 @@ Enemy entity class """ +import pygame import random From 958ec99fc6ced63066b36ac3eff47a57d99beb9d Mon Sep 17 00:00:00 2001 From: Nikolya Adreychik Date: Mon, 29 Mar 2021 10:43:56 +0300 Subject: [PATCH 09/12] Some player incapsulation --- Cloud.py | 7 +++++-- Drakora.pyw | 55 ++++++++--------------------------------------------- Player.py | 47 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 49 deletions(-) diff --git a/Cloud.py b/Cloud.py index 75446b9..a532a2d 100644 --- a/Cloud.py +++ b/Cloud.py @@ -20,11 +20,14 @@ class Cloud(pygame.sprite.Sprite): mainGameClass.getScreenHeight()/2 - random.randint(100, mainGameClass.getScreenHeight()/2-100)) - self.speed = random.randint(2, 4)*mainGameClass.getGameSpeed() + self.speed = random.randint(1, 3)*mainGameClass.getGameSpeed() / 6 + + self.__doubleX = float(self.rect.x) def update(self): if (self.rect.x < -self.rect.width): self.kill() - self.rect.x -= self.speed + self.__doubleX -= self.speed + self.rect.x = self.__doubleX diff --git a/Drakora.pyw b/Drakora.pyw index 822cdc1..a8e9b2a 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -67,17 +67,12 @@ class Drakora(): self.buttonsPause = (pygame.K_p,) self.buttonsQuit = (pygame.K_F10,) self.buttonsNewGame = (pygame.K_RETURN,) - self.buttonsJump = (pygame.K_UP, pygame.K_SPACE,) - self.buttonsCrouch = (pygame.K_DOWN,) self.screenSize = (800, 600) self.targetFps = 120 self.floorHeight = 50 - self.isDownJump = False - self.isDownCrouch = False - self.floors = pygame.sprite.Group() self.enemies = pygame.sprite.Group() self.clouds = pygame.sprite.Group() @@ -120,6 +115,7 @@ class Drakora(): 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), @@ -139,8 +135,6 @@ class Drakora(): self.fontMessage, (255, 255, 255), tuple(i/2 for i in self.screenSize)) - - if self.isGodmode: self.renderText('godmode', self.fontGodmode, (255, 255, 255), @@ -159,6 +153,7 @@ class Drakora(): else: return 300 + def collideCheck(self): if pygame.sprite.spritecollideany(self.player, self.enemies): if not self.isGodmode: self.isGameOver = True @@ -169,60 +164,24 @@ class Drakora(): self.player.isOnFloor = True self.player.rect.y -= 1 - if not self.isDownJump: - self.player.hoverCount = 0 - - if self.player.isOnFloor: - self.player.speed = 0 - - if self.isDownJump: - self.player.isJumping = True - - if self.player.isCrouching: - self.player.standup() - - elif self.isDownCrouch: - if not self.player.isCrouching: - self.player.crouch() - - elif self.player.isCrouching: - self.player.standup() - - if self.player.isJumping: - if self.isDownJump and self.player.hoverCount < 7: - self.player.speed -= 1 - self.player.speed/(15+ - self.player.hoverCount*3) - self.player.hoverCount += 1 - - else: - self.player.isJumping = False - def logic(self): 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.buttonsCrouch: - self.isDownCrouch = True - elif event.key in self.buttonsJump: - self.isDownJump = True elif event.key in self.buttonsNewGame: if self.isGameOver: self.newGame() elif event.key in self.buttonsPause: self.isPaused = not self.isPaused elif event.type == pygame.KEYUP: - if event.key in self.buttonsCrouch: - self.isDownCrouch = False - godmodeCount = 0 - elif event.key in self.buttonsJump: - self.isDownJump = False - godmodeCount = 0 - elif event.key == pygame.K_g: + if event.key == pygame.K_g: if self.godmodeCount == 0: self.godmodeCount += 1 else: self.godmodeCount == 0 elif event.key == pygame.K_o: @@ -240,13 +199,15 @@ class Drakora(): if self.godmodeCount == 6: self.godmodeCount == 0 self.isGodmode = not self.isGodmode + else: + self.godmodeCount = 0 if not self.isGameOver and not self.isPaused: self.sprites.update() self.enemyCD -= self.__gameSpeed - if random.randint(1, 50) == 1: + if random.randint(1, 200) == 1: cloud = Cloud(self) self.clouds.add(cloud) self.sprites.add(cloud) diff --git a/Player.py b/Player.py index c92183a..148399c 100644 --- a/Player.py +++ b/Player.py @@ -18,12 +18,17 @@ class Player(pygame.sprite.Sprite): self.isCrouching = False self.hoverCount = 0 self.isOnFloor = False + self.isDownJump = False + self.isDownCrouch = False + self.buttonsJump = (pygame.K_UP, pygame.K_SPACE,) + self.buttonsCrouch = (pygame.K_DOWN,) def crouch(self): if not self.isCrouching: self.isCrouching = True self.rect = self.rect.inflate(0, -25) + # self.image.set_clip((50, 50)) def standup(self): @@ -32,8 +37,50 @@ class Player(pygame.sprite.Sprite): self.rect = self.rect.inflate(0, 25) + def control(self, event): + if event.type == pygame.KEYDOWN: + if event.key in self.buttonsCrouch: + self.isDownCrouch = True + elif event.key in self.buttonsJump: + self.isDownJump = True + + elif event.type == pygame.KEYUP: + if event.key in self.buttonsCrouch: + self.isDownCrouch = False + elif event.key in self.buttonsJump: + self.isDownJump = False + + def update(self): if not self.speed: self.rect.y += 1 self.speed += 0.17 self.rect.y += self.speed + + if not self.isDownJump: + self.hoverCount = 0 + + if self.isOnFloor: + self.speed = 0 + + if self.isDownJump: + self.isJumping = True + + if self.isCrouching: + self.standup() + + elif self.isDownCrouch: + if not self.isCrouching: + self.crouch() + + elif self.isCrouching: + self.standup() + + if self.isJumping: + if self.isDownJump and self.hoverCount < 7: + self.speed -= 1 - self.speed/(15+ + self.hoverCount*3) + self.hoverCount += 1 + + else: + self.isJumping = False From 1e7d11fe1e66325ffc20252ff7e933fd06a6c4a9 Mon Sep 17 00:00:00 2001 From: Nikolya Adreychik Date: Mon, 29 Mar 2021 12:39:32 +0300 Subject: [PATCH 10/12] Splitted enemies. Fixed flying enemies. Minor fixes --- Drakora.pyw | 38 +++++++++++++++++++++++++------ Enemy.py | 58 +++--------------------------------------------- Floor.py | 6 ++--- FlyingEnemy.py | 25 +++++++++++++++++++++ Player.py | 11 +++++---- StandingEnemy.py | 31 ++++++++++++++++++++++++++ 6 files changed, 100 insertions(+), 69 deletions(-) create mode 100644 FlyingEnemy.py create mode 100644 StandingEnemy.py diff --git a/Drakora.pyw b/Drakora.pyw index a8e9b2a..99a01de 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -7,7 +7,8 @@ import pygame import random from Player import Player -from Enemy import Enemy +from StandingEnemy import StandingEnemy +from FlyingEnemy import FlyingEnemy from Cloud import Cloud from Floor import Floor @@ -37,7 +38,7 @@ class Drakora(): self.__score += score if self.__score%self.speedUpRate == 0: - self.__gameSpeed += 1 + self.__gameSpeed += self.__score/self.speedUpRate self.speedUpLabelCD = self.targetFps @@ -57,10 +58,11 @@ class Drakora(): self.__gameSpeed = 2 self.enemyCount = 0 - self.enemyCD = self.getNextEnemyCD() self.enemyChance = 100.0 self.speedUpLabelCD = 0 + self.nextEnemyMustBeFlying = False + self.enemyCD = self.getNextEnemyCD() def __init__(self): @@ -144,12 +146,14 @@ class Drakora(): def getNextEnemyCD(self): - if self.enemyCount <= 5: + 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 @@ -166,6 +170,8 @@ class Drakora(): def logic(self): + self.player.updateSpeed(self.__gameSpeed) + for event in pygame.event.get(): self.player.control(event) @@ -176,7 +182,7 @@ class Drakora(): if event.key in self.buttonsQuit: return False elif event.key in self.buttonsNewGame: - if self.isGameOver: self.newGame() + if self.isGameOver or self.isGodmode: self.newGame() elif event.key in self.buttonsPause: self.isPaused = not self.isPaused @@ -217,9 +223,27 @@ class Drakora(): if random.randint(1, 150) < self.enemyChance: self.enemyCount += 1 - self.enemyCD = self.getNextEnemyCD() self.enemyChance = 1 - enemy = Enemy(self) + + 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) diff --git a/Enemy.py b/Enemy.py index e760c40..3322e44 100644 --- a/Enemy.py +++ b/Enemy.py @@ -8,62 +8,13 @@ import random class Enemy(pygame.sprite.Sprite): - def setNextEnemyType(self, score): - if score < 10: - self.type = 1 - - elif score < 20: - if random.randint(1, 100) < 95: self.type = 1 - else: self.type = 2 - - elif score < 40: - if random.randint(1, 100) < 85: self.type = 1 - else: self.type = 2 - - else: - if random.randint(1, 100) < 75: self.type = 1 - else: self.type = 2 - - - def setNextEnemySubtype(self): - if self.type == 1: - self.subtype = random.randint(1, 5) - elif self.type == 2: - self.subtype = random.randint(1, 7) - - def __init__(self, mainGameClass): pygame.sprite.Sprite.__init__(self) self.thisGame = mainGameClass - self.speed = self.thisGame.getGameSpeed() - - self.setNextEnemyType(self.thisGame.getScore()) - self.setNextEnemySubtype() - - self.height = mainGameClass.getScreenHeight() - mainGameClass.floorHeight - - if self.type == 1: - if self.subtype == 1: self.image = pygame.Surface((25, 75)) - elif self.subtype == 2: self.image = pygame.Surface((25, 25)) - elif self.subtype == 3: self.image = pygame.Surface((75, 25)) - elif self.subtype == 4: self.image = pygame.Surface((50, 25)) - elif self.subtype == 5: self.image = pygame.Surface((50, 50)) - else: self.image = pygame.Surface((25, 50)) - - self.image.fill((0, 153, 0)) - self.rect = self.image.get_rect() - self.height -= self.rect.height/2 - - elif self.type == 2: - self.image = pygame.Surface((50, 25)) - self.image.fill((51, 51, 0)) - self.rect = self.image.get_rect() - self.height -= self.rect.height/2 + 10 + 10*self.subtype - - self.rect.center = (mainGameClass.getScreenWidth() + self.rect.width, - self.height) + self.height = (mainGameClass.getScreenHeight() + - mainGameClass.getFloorHeight()) def update(self): @@ -71,7 +22,4 @@ class Enemy(pygame.sprite.Sprite): self.kill() self.thisGame.addScore(1) - if self.type == 1: - self.rect.x -= self.speed - else: - self.rect.x -= self.speed*2 + self.rect.x -= self.speed diff --git a/Floor.py b/Floor.py index 577c1c5..c06b552 100644 --- a/Floor.py +++ b/Floor.py @@ -10,9 +10,9 @@ class Floor(pygame.sprite.Sprite): def __init__(self, mainGameClass): pygame.sprite.Sprite.__init__(self) self.image = pygame.Surface((mainGameClass.getScreenWidth(), - mainGameClass.getFloorHeight())) + mainGameClass.getFloorHeight()*101)) self.image.fill((255, 204, 102)) self.rect = self.image.get_rect() self.rect.center = (mainGameClass.getScreenWidth()/2, - mainGameClass.getScreenHeight() - - mainGameClass.getFloorHeight()/2) + mainGameClass.getScreenHeight() + + mainGameClass.getFloorHeight()*49.5) diff --git a/FlyingEnemy.py b/FlyingEnemy.py new file mode 100644 index 0000000..d78ae23 --- /dev/null +++ b/FlyingEnemy.py @@ -0,0 +1,25 @@ +""" +Flying enemy entity class +""" + + +import pygame +import random +from Enemy import Enemy + + +class FlyingEnemy(Enemy): + def __init__(self, mainGameClass): + Enemy.__init__(self, mainGameClass) + + self.subtype = random.randint(1, 7) + + self.image = pygame.Surface((50, 25)) + self.image.fill((51, 51, 0)) + self.rect = self.image.get_rect() + self.height -= self.rect.height/2 + 10 + 10*self.subtype + + self.rect.center = (mainGameClass.getScreenWidth() + self.rect.width, + self.height) + + self.speed = self.thisGame.getGameSpeed()*2 diff --git a/Player.py b/Player.py index 148399c..2e89c71 100644 --- a/Player.py +++ b/Player.py @@ -22,6 +22,7 @@ class Player(pygame.sprite.Sprite): self.isDownCrouch = False self.buttonsJump = (pygame.K_UP, pygame.K_SPACE,) self.buttonsCrouch = (pygame.K_DOWN,) + self.gameSpeed = 1 def crouch(self): @@ -36,6 +37,8 @@ class Player(pygame.sprite.Sprite): self.isCrouching = False self.rect = self.rect.inflate(0, 25) + def updateSpeed(self, newGameSpeed): + self.gameSpeed = newGameSpeed def control(self, event): if event.type == pygame.KEYDOWN: @@ -54,7 +57,7 @@ class Player(pygame.sprite.Sprite): def update(self): if not self.speed: self.rect.y += 1 - self.speed += 0.17 + self.speed += 0.09 * self.gameSpeed self.rect.y += self.speed if not self.isDownJump: @@ -77,9 +80,9 @@ class Player(pygame.sprite.Sprite): self.standup() if self.isJumping: - if self.isDownJump and self.hoverCount < 7: - self.speed -= 1 - self.speed/(15+ - self.hoverCount*3) + if self.isDownJump and self.hoverCount < 8: + self.speed -= (1 - self.speed/(15+ + self.hoverCount*3)) * self.gameSpeed/2 self.hoverCount += 1 else: diff --git a/StandingEnemy.py b/StandingEnemy.py new file mode 100644 index 0000000..adda10f --- /dev/null +++ b/StandingEnemy.py @@ -0,0 +1,31 @@ +""" +Standing enemy entity class +""" + + +import pygame +import random +from Enemy import Enemy + + +class StandingEnemy(Enemy): + def __init__(self, mainGameClass): + Enemy.__init__(self, mainGameClass) + + self.subtype = random.randint(1, 5) + + if self.subtype == 1: self.image = pygame.Surface((25, 75)) + elif self.subtype == 2: self.image = pygame.Surface((25, 25)) + elif self.subtype == 3: self.image = pygame.Surface((75, 25)) + elif self.subtype == 4: self.image = pygame.Surface((50, 25)) + elif self.subtype == 5: self.image = pygame.Surface((50, 50)) + else: self.image = pygame.Surface((25, 50)) + + self.image.fill((0, 153, 0)) + self.rect = self.image.get_rect() + self.height -= self.rect.height/2 + + self.rect.center = (mainGameClass.getScreenWidth() + self.rect.width, + self.height) + + self.speed = self.thisGame.getGameSpeed() From fb45a54862103ab90c32f6d94fe78aa92abe86d4 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Mon, 29 Mar 2021 17:00:56 +0000 Subject: [PATCH 11/12] Super duper mega ultra updated cheat mechanics!!! --- Drakora.pyw | 52 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/Drakora.pyw b/Drakora.pyw index 99a01de..1bec0ee 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -6,6 +6,8 @@ Main game class import pygame import random +from collections import deque + from Player import Player from StandingEnemy import StandingEnemy from FlyingEnemy import FlyingEnemy @@ -100,6 +102,18 @@ class Drakora(): 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() @@ -142,6 +156,11 @@ class Drakora(): 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() @@ -169,6 +188,14 @@ class Drakora(): 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) @@ -187,26 +214,11 @@ class Drakora(): self.isPaused = not self.isPaused elif event.type == pygame.KEYUP: - if event.key == pygame.K_g: - if self.godmodeCount == 0: self.godmodeCount += 1 - else: self.godmodeCount == 0 - elif event.key == pygame.K_o: - if (self.godmodeCount == 1 or - self.godmodeCount == 4): self.godmodeCount += 1 - else: self.godmodeCount == 0 - elif event.key == pygame.K_d: - if (self.godmodeCount == 2 or - self.godmodeCount == 5): self.godmodeCount += 1 - else: self.godmodeCount == 0 - elif event.key == pygame.K_m: - if self.godmodeCount == 3: self.godmodeCount += 1 - else: self.godmodeCount == 0 - elif event.key == pygame.K_e: - if self.godmodeCount == 6: - self.godmodeCount == 0 - self.isGodmode = not self.isGodmode - else: - self.godmodeCount = 0 + 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() From 5db0e1dcb4edcd708b4eb2a00fa953dc0da92995 Mon Sep 17 00:00:00 2001 From: Nikolya Andreychik Date: Mon, 29 Mar 2021 17:18:38 +0300 Subject: [PATCH 12/12] Hotfix --- Drakora.pyw | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Drakora.pyw b/Drakora.pyw index 1bec0ee..1e4ae6b 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -156,11 +156,6 @@ class Drakora(): 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()