#abstraction-layer #applications #ecs #building #logger #legion #penguin

penguin-application

Appbuilder and abstraction layer for building applications using legion ECS

2 releases

0.1.1 Dec 23, 2021
0.1.0 Dec 22, 2021

#765 in Debugging

34 downloads per month

MIT license

21KB
466 lines

Penguin App

Penguin app is an appbuilder and abstraction layer for looping applications built on winit, legion ecs and fern logger. It also adds a bevy-like plugin implementation to legion.

The package also includes an optional feature adding a time resource plugin, enabling easy access to deltatime.

Dependencies

Cargo.toml

[dependencies]
penguin-application = { version = "0.1" }
penguin-config = { version = "0.1" }

Configuration

Create an app-config.json file like this and put in your project root directory. Available logger levels are ["error", "warning", "info", "debug", "trace"] in decending order of importance.

app-config.json

{
  "logger_config": {
    "output_path": "logs/output.log",
    "debug_message_severity": "debug"
  },
  "window_config": {
    "width": 640,
    "height": 400
  }
}

Usage

Log

Log messages are generated with the standard log function calls, such as log::error!("message").

App

use penguin_config::PenguinConfig;
use penguin_app::{App, config::AppConfig};

fn main() {
    App::builder(AppConfig::read_config())
        .add_plugin(penguin_app::time_plugin::TimePlugin)
        .run()
        .unwrap();
}

Plugin

use penguin_app::ecs::*;
use penguin_app::time_plugin::Time;


pub struct MeasureTimePlugin;

impl Plugin for MeasureTimePlugin {
    fn startup(&mut self, resources: &mut Resources) -> Vec<Step> {
        resources.insert(PassedTimeResource::default());
        vec![]
    }

    fn run() -> Vec<Step> {
        Schedule::builder()
            .add_system(measure_time_system())
            .build()
            .into_vec()
    }

    fn shutdown() -> Vec<Step> {
        vec![] 
    }
}


#[derive(Default)]
struct PassedTimeResource(f32);

#[system]
fn measure_time(#[resource] passed_time: &mut PassedTimeResource, #[resource] time: &Time) {
    passed_time.0 += time.delta();
    log::info!("Time passed: {}", passed_time.0);
}

Dependencies

~10–22MB
~301K SLoC