An egui implementation for the ggez game framework
use ggegui::{egui, Gui};
use ggez::{
ContextBuilder, Context, GameResult, glam,
event::{ self, EventHandler},
graphics::{ self, DrawParam, Color }
};
fn main() {
let (mut ctx, event_loop) = ContextBuilder::new("game_id", "author").build().unwrap();
let state = State::new(&mut ctx);
event::run(ctx, event_loop, state);
}
struct State {
gui: Gui,
}
impl State {
pub fn new(ctx: &mut Context) -> Self {
Self {
gui: Gui::new(ctx),
}
}
}
impl EventHandler for State {
fn update(&mut self, ctx: &mut Context) -> GameResult {
let gui_ctx = self.gui.ctx();
egui::Window::new("Title").show(&gui_ctx, |ui| {
ui.label("label");
if ui.button("button").clicked() {
println!("button clicked");
}
});
self.gui.update(ctx);
Ok(())
}
fn draw(&mut self, ctx: &mut Context) -> GameResult {
let mut canvas = graphics::Canvas::from_frame(ctx, Color::BLACK);
canvas.draw(
&self.gui,
DrawParam::default().dest(glam::Vec2::ZERO),
);
canvas.finish(ctx)
}
}
NOTE: due to how ggez is made currently there is no way to access the raw events emited by eventloop so instead to get the events using the functions and the context of EventHandler, as shown in the example of adove inside
EventHandler::update
is calledGui::update
this function extract the information inside the context to send it to egui and draws everything. To make use of text input you must callInput::text_input_event
inside ofEventHandler::text_input_event
like thisself.gui.input.text_input_event(character)
, this also applies toInput::mouse_wheel_event
andInput::resize_event
, you just call then inside of their respective functions exposed byEventHandler
.
there are a few examples to show how to use this implementation.