Module game_qu.paths.followable_path
Expand source code
from abc import ABC, abstractmethod
from game_qu.base.library_independant_utility_functions import get_kwarg_item
from game_qu.base.velocity_calculator import VelocityCalculator
class FollowablePath(ABC):
"""An interface that defines the behavior of a path that is followable"""
game_object = None
current_time = 0
is_started = False
attribute_modifying = None
max_time = 0
last_time = 0
last_delta_time = 0
has_max_time = False
def __init__(self, **kwargs):
""" Initializes the object
Args:
game_object (GameObject): the game object that is following this path
attribute_modifying (str): the name of the attribute this path is modifying
max_time (float): the max time of the path - the time the path should end (None if the path should not end)
Returns:
None
"""
self.game_object = get_kwarg_item(kwargs, "game_object", None)
self.attribute_modifying = get_kwarg_item(kwargs, "attribute_modifying", "")
self.max_time = get_kwarg_item(kwargs, "max_time", 0)
self.has_max_time = kwargs.get("max_time") is not None
def run(self, is_reset_event=False, is_start_event=False, is_changing_attribute=False):
"""Updates the time of the followable path and the player's attribute if it was told to"""
self.last_time = self.current_time
# It should not be started again if it has already been started because starting puts the current_time back to 0
if is_start_event and not self.is_started:
self.start()
if is_reset_event:
self.reset()
if self.is_started:
self.current_time += VelocityCalculator.time
can_change_attribute = self.is_started and self.game_object is not None
should_change_attribute = can_change_attribute and is_changing_attribute
self.last_delta_time = self.current_time - self.last_time
# If the attribute should be changed, then this will change it
if should_change_attribute:
self.game_object.__dict__[self.attribute_modifying] += self.get_delta_value(self.last_time, self.current_time)
def reset(self):
"""Ends and resets the path"""
self.is_started = False
self.current_time = 0
self.last_time = 0
def is_done(self, should_reset=False):
"""
Returns:
bool: if the path is finished (and if 'should_reset' it will reset it)"""
return_value = self.current_time >= self.max_time and self.has_max_time
if should_reset and return_value:
self.reset()
return return_value
def has_finished(self):
"""
Returns:
bool: if the path has either not started or is done"""
return not self.is_started or self.is_done()
def start(self):
"""Starts the followable path"""
self.is_started = True
self.current_time = 0
self.last_time = 0
def restart(self):
"""Restarts the path (same as start, but sounds more clear)"""
self.start()
@abstractmethod
def get_value_at_time(self, time):
"""
Returns:
object: the value of the attribute this path is modifying at 'time'"""
pass
@abstractmethod
def get_delta_value(self, start_time, end_time):
"""
Returns:
object: the delta value of the attribute within the domain [start_time, end_time]"""
pass
def get_current_value(self):
return self.get_value_at_time(self.current_time)
def get_current_time(self):
return self.current_time
def set_has_max_time(self, has_max_time):
self.has_max_time = has_max_time
Classes
class FollowablePath (**kwargs)-
An interface that defines the behavior of a path that is followable
Initializes the object
Args
game_object:GameObject- the game object that is following this path
attribute_modifying:str- the name of the attribute this path is modifying
max_time:float- the max time of the path - the time the path should end (None if the path should not end)
Returns
None
Expand source code
class FollowablePath(ABC): """An interface that defines the behavior of a path that is followable""" game_object = None current_time = 0 is_started = False attribute_modifying = None max_time = 0 last_time = 0 last_delta_time = 0 has_max_time = False def __init__(self, **kwargs): """ Initializes the object Args: game_object (GameObject): the game object that is following this path attribute_modifying (str): the name of the attribute this path is modifying max_time (float): the max time of the path - the time the path should end (None if the path should not end) Returns: None """ self.game_object = get_kwarg_item(kwargs, "game_object", None) self.attribute_modifying = get_kwarg_item(kwargs, "attribute_modifying", "") self.max_time = get_kwarg_item(kwargs, "max_time", 0) self.has_max_time = kwargs.get("max_time") is not None def run(self, is_reset_event=False, is_start_event=False, is_changing_attribute=False): """Updates the time of the followable path and the player's attribute if it was told to""" self.last_time = self.current_time # It should not be started again if it has already been started because starting puts the current_time back to 0 if is_start_event and not self.is_started: self.start() if is_reset_event: self.reset() if self.is_started: self.current_time += VelocityCalculator.time can_change_attribute = self.is_started and self.game_object is not None should_change_attribute = can_change_attribute and is_changing_attribute self.last_delta_time = self.current_time - self.last_time # If the attribute should be changed, then this will change it if should_change_attribute: self.game_object.__dict__[self.attribute_modifying] += self.get_delta_value(self.last_time, self.current_time) def reset(self): """Ends and resets the path""" self.is_started = False self.current_time = 0 self.last_time = 0 def is_done(self, should_reset=False): """ Returns: bool: if the path is finished (and if 'should_reset' it will reset it)""" return_value = self.current_time >= self.max_time and self.has_max_time if should_reset and return_value: self.reset() return return_value def has_finished(self): """ Returns: bool: if the path has either not started or is done""" return not self.is_started or self.is_done() def start(self): """Starts the followable path""" self.is_started = True self.current_time = 0 self.last_time = 0 def restart(self): """Restarts the path (same as start, but sounds more clear)""" self.start() @abstractmethod def get_value_at_time(self, time): """ Returns: object: the value of the attribute this path is modifying at 'time'""" pass @abstractmethod def get_delta_value(self, start_time, end_time): """ Returns: object: the delta value of the attribute within the domain [start_time, end_time]""" pass def get_current_value(self): return self.get_value_at_time(self.current_time) def get_current_time(self): return self.current_time def set_has_max_time(self, has_max_time): self.has_max_time = has_max_timeAncestors
- abc.ABC
Subclasses
Class variables
var attribute_modifyingvar current_timevar game_objectvar has_max_timevar is_startedvar last_delta_timevar last_timevar max_time
Methods
def get_current_time(self)-
Expand source code
def get_current_time(self): return self.current_time def get_current_value(self)-
Expand source code
def get_current_value(self): return self.get_value_at_time(self.current_time) def get_delta_value(self, start_time, end_time)-
Returns
object- the delta value of the attribute within the domain [start_time, end_time]
Expand source code
@abstractmethod def get_delta_value(self, start_time, end_time): """ Returns: object: the delta value of the attribute within the domain [start_time, end_time]""" pass def get_value_at_time(self, time)-
Returns
object- the value of the attribute this path is modifying at 'time'
Expand source code
@abstractmethod def get_value_at_time(self, time): """ Returns: object: the value of the attribute this path is modifying at 'time'""" pass def has_finished(self)-
Returns
bool- if the path has either not started or is done
Expand source code
def has_finished(self): """ Returns: bool: if the path has either not started or is done""" return not self.is_started or self.is_done() def is_done(self, should_reset=False)-
Returns
bool- if the path is finished (and if 'should_reset' it will reset it)
Expand source code
def is_done(self, should_reset=False): """ Returns: bool: if the path is finished (and if 'should_reset' it will reset it)""" return_value = self.current_time >= self.max_time and self.has_max_time if should_reset and return_value: self.reset() return return_value def reset(self)-
Ends and resets the path
Expand source code
def reset(self): """Ends and resets the path""" self.is_started = False self.current_time = 0 self.last_time = 0 def restart(self)-
Restarts the path (same as start, but sounds more clear)
Expand source code
def restart(self): """Restarts the path (same as start, but sounds more clear)""" self.start() def run(self, is_reset_event=False, is_start_event=False, is_changing_attribute=False)-
Updates the time of the followable path and the player's attribute if it was told to
Expand source code
def run(self, is_reset_event=False, is_start_event=False, is_changing_attribute=False): """Updates the time of the followable path and the player's attribute if it was told to""" self.last_time = self.current_time # It should not be started again if it has already been started because starting puts the current_time back to 0 if is_start_event and not self.is_started: self.start() if is_reset_event: self.reset() if self.is_started: self.current_time += VelocityCalculator.time can_change_attribute = self.is_started and self.game_object is not None should_change_attribute = can_change_attribute and is_changing_attribute self.last_delta_time = self.current_time - self.last_time # If the attribute should be changed, then this will change it if should_change_attribute: self.game_object.__dict__[self.attribute_modifying] += self.get_delta_value(self.last_time, self.current_time) def set_has_max_time(self, has_max_time)-
Expand source code
def set_has_max_time(self, has_max_time): self.has_max_time = has_max_time def start(self)-
Starts the followable path
Expand source code
def start(self): """Starts the followable path""" self.is_started = True self.current_time = 0 self.last_time = 0