Merge pull request #10 from IRUSlan92I/debug

Updated cloud system
This commit is contained in:
2021-04-06 16:23:50 +03:00
committed by GitHub
21 changed files with 859 additions and 94 deletions
+48
View File
@@ -0,0 +1,48 @@
"""
Background entity class
"""
import pygame
import os
from BackgroundLayer import BackgroundLayer
class Background():
imgDir = os.path.join(os.path.dirname(__file__), 'data')
backgroundImage = pygame.image.load(
os.path.join(imgDir, 'background.png')
)#.convert()
backgroundImages = (
pygame.transform.scale(
backgroundImage.subsurface((0, 0, 800, 150)), (3200, 600)
),
pygame.transform.scale(
backgroundImage.subsurface((0, 150, 800, 150)), (3200, 600)
),
pygame.transform.scale(
backgroundImage.subsurface((0, 300, 800, 150)), (3200, 600)
),
)
for image in backgroundImages:
image.set_colorkey((255,0,255))
def __init__(self, mainGameClass):
pygame.sprite.Sprite.__init__(self)
self.layers = (
BackgroundLayer(Background.backgroundImages[0], mainGameClass, 0.2),
BackgroundLayer(Background.backgroundImages[1], mainGameClass, 0.5),
BackgroundLayer(Background.backgroundImages[2], mainGameClass, 1),
)
def update(self):
for layer in self.layers:
layer.update()
def draw(self, surface):
for layer in self.layers:
layer.draw(surface)
+31
View File
@@ -0,0 +1,31 @@
"""
Background layer entity class
"""
import pygame
from BackgroundLayerFrame import BackgroundLayerFrame
class BackgroundLayer():
def __init__(self, image, mainGameClass, speedMultiplier):
offset = image.get_width()
self.frames = pygame.sprite.Group()
self.frames.add(BackgroundLayerFrame(
image, mainGameClass, (0, 0), speedMultiplier)
)
self.frames.add(BackgroundLayerFrame(
image, mainGameClass, (offset, 0), speedMultiplier)
)
def update(self):
for frame in self.frames:
frame.update()
def draw(self, surface):
self.frames.draw(surface)
+29
View File
@@ -0,0 +1,29 @@
"""
Background layer frame entity class
"""
import pygame
class BackgroundLayerFrame(pygame.sprite.Sprite):
def __init__(self, image, mainGameClass, offset, speedMultiplier):
pygame.sprite.Sprite.__init__(self)
self.image = image
self.mainGameClass = mainGameClass
self.speedMultiplier = speedMultiplier
self.rect = self.image.get_rect()
self.rect.center = (mainGameClass.getScreenWidth()/2 + offset[0],
mainGameClass.getScreenHeight()/2 + offset[1])
self.__doubleX = float(self.rect.x)
def update(self):
self.__doubleX -= self.mainGameClass.getGameSpeed()*self.speedMultiplier
if self.__doubleX < -self.rect.width:
self.__doubleX += self.rect.width*2
self.rect.x = self.__doubleX
+11 -9
View File
@@ -8,19 +8,21 @@ import random
class Cloud(pygame.sprite.Sprite):
def __init__(self, mainGameClass):
def __init__(self, mainGameClass, cloudType):
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)))
color = 255 - 15 * (3-cloudType)
self.image.fill((color, color, color))
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(1, 3)*mainGameClass.getGameSpeed() / 6
self.rect.center = (
mainGameClass.getScreenWidth() + self.rect.width,
mainGameClass.getScreenHeight()/2 - random.randint(100,
mainGameClass.getScreenHeight()/2-100) + 50*(2-cloudType)
)
self.speed = cloudType*mainGameClass.getGameSpeed() / 6
self.__doubleX = float(self.rect.x)
+24
View File
@@ -0,0 +1,24 @@
"""
CollisionBox entity class
"""
import pygame
class CollisionBox(pygame.sprite.Sprite):
def __init__(self, offsetX, offsetY, width, height, center):
pygame.sprite.Sprite.__init__(self)
self.offset = (offsetX, offsetY)
self.size = (width, height)
self.rect = pygame.Rect(0, 0, width, height)
self.rect.center = center
self.rect.x += self.offset[0]
self.rect.y += self.offset[1]
def setY(self, y):
self.rect.y = y + self.offset[1]
def setX(self, x):
self.rect.x = x + self.offset[0]
+152 -60
View File
@@ -5,14 +5,17 @@ Main game class
import pygame
import random
import os
from collections import deque
from Background import Background
from Player import Player
from StandingEnemy import StandingEnemy
from FlyingEnemy import FlyingEnemy
from Cloud import Cloud
from Floor import Floor
from EndSceen import EndSceen
class Drakora():
@@ -36,84 +39,116 @@ class Drakora():
return self.floorHeight
def speedUp(self):
self.__gameSpeed *= 2
def speedDown(self):
if self.__gameSpeed > 2: self.__gameSpeed /= 2
def speedReset(self):
self.__gameSpeed = 2
def addScore(self, score):
self.__score += score
if self.__score%self.speedUpRate == 0:
self.__gameSpeed += self.__score/self.speedUpRate
self.speedUp()
self.speedUpLabelCD = self.targetFps
def getFont(self):
return self.font
def getTime(self):
return self.time
def newGame(self):
self.background = Background(self)
for enemy in self.enemies:
enemy.kill()
for cloudGroup in self.cloudGroups:
for cloud in cloudGroup:
cloud.kill()
if self.player: self.player.kill()
self.player = Player()
self.sprites.add(self.player)
self.players.add(self.player)
self.__score = 0
self.isGameOver = False
self.isPaused = False
self.__gameSpeed = 2
self.speedReset()
self.enemyCount = 0
self.enemyChance = 100.0
self.speedUpLabelCD = 0
self.nextEnemyMustBeFlying = False
self.enemyCD = self.getNextEnemyCD()
self.speedUpCheatLabelCD = 0
self.speedDownCheatLabelCD = 0
self.speedResetCheatLabelCD = 0
self.time = 0
self.endSceen.newEndScreen()
def __init__(self):
random.seed()
pygame.init()
self.screenSize = (800, 600)
self.screen = pygame.display.set_mode(self.screenSize)
pygame.display.set_caption('Drakora')
self.clock = pygame.time.Clock()
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.floorHeight = 64
self.players = pygame.sprite.Group()
self.floors = pygame.sprite.Group()
self.enemies = pygame.sprite.Group()
self.clouds = pygame.sprite.Group()
self.cloudGroups = (pygame.sprite.Group(),
pygame.sprite.Group(),
pygame.sprite.Group(),)
self.player = None
self.floors.add(Floor(self))
self.speedUpRate = 25
self.godmodeCount = 0
self.isGodmode = False
self.drawBoxes = False
random.seed()
pygame.init()
self.screen = pygame.display.set_mode(self.screenSize)
pygame.display.set_caption('Drakora')
self.clock = pygame.time.Clock()
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.sprites = pygame.sprite.Group()
self.floors.add(Floor(self))
self.sprites.add(self.floors)
self.charKeys = tuple(
pygame.key.key_code(chr(i)) for i in range(ord("a"), ord("z"))
)
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.endSceen = EndSceen(self)
self.newGame()
@@ -129,33 +164,63 @@ class Drakora():
def render(self):
self.screen.fill((102, 153, 255))
self.sprites.draw(self.screen)
self.floors.draw(self.screen)
self.screen.fill((61, 150, 223))
for cloudGroup in self.cloudGroups[:2]: cloudGroup.draw(self.screen)
self.background.draw(self.screen)
for cloudGroup in self.cloudGroups[2:]: cloudGroup.draw(self.screen)
self.enemies.draw(self.screen)
self.players.draw(self.screen)
self.renderText('%d'%(self.__score),
self.fontScore, (255, 255, 255),
(self.getScreenWidth()/2,20))
if self.drawBoxes:
for player in self.players:
for collision in player.getCollisionBoxes():
pygame.draw.rect(self.screen, (255, 0, 0), collision.rect, 1)
for enemy in self.enemies:
for collision in enemy.getCollisionBoxes():
pygame.draw.rect(self.screen, (255, 0, 0), collision.rect, 1)
for floor in self.floors:
pygame.draw.rect(self.screen, (255, 0, 0), floor.rect, 1)
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',
self.fontGodmode, (255, 255, 255),
(self.getScreenWidth()/2,40))
if self.speedUpCheatLabelCD:
self.speedUpCheatLabelCD -= 1
self.renderText('speed up',
self.fontGodmode, (255, 255, 255),
(self.getScreenWidth()/2,60))
if self.speedDownCheatLabelCD:
self.speedDownCheatLabelCD -= 1
self.renderText('speed down',
self.fontGodmode, (255, 255, 255),
(self.getScreenWidth()/2,60))
if self.speedResetCheatLabelCD:
self.speedResetCheatLabelCD -= 1
self.renderText('speed reset',
self.fontGodmode, (255, 255, 255),
(self.getScreenWidth()/2,60))
pygame.display.flip()
@@ -171,23 +236,44 @@ class Drakora():
else:
return 300
def collideCheck(self):
if pygame.sprite.spritecollideany(self.player, self.enemies):
if not self.isGodmode: self.isGameOver = True
for enemy in self.enemies:
if pygame.sprite.groupcollide(self.player.getCollisionBoxes(), enemy.getCollisionBoxes(), None, None):
if not self.isGodmode:
self.isGameOver = True
break
self.player.isOnFloor = False
if self.player.isOnFloor:
self.player.rect.y += 1
if not pygame.sprite.spritecollideany(self.player, self.floors):
self.player.isOnFloor = False
else:
if pygame.sprite.spritecollideany(self.player, self.floors):
self.player.isOnFloor = True
while pygame.sprite.spritecollideany(self.player, self.floors):
self.player.isOnFloor = True
self.player.rect.y -= 1
if self.player.isOnFloor:
while pygame.sprite.spritecollideany(self.player, self.floors):
self.player.rect.y -= 1
def doCheats(self):
if self.isPressedKeysUpdated:
pressedKeysStr = ''.join(self.pressedKeys)
if pressedKeysStr.endswith('godmode'):
self.isGodmode = not self.isGodmode
elif pressedKeysStr.endswith('speedup'):
self.speedUp()
self.speedUpCheatLabelCD = 60
elif pressedKeysStr.endswith('speeddown'):
self.speedDown()
self.speedDownCheatLabelCD = 60
elif pressedKeysStr.endswith('speedreset'):
self.speedReset()
self.speedResetCheatLabelCD = 60
elif pressedKeysStr.endswith('drawboxes'):
self.drawBoxes = not self.drawBoxes
self.isPressedKeysUpdated = False
@@ -196,6 +282,7 @@ class Drakora():
for event in pygame.event.get():
self.player.control(event)
self.endSceen.control(event)
if event.type == pygame.QUIT:
return False
@@ -204,26 +291,32 @@ 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
elif event.type == pygame.KEYUP:
if event.key in self.charKeys:
self.pressedKeys.append(self.charKeys[event.key])
self.pressedKeys.append(pygame.key.name(event.key))
self.isPressedKeysUpdated = True
self.doCheats()
if not self.isGameOver and not self.isPaused:
self.sprites.update()
self.time += 1/self.targetFps
self.background.update()
for cloudGroup in self.cloudGroups: cloudGroup.update()
self.enemies.update()
self.players.update()
self.floors.update()
self.enemyCD -= self.__gameSpeed
if random.randint(1, 200) == 1:
cloud = Cloud(self)
self.clouds.add(cloud)
self.sprites.add(cloud)
cloudType = random.randint(0, 2)
cloud = Cloud(self, cloudType)
self.cloudGroups[cloudType].add(cloud)
if self.enemyCD <= 0:
self.enemyChance += (1/self.targetFps) * self.enemyChance/8
@@ -252,7 +345,6 @@ class Drakora():
self.enemyCD = self.getNextEnemyCD()
self.enemies.add(enemy)
self.sprites.add(enemy)
self.collideCheck()
+235
View File
@@ -0,0 +1,235 @@
"""
Enemy entity class
"""
import pickle
import pygame
import hashlib
from cryptography.fernet import Fernet
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.fontError = pygame.font.Font(
mainGameClass.getFont(), 15
)
key = b'Lh2b2rragfwD8QR4VU-V2TmSuio4yp-WbFwo4tcoyzs='
self.code = Fernet(key)
self.game = mainGameClass
self.saveFileName = 'leaders.lb'
def newEndScreen(self):
self.endScreenTimer = 0;
self.playerName = 'Player'
self.scoresFromFile = []
self.data = []
self.sortedDataByScores = []
self.isBackButton = True
try:
fileWithData = open(self.saveFileName, 'rb')
except IOError as e:
pass
else:
listPlayers = pickle.load(fileWithData)
for line in listPlayers:
oneStr = self.code.decrypt(line).decode().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, backColor=None):
render = font.render(text, True, color, backColor)
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]]:
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:>3} {1:^10} {2:>6} {3:>8} '.format(
'..','.....', '..', '.....'
),
self.fontLeaderBoard, (255, 255, 255),
(self.game.getScreenWidth()/2,100 + (number + 1)*50))
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):
backGround = pygame.Surface(self.game.screenSize, pygame.SRCALPHA)
backGround.fill((0,0,0,200))
self.game.screen.blit(backGround, (0,0))
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)
cursorChar = ' '
if self.endScreenTimer > self.game.targetFps / 3:
cursorChar = '_'
if self.endScreenTimer > 2 * self.game.targetFps / 3:
self.endScreenTimer = 0
self.endScreenTimer += 1
if len(self.playerName) > 0:
self.renderText(' {0:3d} {1:^10} {2:6d} {3:8.2f} '.format(
self.getScorePosition(self.game.getScore()),
self.playerName[:10] + (cursorChar
if len(self.playerName) < 10 else ''),
self.game.getScore(), self.game.getTime()
),
self.fontLeaderBoard, (255, 255, 255),
(self.game.getScreenWidth()/2,100 + (5 + 2)*50))
else:
self.renderText(' {0:3d} {1:^10} {2:6d} {3:8.2f} '.format(
self.getScorePosition(self.game.getScore()),
self.playerName[:10] + (cursorChar
if len(self.playerName) < 10 else ''),
self.game.getScore(), self.game.getTime()
),
self.fontLeaderBoard, (255, 255, 255),
(self.game.getScreenWidth()/2, 100 +
(5 + 2)*50), (200, 20, 20))
self.renderText(' {0:^30} '.format('Missing player name'),
self.fontError, (255, 255, 255),
(self.game.getScreenWidth()/2,100 + (5 + 2)*50 + 25))
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:
if len(self.playerName) > 0:
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()
def saveResults(self):
newData = []
try:
fileWithData = open(self.saveFileName, 'rb')
except IOError as e:
pass
else:
tmpData = pickle.load(fileWithData)
fileWithData.close()
for line in tmpData:
oneStr = self.code.decrypt(line).decode()
if len(oneStr.split()) == 3:
if not (oneStr.split()[0].rstrip() == self.playerName.rstrip()):
newData.append(line)
newData.append(self.code.encrypt(('{0} {1} {2:.2f}\n'.format(self.playerName,
self.game.getScore(), self.game.getTime())).encode()))
with open (self.saveFileName, 'wb') as fileWithData:
pickle.dump(newData, fileWithData)
fileWithData.close()
+9
View File
@@ -16,6 +16,12 @@ class Enemy(pygame.sprite.Sprite):
self.height = (mainGameClass.getScreenHeight()
- mainGameClass.getFloorHeight())
self.collisionBoxes = pygame.sprite.Group()
def getCollisionBoxes(self):
return self.collisionBoxes
def update(self):
if (self.rect.x < -self.rect.width):
@@ -23,3 +29,6 @@ class Enemy(pygame.sprite.Sprite):
self.thisGame.addScore(1)
self.rect.x -= self.speed
for i in self.collisionBoxes:
i.setX(self.rect.x)
+1 -1
View File
@@ -11,7 +11,7 @@ class Floor(pygame.sprite.Sprite):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((mainGameClass.getScreenWidth(),
mainGameClass.getFloorHeight()*101))
self.image.fill((255, 204, 102))
self.image.fill((255, 229, 180))
self.rect = self.image.get_rect()
self.rect.center = (mainGameClass.getScreenWidth()/2,
mainGameClass.getScreenHeight() +
+38 -3
View File
@@ -5,21 +5,56 @@ Flying enemy entity class
import pygame
import random
import math
import os
from Enemy import Enemy
from CollisionBox import CollisionBox
class FlyingEnemy(Enemy):
imgDir = os.path.join(os.path.dirname(__file__), 'data')
senemyImage = pygame.image.load(
os.path.join(imgDir, 'fenemy.png')
)#.convert()
images = (
pygame.transform.scale(senemyImage.subsurface((0, 0, 16, 8)),(64, 32)),
pygame.transform.scale(senemyImage.subsurface((16, 0, 16, 8)),(64, 32)),
pygame.transform.scale(senemyImage.subsurface((32, 0, 16, 8)),(64, 32)),
)
for image in images:
image.set_colorkey((255,0,255))
def __init__(self, mainGameClass):
Enemy.__init__(self, mainGameClass)
self.subtype = random.randint(1, 7)
self.updateCount = 0
self.currentImage = 0
self.subtype = random.randint(1, 10)
self.image = FlyingEnemy.images[self.currentImage]
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)
collision = CollisionBox(2, 0, self.rect.w - 28, self.rect.h - 8, self.rect.center)
self.collisionBoxes.add(collision)
self.speed = self.thisGame.getGameSpeed()*2
def update(self):
super().update()
self.updateCount += 1
if self.updateCount >= 22 - math.log2(self.thisGame.getGameSpeed()) * 2:
self.currentImage += 1
if self.currentImage >= len(FlyingEnemy.images):
self.currentImage = 0
self.image = FlyingEnemy.images[self.currentImage]
self.updateCount = 0
+140 -13
View File
@@ -4,13 +4,93 @@ Player entity class
import pygame
import math
import os
from CollisionBox import CollisionBox
class Player(pygame.sprite.Sprite):
imgDir = os.path.join(os.path.dirname(__file__), 'data')
playerImage = pygame.image.load(
os.path.join(imgDir, 'player.png')
)#.convert()
walkImages = (
pygame.transform.scale(
playerImage.subsurface((0, 0, 16, 24)), (64, 98)
),
pygame.transform.scale(
playerImage.subsurface((16, 0, 16, 24)), (64, 98)
),
pygame.transform.scale(
playerImage.subsurface((32, 0, 16, 24)), (64, 98)
),
pygame.transform.scale(
playerImage.subsurface((48, 0, 16, 24)), (64, 98)
),
)
upImages = (
pygame.transform.scale(
playerImage.subsurface((0, 24, 16, 24)), (64, 98)
),
pygame.transform.scale(
playerImage.subsurface((16, 24, 16, 24)), (64, 98)
),
pygame.transform.scale(
playerImage.subsurface((32, 24, 16, 24)), (64, 98)
),
pygame.transform.scale(
playerImage.subsurface((48, 24, 16, 24)), (64, 98)
),
)
downImages = (
pygame.transform.scale(
playerImage.subsurface((0, 48, 16, 24)), (64, 98)
),
pygame.transform.scale(
playerImage.subsurface((16, 48, 16, 24)), (64, 98)
),
pygame.transform.scale(
playerImage.subsurface((32, 48, 16, 24)), (64, 98)
),
pygame.transform.scale(
playerImage.subsurface((48, 48, 16, 24)), (64, 98)
),
)
crouchImages = (
pygame.transform.scale(
playerImage.subsurface((0, 72, 16, 16)), (64, 64)
),
pygame.transform.scale(
playerImage.subsurface((16, 72, 16, 16)), (64, 64)
),
pygame.transform.scale(
playerImage.subsurface((32, 72, 16, 16)), (64, 64)
),
pygame.transform.scale(
playerImage.subsurface((48, 72, 16, 16)), (64, 64)
),
)
for array in (walkImages, upImages, downImages, crouchImages):
for image in array:
image.set_colorkey((255,0,255))
def getCollisionBoxes(self):
return self.collisionBoxes
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((50, 75))
self.image.fill((153, 151, 0))
self.currentWalkImage = 0
self.currentUpImage = 0
self.currentDownImage = 0
self.currentCrouchImage = 0
self.image = Player.downImages[self.currentDownImage]
self.rect = self.image.get_rect()
self.rect.center = (100, 400)
self.speed = 0.0
@@ -23,19 +103,29 @@ class Player(pygame.sprite.Sprite):
self.buttonsJump = (pygame.K_UP, pygame.K_SPACE,)
self.buttonsCrouch = (pygame.K_DOWN,)
self.gameSpeed = 1
self.updateCount = 0
self.collisionBoxes = pygame.sprite.Group()
collision = CollisionBox(0, 20, 60, 20, self.rect.center)
self.collisionBoxes.add(collision)
collision = CollisionBox(-10, 5, 30, 20, self.rect.center)
self.collisionBoxes.add(collision)
collision = CollisionBox(0, 35, 25, 40, self.rect.center)
self.collisionBoxes.add(collision)
def crouch(self):
if not self.isCrouching:
self.isCrouching = True
self.rect = self.rect.inflate(0, -25)
# self.image.set_clip((50, 50))
self.rect = self.rect.inflate(0, -32)
def standup(self):
if self.isCrouching:
self.isCrouching = False
self.rect = self.rect.inflate(0, 25)
self.rect = self.rect.inflate(0, 32)
def updateSpeed(self, newGameSpeed):
self.gameSpeed = newGameSpeed
@@ -55,10 +145,7 @@ class Player(pygame.sprite.Sprite):
def update(self):
if not self.speed: self.rect.y += 1
self.speed += 0.09 * self.gameSpeed
self.rect.y += self.speed
self.updateCount += 1
if not self.isDownJump:
self.hoverCount = 0
@@ -80,10 +167,50 @@ class Player(pygame.sprite.Sprite):
self.standup()
if self.isJumping:
if self.isDownJump and self.hoverCount < 8:
self.speed -= (1 - self.speed/(15+
self.hoverCount*3)) * self.gameSpeed/2
self.hoverCount += 1
if self.gameSpeed <= 2: maxHoverCount = 30
elif self.gameSpeed <= 4: maxHoverCount = 23
elif self.gameSpeed <= 8: maxHoverCount = 16
elif self.gameSpeed <= 16: maxHoverCount = 9
elif self.gameSpeed <= 32: maxHoverCount = 5
elif self.gameSpeed <= 64: maxHoverCount = 2
else: maxHoverCount = 1
if self.isDownJump and self.hoverCount < maxHoverCount:
self.speed -= self.gameSpeed/8 * (
(math.cos(2*math.pi*self.hoverCount/
(2*maxHoverCount))+1)/2.5 + 0.2
)
self.hoverCount += 1
else:
self.isJumping = False
else:
self.speed += 0.07 * self.gameSpeed
self.rect.y += self.speed
for i in self.collisionBoxes:
i.setY(self.rect.y)
if self.updateCount >= 22 - math.log2(self.gameSpeed) * 2:
if self.isOnFloor:
if self.isCrouching:
self.currentCrouchImage += 1
if self.currentCrouchImage >= len(Player.crouchImages):
self.currentCrouchImage = 0
self.image = Player.crouchImages[self.currentCrouchImage]
else:
self.currentWalkImage += 1
if self.currentWalkImage >= len(Player.walkImages):
self.currentWalkImage = 0
self.image = Player.walkImages[self.currentWalkImage]
elif self.isJumping:
self.currentUpImage += 1
if self.currentUpImage >= len(Player.upImages):
self.currentUpImage = 0
self.image = Player.upImages[self.currentUpImage]
else:
self.currentDownImage += 1
if self.currentDownImage >= len(Player.downImages):
self.currentDownImage = 0
self.image = Player.downImages[self.currentDownImage]
self.updateCount = 0
+141 -8
View File
@@ -5,27 +5,160 @@ Standing enemy entity class
import pygame
import random
import os
from Enemy import Enemy
from CollisionBox import CollisionBox
class StandingEnemy(Enemy):
imgDir = os.path.join(os.path.dirname(__file__), 'data')
senemyImage = pygame.image.load(
os.path.join(imgDir, 'senemy.png')
)#.convert()
images = (
(
pygame.transform.scale(
senemyImage.subsurface((0, 0, 8, 24)), (32, 98)
),
pygame.transform.scale(
senemyImage.subsurface((8, 0, 8, 24)), (32, 98)
),
pygame.transform.scale(
senemyImage.subsurface((16, 0, 8, 24)), (32, 98)
),
pygame.transform.scale(
senemyImage.subsurface((24, 0, 8, 24)), (32, 98)
),
pygame.transform.scale(
senemyImage.subsurface((32, 0, 8, 24)), (32, 98)
),
pygame.transform.scale(
senemyImage.subsurface((40, 0, 8, 24)), (32, 98)
),
),
(
pygame.transform.scale(
senemyImage.subsurface((0, 24, 8, 16)), (32, 64)
),
pygame.transform.scale(
senemyImage.subsurface((8, 24, 8, 16)), (32, 64)
),
pygame.transform.scale(
senemyImage.subsurface((16, 24, 8, 16)), (32, 64)
),
pygame.transform.scale(
senemyImage.subsurface((24, 24, 8, 16)), (32, 64)
),
pygame.transform.scale(
senemyImage.subsurface((32, 24, 8, 16)), (32, 64)
),
pygame.transform.scale(
senemyImage.subsurface((40, 24, 8, 16)), (32, 64)
),
),
(
pygame.transform.scale(
senemyImage.subsurface((0, 40, 16, 16)), (64, 64)
),
pygame.transform.scale(
senemyImage.subsurface((16, 40, 16, 16)), (64, 64)
),
pygame.transform.scale(
senemyImage.subsurface((32, 40, 16, 16)), (64, 64)
),
pygame.transform.scale(
senemyImage.subsurface((0, 56, 16, 16)), (64, 64)
),
pygame.transform.scale(
senemyImage.subsurface((16, 56, 16, 16)), (64, 64)
),
pygame.transform.scale(
senemyImage.subsurface((32, 56, 16, 16)), (64, 64)
),
),
(
pygame.transform.scale(
senemyImage.subsurface((0, 72, 8, 8)), (32, 32)
),
pygame.transform.scale(
senemyImage.subsurface((8, 72, 8, 8)), (32, 32)
),
pygame.transform.scale(
senemyImage.subsurface((16, 72, 8, 8)), (32, 32)
),
pygame.transform.scale(
senemyImage.subsurface((24, 72, 8, 8)), (32, 32)
),
pygame.transform.scale(
senemyImage.subsurface((32, 72, 8, 8)), (32, 32)
),
pygame.transform.scale(
senemyImage.subsurface((40, 72, 8, 8)), (32, 32)
),
),
(
pygame.transform.scale(
senemyImage.subsurface((0, 80, 16, 8)), (64, 32)
),
pygame.transform.scale(
senemyImage.subsurface((16, 80, 16, 8)), (64, 32)
),
pygame.transform.scale(
senemyImage.subsurface((32, 80, 16, 8)), (64, 32)
),
pygame.transform.scale(
senemyImage.subsurface((0, 88, 16, 8)), (64, 32)
),
pygame.transform.scale(
senemyImage.subsurface((16, 88, 16, 8)), (64, 32)
),
pygame.transform.scale(
senemyImage.subsurface((32, 88, 16, 8)), (64, 32)
),
),
(
pygame.transform.scale(
senemyImage.subsurface((0, 96, 24, 8)), (98, 32)
),
pygame.transform.scale(
senemyImage.subsurface((24, 96, 24, 8)), (98, 32)
),
pygame.transform.scale(
senemyImage.subsurface((0, 104, 24, 8)), (98, 32)
),
pygame.transform.scale(
senemyImage.subsurface((24, 104, 24, 8)), (98, 32)
),
pygame.transform.scale(
senemyImage.subsurface((0, 112, 24, 8)), (98, 32)
),
pygame.transform.scale(
senemyImage.subsurface((24, 112, 24, 8)), (98, 32)
),
),
)
def __init__(self, mainGameClass):
Enemy.__init__(self, mainGameClass)
self.subtype = random.randint(1, 5)
for array in self.images:
for image in array:
image.set_colorkey((255,0,255))
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.subtype = random.randint(0, len(StandingEnemy.images) - 1)
self.image = random.choice(StandingEnemy.images[self.subtype])
self.rect = self.image.get_rect()
self.height -= self.rect.height/2
self.rect.center = (mainGameClass.getScreenWidth() + self.rect.width,
self.height)
collision = CollisionBox(9, 3, self.rect.w - 18, self.rect.h - 6, self.rect.center)
self.collisionBoxes.add(collision)
self.speed = self.thisGame.getGameSpeed()
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 282 B

BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.