update imgui example with image widgets showing slime colors/bitmaps

This commit is contained in:
Gered 2023-05-26 12:04:02 -04:00
parent 73e64946f7
commit 3bb12fdcee
3 changed files with 44 additions and 19 deletions

View file

@ -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 },
})

View file

@ -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());

View file

@ -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);