use modulus for animations in mobs.py, beginning to implement PlayerAnimations class, add more docstrings to PlayerAnimations, remove cycle

This commit is contained in:
Xevion
2020-04-20 03:03:38 -05:00
parent 1e8f5b507c
commit 424892cc25
2 changed files with 18 additions and 21 deletions

View File

@@ -5,7 +5,8 @@ Organizes all classes related to Mobs, Entities, Enemies, Players and Items.
import arcade import arcade
from config import Config, Enums from config import Config, Enums, SpritePaths
from sprites import PlayerAnimations
class Mob(arcade.Sprite): class Mob(arcade.Sprite):
@@ -41,12 +42,12 @@ class Player(Mob):
def __init__(self, *args, **kwargs) -> None: def __init__(self, *args, **kwargs) -> None:
super(Player, self).__init__(*args, **kwargs) super(Player, self).__init__(*args, **kwargs)
main_path = "resources/images/character/knight/" self.animations = PlayerAnimations(SpritePaths.KNIGHT)
self.character_dir = Enums.FRONT_FACING # Face front by default.
# Default to face-front
self.character_dir = Enums.FRONT_FACING
# Load textures for idle standing # Load textures for idle standing
self.idle_textures = self.animations.idles
self.walking_textures = self.animations.
for i in range(4): for i in range(4):
texture = arcade.load_texture(f"{main_path}knight iso char_idle_{i}.png") texture = arcade.load_texture(f"{main_path}knight iso char_idle_{i}.png")
self.idle_textures.append(texture) self.idle_textures.append(texture)
@@ -81,32 +82,24 @@ class Player(Mob):
# Idle Animation # Idle Animation
if self.change_x == 0 and self.change_y == 0: if self.change_x == 0 and self.change_y == 0:
self.cur_texture += 1 self.cur_texture = (self.cur_texture + 1) % (Config.RUN_UPDATES_PER_FRAME * 3)
if self.cur_texture > 3 * Config.IDLE_UPDATES_PER_FRAME:
self.cur_texture = 0
self.texture = self.idle_textures[self.cur_texture // Config.IDLE_UPDATES_PER_FRAME] self.texture = self.idle_textures[self.cur_texture // Config.IDLE_UPDATES_PER_FRAME]
return return
# walk up animation # walk up animation
if self.change_y > 0: if self.change_y > 0:
self.cur_texture += 1 self.cur_texture = (self.cur_texture + 1) % (Config.RUN_UPDATES_PER_FRAME * 4)
if self.cur_texture > 4 * Config.RUN_UPDATES_PER_FRAME:
self.cur_texture = 0
self.texture = self.up_textures[self.cur_texture // Config.RUN_UPDATES_PER_FRAME] self.texture = self.up_textures[self.cur_texture // Config.RUN_UPDATES_PER_FRAME]
return return
# walk down animation # walk down animation
if self.change_y < 0: if self.change_y < 0:
self.cur_texture += 1 self.cur_texture = (self.cur_texture + 1) % (Config.RUN_UPDATES_PER_FRAME * 4)
if self.cur_texture > 4 * Config.RUN_UPDATES_PER_FRAME:
self.cur_texture = 0
self.texture = self.down_textures[self.cur_texture // Config.RUN_UPDATES_PER_FRAME] self.texture = self.down_textures[self.cur_texture // Config.RUN_UPDATES_PER_FRAME]
return return
# Walking left/right animation # Walking left/right animation
self.cur_texture += 1 self.cur_texture = (self.cur_texture + 1) % (Config.RUN_UPDATES_PER_FRAME * 5)
if self.cur_texture > 5 * Config.RUN_UPDATES_PER_FRAME:
self.cur_texture = 0
self.texture = self.walking_textures[self.cur_texture // Config.RUN_UPDATES_PER_FRAME][self.character_dir.value] self.texture = self.walking_textures[self.cur_texture // Config.RUN_UPDATES_PER_FRAME][self.character_dir.value]
def tick(self): def tick(self):

View File

@@ -7,7 +7,7 @@ import arcade
import os import os
import re import re
from itertools import cycle from typing import Pattern
class AnimationSet(object): class AnimationSet(object):
@@ -25,7 +25,7 @@ class AnimationSet(object):
self.directory = directory self.directory = directory
self.animations = os.listdir(directory) self.animations = os.listdir(directory)
def getAnimations(self, pattern: re.Pattern) -> iter: def getAnimations(self, pattern: Pattern) -> iter:
""" """
Loads all animations from the AnimationSet's directory that match the pattern. Loads all animations from the AnimationSet's directory that match the pattern.
The pattern must have 1 group that specifies the animation's index. The pattern must have 1 group that specifies the animation's index.
@@ -40,20 +40,24 @@ class AnimationSet(object):
matches.sort(key=lambda match: int(match.group(1))) matches.sort(key=lambda match: int(match.group(1)))
# Grab the filename and load it to the file directory # Grab the filename and load it to the file directory
matches = list(map(lambda match: arcade.load_texture(os.path.join(self.directory, match.group(0))), matches)) matches = list(map(lambda match: arcade.load_texture(os.path.join(self.directory, match.group(0))), matches))
return cycle(matches) return matches
class PlayerAnimations(AnimationSet): class PlayerAnimations(AnimationSet):
""" """
A class dedicated to serving player animations. A class dedicated to serving player animations.
Player animations must be served to the class in the correct format. Player animations must be served to the class in the correct format.
The correct format is: {action}[_{direction}]_{index}.png
action: [idle, run, slice] - The action being taken.
direction: [down, right, left, up] - The direction of the action, if applicable. Omit the underscore if not.
index: [0,) - The index of the animation. Index should be enumerated in ascending order.
""" """
def __init__(self, directory: str): def __init__(self, directory: str):
""" """
Initializes the PlayerAnimations class. Initializes the PlayerAnimations class.
""" """
super(PlayerAnimations, self).__init__(directory) super(PlayerAnimations, self).__init__(directory)
# Grabs all animations needed. These are infinite iters, use next(iter) to grab the next animation. # Grabs all animations needed. These are infinite iters, use next(iter) to grab the next animation.