#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

#4 in #legion

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

~9–20MB
~286K SLoC