diff options
| -rw-r--r-- | pong/Cargo.toml | 14 | ||||
| -rw-r--r-- | pong/pong.tdy | 63 | ||||
| -rw-r--r-- | pong/src/main.rs | 84 |
3 files changed, 161 insertions, 0 deletions
diff --git a/pong/Cargo.toml b/pong/Cargo.toml new file mode 100644 index 0000000..8e8cace --- /dev/null +++ b/pong/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "pong" +version = "0.1.0" +authors = ["Gustav Sörnäs <gustav@sornas.net>"] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +tihdy = { path = ".."} +tihdy_derive = { path = "../tihdy_derive" } + +macroquad = "0.2" +tokio = { version = "1", features = ["rt", "rt-multi-thread"] } diff --git a/pong/pong.tdy b/pong/pong.tdy new file mode 100644 index 0000000..9405a5c --- /dev/null +++ b/pong/pong.tdy @@ -0,0 +1,63 @@ +blob Paddle { + x: float + y: float +} + +blob Player { + paddle: Paddle +} + +blob State { + p1: Player + p2: Player +} + +update := fn state: State { + delta := get_delta() + + if key_down("w") { + state.p1.paddle.y = state.p1.paddle.y + delta + } + if key_down("s") { + state.p1.paddle.y = state.p1.paddle.y - delta + } + + if key_down("i") { + state.p2.paddle.y = state.p2.paddle.y + delta + } + if key_down("i") { + state.p2.paddle.y = state.p2.paddle.y - delta + } +} + +draw := fn state: State { + clear() + draw_rectangle(state.p1.paddle.x, state.p1.paddle.y, 0.2, 1.) + draw_rectangle(state.p2.paddle.x, state.p2.paddle.y, 0.2, 1.) + next_frame() +} + +init := fn { + running := true + + state := State() + state.p1 = Player() + state.p1.paddle = Paddle() + state.p1.paddle.x = 1. + state.p1.paddle.y = 10. + + state.p2 = Player() + state.p2.paddle = Paddle() + state.p2.paddle.x = 19. + state.p2.paddle.y = 10. + + for i := 0, i < 5, i = i + 1 { + log(state.p1.paddle.x, state.p1.paddle.y) + log(state.p2.paddle.x, state.p2.paddle.y) + + update(state) + draw(state) + } +} + +init() diff --git a/pong/src/main.rs b/pong/src/main.rs new file mode 100644 index 0000000..b29136b --- /dev/null +++ b/pong/src/main.rs @@ -0,0 +1,84 @@ +use macroquad::{Camera2D, DARKPURPLE, KeyCode, SKYBLUE, clear_background, draw_rectangle, get_frame_time, is_key_down, next_frame, set_camera, vec2}; +use std::path::Path; +use tihdy::{Type, Value}; +use tihdy_derive::extern_function; + +const SCREEN_WIDTH: f32 = 20.0; +const SCREEN_HEIGHT: f32 = 20.0; + +extern_function!(log + [Value::Float(f1), Value::Float(f2)] -> Type::Void => { + println!("({}, {})", f1, f2); + Ok(Value::Nil) + }, +); + +extern_function!(get_delta + [] -> Type::Float => { + Ok(Value::Float(get_frame_time() as f64)) + }, +); + +extern_function!(key_down + [Value::String(s)] -> Type::Bool => { + let s: &str = s; + Ok(Value::Bool(match s { + "w" => is_key_down(KeyCode::W), + "s" => is_key_down(KeyCode::S), + "i" => is_key_down(KeyCode::I), + "k" => is_key_down(KeyCode::K), + _ => false, + })) + }, +); + +extern_function!(my_next_frame + [] -> Type::Void => { + tokio::spawn(async { + next_frame().await + }); + Ok(Value::Nil) + }, +); + +extern_function!(my_draw_rectangle + [Value::Float(x), Value::Float(y), Value::Float(w), Value::Float(h)] -> Type::Void => { + println!("Drawing rectangle {} {} {} {}", x, y, w, h); + draw_rectangle(*x as f32, *y as f32, *w as f32, *h as f32, DARKPURPLE); + Ok(Value::Nil) + }, +); + +extern_function!(clear + [] -> Type::Void => { + clear_background(SKYBLUE); + Ok(Value::Nil) + }, +); + +#[macroquad::main("Pong")] +async fn main() { + set_camera(Camera2D { + zoom: vec2(1. / SCREEN_WIDTH * 2., -1. / SCREEN_HEIGHT * 2.), + target: vec2(SCREEN_WIDTH / 2., SCREEN_HEIGHT / 2.), + ..Default::default() + }); + + let rt = tokio::runtime::Runtime::new().unwrap(); + + let functions: Vec<(String, tihdy::RustFunction)> = vec![ + ("log".to_string(), log), + ("get_delta".to_string(), get_delta), + ("key_down".to_string(), key_down), + ("next_frame".to_string(), my_next_frame), + ("draw_rectangle".to_string(), my_draw_rectangle), + ("clear".to_string(), clear), + ]; + + let _guard = rt.enter(); // so we can async { next_frame().await } + if let Err(errs) = tihdy::run_file(Path::new("pong.tdy"), false, functions) { + for err in errs { + println!("{}", err); + } + } +} |
