1use std::path::{Path, PathBuf};
2
3use fennel_engine::{events, graphics::{self, Graphics}, resources::{loadable::Font, LoadableResource, ResourceManager}, EventHandler, Game};
4use sdl3::pixels::Color;
5use tokio::runtime::Handle;
6
7struct State {}
8
9#[async_trait::async_trait]
10impl EventHandler for State {
11 async fn update(&self, _game: &mut Game) -> anyhow::Result<()> {
12 Ok(())
13 }
14
15 async fn draw(&self, game: &mut Game) -> anyhow::Result<()> {
16 game.graphics.canvas.set_draw_color(Color::RGB(0, 0, 0));
17 game.graphics.canvas.clear();
18 game.graphics
19 .draw_image(
20 "examples/example.png".to_string(),
21 (0.0, 0.0),
22 &mut game.resource_manager,
23 )
24 .expect("failed to draw an image");
25 game.graphics.draw_text("hi".to_string(), (64.0, 64.0), "Terminus (TTF) 32".to_string(), Color::RGBA(255, 0, 0, 0), &mut game.resource_manager)?;
26 game.graphics.canvas.present();
27 Ok(())
28 }
29
30 fn key_down_event(
31 &self,
32 game: &mut Game,
33 _timestamp: u64,
34 _window_id: u32,
35 keycode: Option<sdl3::keyboard::Keycode>,
36 _scancode: Option<sdl3::keyboard::Scancode>,
37 _keymod: sdl3::keyboard::Mod,
38 _repeat: bool,
39 _which: u32,
40 _raw: u16,
41 ) -> anyhow::Result<()> {
42 println!("{:?}", keycode);
43 tokio::task::block_in_place(move || {
44 Handle::current().block_on(async move {
45 game.audio
46 .play_audio(Path::new("examples/music.ogg"), false)
47 .await
48 .unwrap();
49 })
50 });
51 Ok(())
52 }
53}
54
55fn load_font(path: PathBuf, resource_manager: &mut ResourceManager, graphics: &mut Graphics, size: f32) {
56 let font = Font::load(path, graphics, Some(size));
57 resource_manager.cache_asset(font.unwrap()).unwrap();
58}
59
60#[tokio::main]
61async fn main() {
62 let graphics = graphics::Graphics::new(String::from("my cool game"), (500, 500));
63 let mut game = fennel_engine::Game::new(
64 String::from("my cool game"),
65 String::from("wiltshire"),
66 graphics.unwrap(),
67 );
68 load_font("examples/terminus.ttf".into(), &mut game.resource_manager, &mut game.graphics, 32.0);
69 events::run(&mut game, Box::new(State {})).await;
70}