Source code for scripts.nqp.processors.display

from __future__ import annotations

import pytweening

from scripts.engine.core import query, utility, world
from scripts.engine.core.component import Aesthetic, LightSource
from scripts.engine.core.utility import is_close
from scripts.engine.internal.constant import GameState, SpriteCategory, TILE_SIZE

__all__ = ["process_updates"]


[docs]def process_updates(time_delta: float, game_state: GameState): """ Fire realtime processors. """ if game_state == GameState.GAME_MAP: _process_aesthetic_update(time_delta) _process_lighting()
[docs]def _process_aesthetic_update(time_delta: float): """ Update aesthetics, such as entity animations and draw positions. """ # move entities screen position towards target for entity, ( _, aesthetic, ) in query.active_and_aesthetic: assert isinstance(aesthetic, Aesthetic) # ignore idle if aesthetic.current_sprite_category == SpriteCategory.IDLE: continue max_duration = 0.3 # increment time aesthetic.current_sprite_duration += time_delta # Have we exceeded animation duration? time_exceeded = aesthetic.current_sprite_duration > max_duration # if moving, do we need to show moving to a new position? if aesthetic.draw_x != aesthetic.target_draw_x or aesthetic.draw_y != aesthetic.target_draw_y: lerp_amount = pytweening.easeOutCubic(min(1.0, aesthetic.current_sprite_duration)) aesthetic.draw_x = utility.lerp(aesthetic.draw_x, aesthetic.target_draw_x, lerp_amount) aesthetic.draw_y = utility.lerp(aesthetic.draw_y, aesthetic.target_draw_y, lerp_amount) # time for animation exceeded if time_exceeded: aesthetic.set_draw_to_target() aesthetic.set_current_sprite(SpriteCategory.IDLE)
[docs]def _process_lighting(): """ Update lighting draw position using light sources of all entities """ # get game map details game_map = world.get_game_map() light_box = game_map.light_box # process all light sources for entity, (light_source, aesthetic) in query.light_source_and_aesthetic: light_source: LightSource aesthetic: Aesthetic # update lights in the light box try: light = light_box.get_light(light_source.light_id) except KeyError: print(light_source.light_id, light_box, light_box.lights) raise KeyError() x = aesthetic.draw_x * TILE_SIZE + (TILE_SIZE / 2) y = aesthetic.draw_y * TILE_SIZE + (TILE_SIZE / 2) light.position = [x, y]