}
snake_draw :: (use this: ^Snake, cell_size: f32) {
- for it: iter.enumerate(iter.as_iterator(body)) {
+ for it: iter.enumerate(body) {
hb.graphics.setColor(0, 0.6 - 0.4 * (~~it.index / cast(f32) body.count), 0);
hb.graphics.rectangle(.Fill, ~~it.value.x * cell_size, ~~it.value.y * cell_size, cell_size, cell_size);
}
};
}
+Lost_Options :: struct {
+ ["Play again"]
+ option_1 := () {
+
+ };
+
+ ["Main menu"]
+ option_2 := () {
+ state = .MainMenu;
+ active_menu = .{ Main_Menu_Options };
+
+ the_snake = snake_make(.{ 0, 0 });
+ the_food = .{ 10, 10 };
+ };
+}
+
active_menu: Menu;
load :: () {
+ random.set_seed(clock.time());
hb.window.setTitle("Snake 🐍");
hb.utils.load_assets(^assets);
last_down_down = down_down;
}
- if !up_down && last_up_down { active_menu.selected_option -= 1; }
- if !down_down && last_down_down { active_menu.selected_option += 1; }
+ if up_down && !last_up_down { active_menu.selected_option -= 1; }
+ if down_down && !last_down_down { active_menu.selected_option += 1; }
option_count := (cast(^type_info.Type_Info_Struct) type_info.get_type_info(active_menu.options)).members.count;
if active_menu.selected_option < 0 do active_menu.selected_option = 0;
if active_menu.selected_option >= option_count do active_menu.selected_option = option_count - 1;
- if hb.input.keyIsDown(.Space) {
+ #persist last_space_down := false;
+ space_down := hb.input.keyIsDown(.Space);
+ defer last_space_down = space_down;
+ if space_down && !last_space_down {
option := (cast(^type_info.Type_Info_Struct) type_info.get_type_info(active_menu.options)).members[active_menu.selected_option];
if option.type == #type () -> void {
func := *(cast(^() -> void) option.default);
if cell_contains_snake_body(the_snake.head) {
state = .Lost;
+ active_menu = .{Lost_Options};
}
}
}
hb.graphics.setFont(assets.title_font);
hb.graphics.setColor(1, 1, 1);
centered_text("You Lost!", 100);
+
+ draw_menu(200);
}
}
}