aboutsummaryrefslogtreecommitdiffstats
path: root/pong
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2021-01-30 20:19:27 +0100
committerGustav Sörnäs <gustav@sornas.net>2021-01-30 20:19:27 +0100
commit7f21946126a24c27a324779823a3413679f177a0 (patch)
tree9ff90838c91ad27e39bc3355d0044c58c9c3eea5 /pong
parent52042f3cd5e44cffc4d6badc28ff98ea310f050c (diff)
downloadsylt-7f21946126a24c27a324779823a3413679f177a0.tar.gz
add pong
Diffstat (limited to 'pong')
-rw-r--r--pong/Cargo.toml14
-rw-r--r--pong/pong.tdy63
-rw-r--r--pong/src/main.rs84
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);
+ }
+ }
+}