From f0513f3962e9cf0372b064a01ef3bc222bbfc72a Mon Sep 17 00:00:00 2001 From: Xevion Date: Mon, 15 Apr 2024 16:10:31 -0500 Subject: [PATCH] SDL2_TTF; FPS Counter, downgrade EMSDK to 3.1.43 --- .cargo/config.toml | 2 +- .vscode/settings.json | 3 +++ Cargo.lock | 9 +++++---- Cargo.toml | 5 ++++- assets/TerminalVector.ttf | Bin 0 -> 50428 bytes scripts/build.sh | 5 ++--- src/main.rs | 32 +++++++++++++++++++++++++++++--- 7 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 assets/TerminalVector.ttf diff --git a/.cargo/config.toml b/.cargo/config.toml index d321f8a..8ce636d 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -5,7 +5,7 @@ rustflags = [ #"-C", "link-args=-O3 --closure 1", "-C", "link-args=-sASYNCIFY -sALLOW_MEMORY_GROWTH=1", # "-C", "link-args=-sALLOW_MEMORY_GROWTH=1", - "-C", "link-args=-sUSE_SDL=2 -sUSE_SDL_IMAGE=2 -sSDL2_IMAGE_FORMATS=['png']", + "-C", "link-args=-sUSE_SDL=2 -sUSE_SDL_IMAGE=2 -sUSE_SDL_TTF=2 -sSDL2_IMAGE_FORMATS=['png']", # USE_OGG, USE_VORBIS for OGG/VORBIS usage "-C", "link-args=--preload-file assets/", ] diff --git a/.vscode/settings.json b/.vscode/settings.json index 352a626..15b66bf 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,8 @@ { "rust-analyzer.linkedProjects": [ "./Cargo.toml" + ], + "cSpell.words": [ + "rwops" ] } \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 27a9171..fad4172 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -101,6 +101,7 @@ version = "0.1.0" dependencies = [ "colors-transform", "lazy_static", + "libc", "rand", "sdl2", "spin_sleep", @@ -215,9 +216,9 @@ checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "sdl2" -version = "0.36.0" +version = "0.35.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8356b2697d1ead5a34f40bcc3c5d3620205fe0c7be0a14656223bfeec0258891" +checksum = "f7959277b623f1fb9e04aea73686c3ca52f01b2145f8ea16f4ff30d8b7623b1a" dependencies = [ "bitflags", "lazy_static", @@ -227,9 +228,9 @@ dependencies = [ [[package]] name = "sdl2-sys" -version = "0.36.0" +version = "0.35.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26bcacfdd45d539fb5785049feb0038a63931aa896c7763a2a12e125ec58bd29" +checksum = "e3586be2cf6c0a8099a79a12b4084357aa9b3e0b0d7980e3b67aaf7a9d55f9f0" dependencies = [ "cfg-if", "libc", diff --git a/Cargo.toml b/Cargo.toml index 0fa1a90..1282b99 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,8 +9,11 @@ edition = "2021" colors-transform = "0.2.11" lazy_static = "1.4.0" rand = "0.8.5" -sdl2 = { version = "0.36", features = ["image", "ttf", "mixer"] } +sdl2 = { version = "0.35", features = ["image", "ttf"] } spin_sleep = "1.1.1" tracing = { version = "0.1.37", features = ["max_level_debug", "release_max_level_debug"]} tracing-error = "0.2.0" tracing-subscriber = {version = "0.3.17", features = ["env-filter"]} + +[target.'cfg(target_os = "emscripten")'.dependencies] +libc = "0.2.16" \ No newline at end of file diff --git a/assets/TerminalVector.ttf b/assets/TerminalVector.ttf new file mode 100644 index 0000000000000000000000000000000000000000..60468e616f044e3cebfb0bbffab10a5ff0a8b417 GIT binary patch literal 50428 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 ttf::Sdl2TtfContext { + ttf::init().unwrap() +} + +// Honestly, I don't know why this is necessary. I'm just copying from https://github.com/aelred/tetris/blob/0ad88153db1ca7962b42277504c0f7f9f3c675a9/tetris-sdl/src/main.rs#L88-L92 +#[cfg(target_os = "emscripten")] +fn ttf_context() -> &'static ttf::Sdl2TtfContext { + // Deliberately leak so we get a static lifetime + Box::leak(Box::new(ttf::init().unwrap())) +} + fn main() { let ctx = sdl2::init().unwrap(); let video_ctx = ctx.video().unwrap(); @@ -57,11 +73,13 @@ fn main() { let texture_creator = canvas.texture_creator(); let mut point = Point::new(0, 0); + let ttf_ctx = ttf_context(); + let mut prev = now(); - // let ctx = Rc::new(RefCell::new(ctx)); - // let canvas = Rc::new(RefCell::new(canvas)); - // let texture_creator = Rc::new(texture_creator); + let font_data = RWops::from_bytes(FONT_DATA).unwrap(); + let font_size = 32; + let font = ttf_ctx.load_font_from_rwops(font_data, font_size).unwrap(); let fruit_atlas = texture_creator .load_texture("./assets/fruit.png") @@ -135,6 +153,14 @@ fn main() { canvas.set_draw_color(BLACK); canvas.clear(); + // draw fps counter + let surface = font + .render(&format!("{:.2}", avg_fps)) + .blended(Color::RGBA(255, 255, 255, 255)) + .unwrap(); + let texture = texture_creator.create_texture_from_surface(&surface).unwrap(); + let _ = canvas.copy(&texture, None, Rect::new(0, 0, 100, 100)); + canvas .copy_ex( &fruit_atlas,