feat: added a camera with orthographic projection and did some work restructuring the comet_app to make the setup system optional. Input handling is moved to the app

This commit is contained in:
lisk77 2024-11-13 03:33:02 +01:00
parent 780365aeb8
commit 5a9f632e3a
22 changed files with 1173 additions and 349 deletions

View file

@ -6,4 +6,8 @@ pub use comet_ecs as ecs;
pub use comet_app as app;
pub use comet_colors as colors;
pub use comet_input as input;
pub use comet_log as log;
pub use comet_log as log;
pub mod prelude {
pub use comet_app::App;
}

View file

@ -4,64 +4,89 @@ use comet::{
ApplicationType::*
},
renderer::Renderer,
ecs::World,
ecs::*,
math::*,
input::keyboard::*,
log::*
};
use winit::event::{WindowEvent};
use comet_ecs::{Component, ComponentSet, Render, Renderer2D, Transform2D};
use comet_input::mouse::{mouse_entered, mouse_pressed, Button};
fn input(event: &WindowEvent, app: &mut App, renderer: &mut Renderer) {
match event {
_ if key_pressed(event, Key::Escape) => app.quit(),
_ if key_pressed(event, Key::KeyC) => { renderer.clear_buffers() }
_ if key_pressed(event, Key::KeyE) => {
let mut renderer2d = Renderer2D::new();
renderer2d.set_texture(r"resources/textures/comet_icon.png");
renderer2d.set_visibility(true);
use winit_input_helper::WinitInputHelper;
use comet_input::input_handler::InputHandler;
let id = app.world_mut().new_entity();
app.world_mut().add_component(id as usize, renderer2d.clone());
app.world_mut().add_component(0, renderer2d);
fn update_position(input: WinitInputHelper, transform: &mut Transform2D, dt: f32) {
let mut direction = Vec2::ZERO;
let previous = transform.position().clone();
let transform = app.world_mut().get_component_mut::<Transform2D>(id as usize);
transform.position_mut().set_x(0.5);
if input.key_held(Key::KeyW) {
direction += Vec2::Y;
}
if input.key_held(Key::KeyA) {
direction -= Vec2::X;
}
if input.key_held(Key::KeyS) {
direction -= Vec2::Y;
}
if input.key_held(Key::KeyD) {
direction += Vec2::X;
}
debug!(format!("{:?}", app.world().components().get_component::<Renderer2D>(0)));
},
_ if key_pressed(event, Key::KeyW) => {
let transform = app.world_mut().get_component_mut::<Transform2D>(0);
let y = transform.position().y();
transform.position_mut().set_y(y + 0.1);
},
_ if key_pressed(event, Key::KeyA) => {
let transform = app.world_mut().get_component_mut::<Transform2D>(0);
let x = transform.position().x();
transform.position_mut().set_x(x - 0.1);
},
_ if key_pressed(event, Key::KeyS) => {
let transform = app.world_mut().get_component_mut::<Transform2D>(0);
let y = transform.position().y();
transform.position_mut().set_y(y - 0.1);
},
_ if key_pressed(event, Key::KeyD) => {
let transform = app.world_mut().get_component_mut::<Transform2D>(0);
let x = transform.position().x();
transform.position_mut().set_x(x + 0.1);
if direction != Vec2::ZERO {
let normalized_dir = direction.normalize();
if normalized_dir.x().is_nan() || normalized_dir.y().is_nan() {
error!("Direction is NaN! X: {}, Y: {}", normalized_dir.x(), normalized_dir.y());
}
_ => {}
let displacement = normalized_dir * 777.7 * dt;
transform.translate(displacement);
}
if (transform.position().as_vec() - previous.as_vec()).x() > 13.0 {
debug!("Actual Displacement: {:?}", transform.position().as_vec() - previous.as_vec());
}
}
fn update(world: &mut World, renderer: &mut Renderer) {
if !world.components().contains_components(ComponentSet::from_ids(vec![Transform2D::type_id(), Renderer2D::type_id()])) {
world.register_component::<Renderer2D>();
}
if world.entities().len() == 0 {
let id = world.new_entity();
fn setup(world: &mut World) {
world.register_component::<Renderer2D>();
//world.register_component::<Rectangle2D>();
let mut renderer2d = Renderer2D::new();
renderer2d.set_texture(r"resources/textures/comet_icon.png");
renderer2d.set_visibility(true);
let id = world.new_entity();
world.add_component(id as usize, renderer2d.clone());
let transform = world.get_component_mut::<Transform2D>(id as usize);
transform.translate(Vec2::X*5.0);
world.add_component(id as usize, renderer2d);
/*let rectangle2d = Rectangle2D::new(*tranform.position(), Vec2::new(0.1, 0.1));
world.add_component(id as usize, rectangle2d);
let id2 = world.new_entity();
let tranform2 = world.get_component_mut::<Transform2D>(id as usize);
let rectangle = Rectangle2D::new(*tranform2.position(), Vec2::new(0.1, 0.1));
world.add_component(id2 as usize, rectangle);*/
}
fn update(app: &mut App, renderer: &mut Renderer, dt: f32) {
if app.key_pressed(Key::Escape) { app.quit() }
if app.key_pressed(Key::KeyC) { app.set_time_step(0.0016667) }
if app.key_pressed(Key::KeyV) { app.set_time_step(0.0166667) }
if app.key_pressed(Key::KeyE) { app.world_mut().get_component_mut::<Transform2D>(0).translate([0f32,0f32].into()) }
if app.key_held(Key::KeyW)
|| app.key_held(Key::KeyA)
|| app.key_held(Key::KeyS)
|| app.key_held(Key::KeyD)
{
update_position(app.input_manager().clone(), app.world_mut().get_component_mut::<Transform2D>(0), dt);
}
let mut transform = app.world_mut().get_component_mut::<Transform2D>(0);
}
fn main() {
@ -69,6 +94,7 @@ fn main() {
.with_title("Comet App")
.with_icon(r"resources/textures/comet_icon.png")
.with_size(1920, 1080)
.run(input, update)
.with_setup(setup)
.run(update)
;
}