update imgui example with image widgets showing slime colors/bitmaps
This commit is contained in:
parent
73e64946f7
commit
3bb12fdcee
|
@ -1,12 +1,15 @@
|
|||
use crate::entities::{AnimationDef, EntityActivity, Event};
|
||||
use crate::support::{load_bitmap_atlas_autogrid, load_font, load_palette};
|
||||
use crate::tilemap::TileMap;
|
||||
use anyhow::Result;
|
||||
use ggdt::prelude::*;
|
||||
use std::collections::HashMap;
|
||||
use std::path::Path;
|
||||
use std::rc::Rc;
|
||||
|
||||
use anyhow::Result;
|
||||
|
||||
use ggdt::prelude::*;
|
||||
|
||||
use crate::entities::{AnimationDef, EntityActivity, Event, SlimeColor};
|
||||
use crate::support::{load_bitmap_atlas_autogrid, load_font, load_palette};
|
||||
use crate::tilemap::TileMap;
|
||||
|
||||
pub struct CoreContext {
|
||||
pub delta: f32,
|
||||
pub camera_x: i32,
|
||||
|
@ -25,6 +28,7 @@ pub struct CoreContext {
|
|||
pub tilemap: TileMap,
|
||||
pub slime_activity_states: Rc<HashMap<EntityActivity, Rc<AnimationDef>>>,
|
||||
pub sprite_render_list: Vec<(EntityId, Vector2, RgbaBlitMethod)>,
|
||||
pub slime_texture_id_map: HashMap<SlimeColor, imgui::TextureId>,
|
||||
}
|
||||
|
||||
impl CoreState<Standard> for CoreContext {
|
||||
|
@ -103,7 +107,15 @@ impl GameContext {
|
|||
let component_systems = ComponentSystems::new();
|
||||
let event_publisher = EventPublisher::new();
|
||||
let event_listeners = EventListeners::new();
|
||||
let imgui = ggdt_imgui::ImGui::new();
|
||||
let mut imgui = ggdt_imgui::ImGui::new();
|
||||
|
||||
let mut slime_texture_id_map = HashMap::new();
|
||||
slime_texture_id_map
|
||||
.insert(SlimeColor::Green, imgui.texture_map_mut().insert(green_slime.clone_tile(0).unwrap()));
|
||||
slime_texture_id_map
|
||||
.insert(SlimeColor::Blue, imgui.texture_map_mut().insert(blue_slime.clone_tile(0).unwrap()));
|
||||
slime_texture_id_map
|
||||
.insert(SlimeColor::Orange, imgui.texture_map_mut().insert(orange_slime.clone_tile(0).unwrap()));
|
||||
|
||||
let slime_activity_states = HashMap::from([
|
||||
(EntityActivity::Idle, Rc::new(AnimationDef::new(&[1, 2], true, 1.0, Some(3)))),
|
||||
|
@ -129,6 +141,7 @@ impl GameContext {
|
|||
tilemap,
|
||||
slime_activity_states: Rc::new(slime_activity_states),
|
||||
sprite_render_list: Vec::new(),
|
||||
slime_texture_id_map,
|
||||
},
|
||||
support: SupportContext { component_systems, event_listeners, imgui },
|
||||
})
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
use crate::context::{CoreContext, GameContext};
|
||||
use crate::tilemap::TileMap;
|
||||
use ggdt::prelude::*;
|
||||
use std::collections::HashMap;
|
||||
use std::rc::Rc;
|
||||
|
||||
use ggdt::prelude::*;
|
||||
|
||||
use crate::context::{CoreContext, GameContext};
|
||||
use crate::tilemap::TileMap;
|
||||
|
||||
pub const FRICTION: f32 = 0.5;
|
||||
pub const DEFAULT_PUSH_STRENGTH: f32 = 0.5;
|
||||
pub const DEFAULT_PUSH_DISSIPATION: f32 = 0.5;
|
||||
|
@ -211,7 +213,7 @@ impl RandomlyWalksAround {
|
|||
}
|
||||
}
|
||||
|
||||
pub struct Slime;
|
||||
pub struct Slime(pub SlimeColor);
|
||||
|
||||
pub struct Sprite {
|
||||
pub atlas: Rc<BitmapAtlas<RgbaBitmap>>,
|
||||
|
@ -738,7 +740,7 @@ pub fn new_slime_entity(
|
|||
let animate_by_activity = AnimateByActivity(context.slime_activity_states.clone());
|
||||
let animation = AnimationInstance::from(animate_by_activity.0.get(&activity).unwrap().clone());
|
||||
|
||||
context.entities.add_component(id, Slime);
|
||||
context.entities.add_component(id, Slime(color));
|
||||
context.entities.add_component(id, Position(Vector2::new(x as f32, y as f32)));
|
||||
context.entities.add_component(id, Velocity(Vector2::ZERO));
|
||||
context.entities.add_component(id, Forces::new());
|
||||
|
|
|
@ -1,15 +1,16 @@
|
|||
mod context;
|
||||
mod entities;
|
||||
mod support;
|
||||
mod tilemap;
|
||||
|
||||
use anyhow::Result;
|
||||
|
||||
use ggdt::prelude::*;
|
||||
use ggdt_imgui::UiSupport;
|
||||
|
||||
use crate::context::GameContext;
|
||||
use crate::entities::{Forces, Position, Slime};
|
||||
use crate::tilemap::{TILE_HEIGHT, TILE_WIDTH};
|
||||
use ggdt::prelude::*;
|
||||
use ggdt_imgui::UiSupport;
|
||||
|
||||
mod context;
|
||||
mod entities;
|
||||
mod support;
|
||||
mod tilemap;
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct DemoState {
|
||||
|
@ -27,17 +28,26 @@ impl AppState<GameContext> for DemoState {
|
|||
let ui = context.support.imgui.new_frame(&context.core.system.res.video);
|
||||
ui.window("Entities")
|
||||
.position([10.0, 10.0], imgui::Condition::FirstUseEver)
|
||||
.size([200.0, 200.0], imgui::Condition::FirstUseEver)
|
||||
.size([240.0, 200.0], imgui::Condition::FirstUseEver)
|
||||
.build(|| {
|
||||
ui.text(format!("Camera: {}, {}", context.core.camera_x, context.core.camera_y));
|
||||
|
||||
ui.separator();
|
||||
ui.text_colored([1.0, 1.0, 0.0, 1.0], "Slimes");
|
||||
let mut positions = context.core.entities.components_mut::<Position>().unwrap();
|
||||
let mut slime_types = context.core.entities.components::<Slime>();
|
||||
for (slime, _) in context.core.entities.components::<Slime>().unwrap().iter() {
|
||||
let position = positions.get(slime).unwrap();
|
||||
let slime_type = slime_types.get(slime).unwrap();
|
||||
ui.text(format!("{:2} @ {:3.0},{:3.0}", *slime, position.0.x, position.0.y));
|
||||
|
||||
if let Some(slime_type_texture_id) = context.core.slime_texture_id_map.get(&slime_type.0) {
|
||||
ui.same_line();
|
||||
ui.invisible_button("Slime Type", [16.0, 16.0]);
|
||||
let draw_list = ui.get_window_draw_list();
|
||||
draw_list.add_image(*slime_type_texture_id, ui.item_rect_min(), ui.item_rect_max()).build();
|
||||
}
|
||||
|
||||
ui.same_line();
|
||||
let clicked = {
|
||||
let _id = ui.push_id_ptr(slime);
|
||||
|
|
Loading…
Reference in a new issue