//! Game entity rendering //! //! Generally the naming convention should be: `{type}Rndr` //! (`Renderer`, but shorter). use crate::color; use super::prelude::*; use rst_core::data::{Owner, Node, Color}; use std::sync::Arc; /// A set of universal X/Y coordinates pub struct Coordinates(pub f32, pub f32); impl<'a> From<&'a Coordinates> for Point2 { fn from(c: &'a Coordinates) -> Self { Point2 { x: c.0, y: c.1 } } } pub struct NodeRndr { pub loc: Coordinates, pub inner: Arc, } impl Renderer for NodeRndr { fn update(&mut self, _: &mut ClientState, _: &mut Context) -> GameResult<()> { Ok(()) } fn draw(&self, s: &ClientState, ctx: &mut Context) -> GameResult<()> { let frame = s.assets().find("frame/frame_s").unwrap(); let icon = s.assets().find("relay/relay1").unwrap(); let x = self.loc.0 - frame.width() as f32; let y = self.loc.1 - frame.height() as f32; let color = match self.inner.owner { Owner::Player(ref p) => color::to(p.color), Owner::Neutral => color::to(Color::white()), }; frame.draw(ctx, DrawParam::new().dest([x, y]).color(color))?; icon.draw(ctx, DrawParam::new().dest([x, y]).color(color))?; Ok(()) } }