player.py
unknown
plain_text
a year ago
6.5 kB
6
Indexable
import pygame from settings import * from support import import_folder from entity import Entity class Player(Entity): def __init__(self,pos,groups,obstacle_sprites,create_attack,destroy_attack,create_magic): super().__init__(groups) self.image = pygame.image.load('graphics/test/player.png').convert_alpha() self.rect = self.image.get_rect(topleft = pos) self.hitbox = self.rect.inflate(-6,HITBOX_OFFSET['player']) # graphics setup self.import_player_assets() self.status = 'down' # movement self.attacking = False self.attack_cooldown = 400 self.attack_time = None self.obstacle_sprites = obstacle_sprites # weapon self.create_attack = create_attack self.destroy_attack = destroy_attack self.weapon_index = 0 self.weapon = list(weapon_data.keys())[self.weapon_index] self.can_switch_weapon = True self.weapon_switch_time = None self.switch_duration_cooldown = 200 # magic self.create_magic = create_magic self.magic_index = 0 self.magic = list(magic_data.keys())[self.magic_index] self.can_switch_magic = True self.magic_switch_time = None # stats self.stats = {'health': 100,'energy':60,'attack': 10,'magic': 4,'speed': 5} self.max_stats = {'health': 300, 'energy': 140, 'attack': 20, 'magic' : 10, 'speed': 10} self.upgrade_cost = {'health': 100, 'energy': 100, 'attack': 100, 'magic' : 100, 'speed': 100} self.health = self.stats['health'] * 0.5 self.energy = self.stats['energy'] * 0.8 self.exp = 5000 self.speed = self.stats['speed'] # damage timer self.vulnerable = True self.hurt_time = None self.invulnerability_duration = 500 # import a sound self.weapon_attack_sound = pygame.mixer.Sound('audio/sword.wav') self.weapon_attack_sound.set_volume(0.4) def import_player_assets(self): character_path = 'graphics/player/' self.animations = {'up': [],'down': [],'left': [],'right': [], 'right_idle':[],'left_idle':[],'up_idle':[],'down_idle':[], 'right_attack':[],'left_attack':[],'up_attack':[],'down_attack':[]} for animation in self.animations.keys(): full_path = character_path + animation self.animations[animation] = import_folder(full_path) def input(self): if not self.attacking: keys = pygame.key.get_pressed() # movement input if keys[pygame.K_w]: self.direction.y = -1 self.status = 'up' elif keys[pygame.K_s]: self.direction.y = 1 self.status = 'down' else: self.direction.y = 0 if keys[pygame.K_d]: self.direction.x = 1 self.status = 'right' elif keys[pygame.K_a]: self.direction.x = -1 self.status = 'left' else: self.direction.x = 0 # attack input if keys[pygame.K_SPACE]: self.attacking = True self.attack_time = pygame.time.get_ticks() self.create_attack() self.weapon_attack_sound.play() # magic input if keys[pygame.K_LCTRL]: self.attacking = True self.attack_time = pygame.time.get_ticks() style = list(magic_data.keys())[self.magic_index] strength = list(magic_data.values())[self.magic_index]['strength'] + self.stats['magic'] cost = list(magic_data.values())[self.magic_index]['cost'] self.create_magic(style,strength,cost) if keys[pygame.K_q] and self.can_switch_weapon: self.can_switch_weapon = False self.weapon_switch_time = pygame.time.get_ticks() if self.weapon_index < len(list(weapon_data.keys())) - 1: self.weapon_index += 1 else: self.weapon_index = 0 self.weapon = list(weapon_data.keys())[self.weapon_index] if keys[pygame.K_e] and self.can_switch_magic: self.can_switch_magic = False self.magic_switch_time = pygame.time.get_ticks() if self.magic_index < len(list(magic_data.keys())) - 1: self.magic_index += 1 else: self.magic_index = 0 self.magic = list(magic_data.keys())[self.magic_index] def get_status(self): # idle status if self.direction.x == 0 and self.direction.y == 0: if not 'idle' in self.status and not 'attack' in self.status: self.status = self.status + '_idle' if self.attacking: self.direction.x = 0 self.direction.y = 0 if not 'attack' in self.status: if 'idle' in self.status: self.status = self.status.replace('_idle','_attack') else: self.status = self.status + '_attack' else: if 'attack' in self.status: self.status = self.status.replace('_attack','') def cooldowns(self): current_time = pygame.time.get_ticks() if self.attacking: if current_time - self.attack_time >= self.attack_cooldown + weapon_data[self.weapon]['cooldown']: self.attacking = False self.destroy_attack() if not self.can_switch_weapon: if current_time - self.weapon_switch_time >= self.switch_duration_cooldown: self.can_switch_weapon = True if not self.can_switch_magic: if current_time - self.magic_switch_time >= self.switch_duration_cooldown: self.can_switch_magic = True if not self.vulnerable: if current_time - self.hurt_time >= self.invulnerability_duration: self.vulnerable = True def animate(self): animation = self.animations[self.status] # loop over the frame index self.frame_index += self.animation_speed if self.frame_index >= len(animation): self.frame_index = 0 # set the image self.image = animation[int(self.frame_index)] self.rect = self.image.get_rect(center = self.hitbox.center) # flicker if not self.vulnerable: alpha = self.wave_value() self.image.set_alpha(alpha) else: self.image.set_alpha(255) def get_full_weapon_damage(self): base_damage = self.stats['attack'] weapon_damage = weapon_data[self.weapon]['damage'] return base_damage + weapon_damage def get_full_magic_damage(self): base_damage = self.stats['magic'] spell_damage = magic_data[self.magic]['strength'] return base_damage + spell_damage def get_value_by_index(self,index): return list(self.stats.values())[index] def get_cost_by_index(self,index): return list(self.upgrade_cost.values())[index] def energy_recovery(self): if self.energy < self.stats['energy']: self.energy += 0.01 * self.stats['magic'] else: self.energy = self.stats['energy'] def update(self): self.input() self.cooldowns() self.get_status() self.animate() self.move(self.stats['speed']) self.energy_recovery()
Editor is loading...
Leave a Comment