aboutsummaryrefslogtreecommitdiffstats
path: root/pong
diff options
context:
space:
mode:
authorEdvard Thörnros <edvard.thornros@gmail.com>2021-01-31 09:55:09 +0100
committerEdvard Thörnros <edvard.thornros@gmail.com>2021-01-31 09:55:09 +0100
commit40b9ec3f0f1273440d4405b531cd3290dd259b78 (patch)
treef9a75024f6435e7ff67709531933f983b2e8e4f4 /pong
parent349055ef2533bf3268f37d3c04e5adb84814f50a (diff)
downloadsylt-40b9ec3f0f1273440d4405b531cd3290dd259b78.tar.gz
Add a ball, that kinda moves
Diffstat (limited to 'pong')
-rw-r--r--pong/pong.tdy69
-rw-r--r--pong/src/main.rs12
2 files changed, 72 insertions, 9 deletions
diff --git a/pong/pong.tdy b/pong/pong.tdy
index 24886c8..e1eb210 100644
--- a/pong/pong.tdy
+++ b/pong/pong.tdy
@@ -3,6 +3,14 @@ blob Paddle {
y: float
}
+blob Ball {
+ x: float
+ y: float
+
+ vx: float
+ vy: float
+}
+
blob Player {
paddle: Paddle
}
@@ -10,36 +18,89 @@ blob Player {
blob State {
p1: Player
p2: Player
+ ball: Ball
+}
+
+ball_speed := 2.0
+SPEED := 10.0
+
+abs := fn a: float -> float {
+ if a < 0.0 {
+ ret -a
+ }
+ ret a
+}
+
+and := fn a: bool, b: bool -> bool {
+ if a {
+ ret b
+ }
+ ret false
+}
+
+or := fn a: bool, b: bool -> bool {
+ if a {
+ ret true
+ }
+ ret b
+}
+
+rect_overlap := fn ax: float, ay: float, aw: float, ah: float, bx: float, by: float, bw: float, bh: float -> bool {
+ dx := abs(ax - bx) + (-aw - bw) / 2.
+ dy := abs(ay - by) + (-ah - bh) / 2.
+ ret and(dx < 0., dy < 0.)
+}
+
+ball_and_paddle_check := fn pad: Paddle, ball: Ball {
+ if rect_overlap(ball.x, ball.y, 0.2, 0.2, pad.x, pad.y, 0.2, 1.) {
+ ball.vx = -ball.vx
+ }
}
update := fn state: State {
delta := get_delta()
+ speed := delta * SPEED
if key_down("w") {
- state.p1.paddle.y = state.p1.paddle.y - delta
+ state.p1.paddle.y = state.p1.paddle.y - speed
}
if key_down("s") {
- state.p1.paddle.y = state.p1.paddle.y + delta
+ state.p1.paddle.y = state.p1.paddle.y + speed
}
if key_down("i") {
- state.p2.paddle.y = state.p2.paddle.y - delta
+ state.p2.paddle.y = state.p2.paddle.y - speed
}
if key_down("k") {
- state.p2.paddle.y = state.p2.paddle.y + delta
+ state.p2.paddle.y = state.p2.paddle.y + speed
}
+
+ state.ball.x = state.ball.x + delta * state.ball.vx
+ state.ball.y = state.ball.y + delta * state.ball.vy
+
+
+ ball_and_paddle_check(state.p1.paddle, state.ball)
+ ball_and_paddle_check(state.p2.paddle, state.ball)
}
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.)
+
+ draw_rectangle(state.ball.x, state.ball.y, 0.2, 0.2)
}
init := fn {
running := true
state := State()
+ state.ball = Ball()
+ state.ball.x = 10.0
+ state.ball.y = 10.0
+ state.ball.vx = 1.0
+ state.ball.vy = 0.0
+
state.p1 = Player()
state.p1.paddle = Paddle()
state.p1.paddle.x = 1.
diff --git a/pong/src/main.rs b/pong/src/main.rs
index c3cc0bf..2ab4b4a 100644
--- a/pong/src/main.rs
+++ b/pong/src/main.rs
@@ -49,11 +49,6 @@ extern_function!(clear
#[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 functions: Vec<(String, tihdy::RustFunction)> = vec![
("log".to_string(), log),
@@ -70,6 +65,13 @@ async fn main() {
}
return;
}
+
+ set_camera(Camera2D {
+ zoom: vec2(1. / SCREEN_WIDTH * 2., -1. / SCREEN_HEIGHT * 2.),
+ target: vec2(SCREEN_WIDTH / 2., SCREEN_HEIGHT / 2.),
+ ..Default::default()
+ });
+
let mut vm = vm.unwrap();
loop {
match vm.run() {