summaryrefslogtreecommitdiff
path: root/src/main.rs
blob: 513a83014b11c80fa7333e09549bf9cc3a7769b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
use macroquad::prelude::*;

const SCREEN_WIDTH: f32 = 500.0;
const SCREEN_HEIGHT: f32 = 800.0;
const PLAYER_SIZE: f32 = 50.0;
const GRAVITY: f32 = 1.2;
const JUMP_HEIGHT: f32 = 20.0;
const BAR_GAP: f32 = 150.0;
const BAR_SPEED: f32 = 2.0;
const BAR_WIDTH: f32 = 50.0;

struct Player {
  x: f32,
  y: f32,
  velocity_y: f32,
}

impl Player {
  fn draw(&self) {
    draw_rectangle(self.x, self.y, PLAYER_SIZE, PLAYER_SIZE, GOLD);
  }

  fn is_colliding_with_bar(&self, bar: &Bar) -> bool {
    if self.x + PLAYER_SIZE < bar.x
         || self.x > bar.x + BAR_WIDTH {
       return false;
    }
    if self.y + PLAYER_SIZE < bar.y + BAR_GAP && self.y > bar.y - BAR_GAP {
       return false;
    }
    true
  }
}

struct Bar {
  x: f32,
  y: f32,
  velocity_x: f32,
}

impl Bar {
  fn draw(&self) {
    draw_rectangle(self.x, 0.0, BAR_WIDTH, self.y - BAR_GAP, BLACK);
    draw_rectangle(self.x, self.y + BAR_GAP, BAR_WIDTH, SCREEN_HEIGHT, BLACK);
  }
}

#[macroquad::main("FlappyBird")]
async fn main() {
    loop {
        loop {
            request_new_screen_size(SCREEN_WIDTH, SCREEN_HEIGHT);
            clear_background(BLUE);
            if is_key_pressed(KeyCode::Enter) {
                break;
            }
            next_frame().await
        }
    
        let score = play().await;
        println!("{}", score);
    }
}

async fn play() -> i32 {
    let x = 100.0;
    let y = (SCREEN_HEIGHT - PLAYER_SIZE) / 2.0;
    let mut player = Player {x, y, velocity_y: 0.0};

    let bar_y = macroquad::rand::gen_range(2.0 * BAR_GAP, SCREEN_HEIGHT - (2.0 * BAR_GAP));
    let mut bar = Bar {x: SCREEN_WIDTH, y: bar_y, velocity_x: BAR_SPEED};

    let mut score = 0;
    
    loop {
        clear_background(BLUE);

        player.velocity_y += GRAVITY;

        if is_key_pressed(KeyCode::Space) {
           player.velocity_y = -JUMP_HEIGHT;
        }

        if player.y < 0.0 || player.y > SCREEN_HEIGHT - PLAYER_SIZE {
           break;
        }
        player.y += player.velocity_y;

        bar.x -= bar.velocity_x;

        if bar.x < -BAR_WIDTH {
            bar.x = SCREEN_WIDTH;
            bar.y = (2.0 * BAR_GAP) +
                    (macroquad::rand::rand() as f32 % (SCREEN_HEIGHT - (4.0 * BAR_GAP)));
            score += 1;
        }

        if player.is_colliding_with_bar(&bar) {
            break;
        }

        player.draw();
        bar.draw();
        draw_text(&score.to_string(), SCREEN_WIDTH / 2.0 - 25.0, 50.0, 60.0, WHITE);

        next_frame().await
    }
    score
}