Files
Drakora/Player.py
T
2021-04-02 15:21:36 +03:00

123 lines
3.8 KiB
Python

"""
Player entity class
"""
import pygame
import math
import os
class Player(pygame.sprite.Sprite):
def __init__(self):
self.imgDir = os.path.join(os.path.dirname(__file__), 'data')
self.walkImages = (
pygame.image.load(os.path.join(self.imgDir, 'player1.png')).convert(),
pygame.image.load(os.path.join(self.imgDir, 'player2.png')).convert(),
pygame.image.load(os.path.join(self.imgDir, 'player3.png')).convert(),
pygame.image.load(os.path.join(self.imgDir, 'player2.png')).convert(),
)
self.currentWalkImage = 0
for image in self.walkImages:
image.set_colorkey((255,0,255))
pygame.sprite.Sprite.__init__(self)
self.image = self.walkImages[self.currentWalkImage]
# 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
self.isDownJump = False
self.isDownCrouch = False
self.buttonsJump = (pygame.K_UP, pygame.K_SPACE,)
self.buttonsCrouch = (pygame.K_DOWN,)
self.gameSpeed = 1
self.updateCount = 0
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):
if self.isCrouching:
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:
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):
self.updateCount += 1
if self.updateCount == 15:
self.currentWalkImage += 1
if self.currentWalkImage >= len(self.walkImages):
self.currentWalkImage = 0
self.image = self.walkImages[self.currentWalkImage]
self.updateCount = 0
if not self.speed: self.rect.y += 1
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:
# maxHoverCount = 30
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