Skip to content

Commit e7b1318

Browse files
authored
Fluid menus (#13)
* add scroll arrows to column menu * add scroll arrows to grid menu * added scrol larrows to nested menu * minor fix * fix grid menu drawing with blank spaces * add smooth scrolling to column menu * add fluid scrolling to grid menu * fix drawing of blank menu entries * fix menu fade out issues * fix binding icon vertical alignment issue * add nudger * update version number
1 parent 1db853e commit e7b1318

File tree

31 files changed

+523
-56
lines changed

31 files changed

+523
-56
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Version: 4.2.0
1+
Version: 4.3.0
Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,64 @@
11
event_inherited();
22
var _x = x + cursor_padding;
3+
var _y = y;
4+
var _y_offset = 0;
5+
var _item;
6+
7+
if (view_height > 0 && view_scroll_progress_y.v != 0) {
8+
_y_offset = (item_height + line_spacing) * -view_scroll_progress_y.v;
9+
}
310

411
for (var i=view_area.x; i<=view_area.y; i++) {
5-
var _item = items[| i];
6-
var _y = y + (item_height + line_spacing) * (i - view_area.x);
12+
_item = items[| i];
13+
14+
if (is_struct(_item)) {
15+
if (view_height > 0) {
16+
if (view_scroll_progress_y.v < 0 && i == view_area.y) {
17+
// Scroll up last element
18+
draw_set_alpha(1-abs(view_scroll_progress_y.v));
19+
} else if (view_scroll_progress_y.v > 0 && i == view_area.x) {
20+
// Scroll down first element
21+
draw_set_alpha(1-abs(view_scroll_progress_y.v));
22+
}
23+
}
724

8-
self.menu_base_draw_item(_item, _x, _y);
25+
self.menu_base_draw_item(_item, _x, _y + _y_offset);
26+
draw_set_alpha(menu_alpha.v);
27+
}
28+
_y += item_height + line_spacing;
29+
}
30+
31+
if (view_height > 0) {
32+
if (view_scroll_progress_y.v < 0 && view_area.x > 0) {
33+
// Scroll up first element
34+
_item = items[| view_area.x - 1];
35+
if (is_struct(_item)) {
36+
draw_set_alpha(abs(view_scroll_progress_y.v));
37+
self.menu_base_draw_item(_item, _x, y - (item_height + line_spacing) + _y_offset);
38+
draw_set_alpha(menu_alpha.v);
39+
}
40+
} else if (view_scroll_progress_y.v > 0 && view_area.y + 1 < num_items) {
41+
// Scroll down last element
42+
_item = items[| view_area.y + 1];
43+
if (is_struct(_item)) {
44+
draw_set_alpha(abs(view_scroll_progress_y.v));
45+
self.menu_base_draw_item(_item, _x, _y + _y_offset);
46+
draw_set_alpha(menu_alpha.v);
47+
}
48+
}
949
}
1050

1151
if (enabled) {
12-
draw_sprite(cursor_spr, 0, x, y + (item_height + line_spacing) * (pos - view_area.x) + item_height / 2);
52+
draw_sprite(cursor_spr, 0, x, y + (item_height + line_spacing) * (pos - view_area.x) + item_height / 2 + _y_offset);
53+
54+
if (view_height > 0) {
55+
if (view_area.x > 0) {
56+
draw_sprite(view_scroll_arrows_spr, 0, x + view_scroll_arrows_x, y - view_scroll_arrows_margin);
57+
}
58+
59+
if (view_area.y < num_items - 1) {
60+
draw_sprite_ext(view_scroll_arrows_spr, 0, x + view_scroll_arrows_x, _y + view_scroll_arrows_margin, 1, -1, 0, c_white, 1);
61+
}
62+
}
1363
}
14-
draw_set_alpha(1);
64+
draw_set_alpha(menu_alpha.v);

current-scripts/Demos/useful-scripts/objects/obj_column_menu/Step_1.gml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ if (control_state.pressed_state[MENU_CONTROLS.UP]) {
1919
&& ds_list_find_index(_item.types, "divider") == -1)
2020
|| _cur_pos == pos)
2121

22-
self.column_menu_update_view();
22+
var _should_scroll = self.column_menu_update_view() && (pos < _cur_pos);
23+
if (_should_scroll) self.menu_base_start_scroll_up();
2324
audio_play_sound(cursor_move_sfx, 1, false);
2425
}
2526
}
@@ -36,7 +37,8 @@ if (control_state.pressed_state[MENU_CONTROLS.DOWN]) {
3637
&& ds_list_find_index(_item.types, "divider") == -1)
3738
|| _cur_pos == pos)
3839

39-
self.column_menu_update_view();
40+
var _should_scroll = self.column_menu_update_view() && (pos > _cur_pos);
41+
if (_should_scroll) self.menu_base_start_scroll_down();
4042
audio_play_sound(cursor_move_sfx, 1, false);
4143
}
4244
}

current-scripts/Demos/useful-scripts/objects/obj_column_menu/obj_column_menu.yy

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

current-scripts/Demos/useful-scripts/objects/obj_column_menu_demo/Create_0.gml

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ menu = instance_create_layer(32, 64, layer, obj_column_menu);
44
menu.column_menu_init({
55
player_controller: my_player,
66
font: fnt_demo,
7-
view_height: 0,
7+
view_height: 4,
88
cursor_spr: spr_arrow,
99
cursor_move_sfx: snd_menu_move,
1010
cursor_change_sfx: snd_menu_move,
@@ -16,7 +16,7 @@ menu.column_menu_init({
1616
});
1717

1818
menu.column_menu_add_selectable({
19-
label: "Foo",
19+
label: "Item 1",
2020
on_confirm_func: "menu_demo_on_confirm",
2121
on_confirm_args: ["Foo"],
2222
silent_on_confirm: false
@@ -33,7 +33,7 @@ menu.column_menu_add_selectable({
3333
// - {boolean} silent_on_change
3434

3535
menu.column_menu_add_spinner({
36-
label: "Bar",
36+
label: "Item 2",
3737
values: ["A", 1, "B", 2, "C", 3],
3838
init_index: 0,
3939
on_confirm_func: -1,
@@ -45,15 +45,51 @@ menu.column_menu_add_spinner({
4545
});
4646

4747
menu.column_menu_add_selectable({
48-
label: "Baz",
48+
label: "Item 3",
4949
on_confirm_func: "menu_demo_on_confirm",
5050
on_confirm_args: ["Baz"],
5151
silent_on_confirm: false
5252
});
5353

5454
menu.column_menu_add_selectable({
55-
label: "Qux",
55+
label: "Item 4",
5656
on_confirm_func: "menu_demo_on_confirm",
5757
on_confirm_args: ["Qux"],
5858
silent_on_confirm: false
59-
});
59+
});
60+
61+
menu.column_menu_add_selectable({
62+
label: "Item 5",
63+
on_confirm_func: "menu_demo_on_confirm",
64+
on_confirm_args: ["Foo"],
65+
silent_on_confirm: false
66+
});
67+
68+
menu.column_menu_add_spinner({
69+
label: "Item 6",
70+
values: ["A", 1, "B", 2, "C", 3],
71+
init_index: 0,
72+
on_confirm_func: -1,
73+
on_confirm_args: [],
74+
on_change_func: -1,
75+
on_change_args: [],
76+
silent_on_confirm: false,
77+
silent_on_change: false
78+
});
79+
80+
menu.column_menu_add_selectable({
81+
label: "Item 7",
82+
on_confirm_func: "menu_demo_on_confirm",
83+
on_confirm_args: ["Baz"],
84+
silent_on_confirm: false
85+
});
86+
87+
menu.column_menu_add_selectable({
88+
label: "Item 8",
89+
on_confirm_func: "menu_demo_on_confirm",
90+
on_confirm_args: ["Qux"],
91+
silent_on_confirm: false
92+
});
93+
94+
menu.view_scroll_arrows_margin = 24;
95+
menu.view_scroll_arrows_x = 68;

current-scripts/Demos/useful-scripts/objects/obj_grid_menu/Create_0.gml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ event_inherited();
33
items = ds_grid_create(1, 1);
44
pos = new Vector2(0, 0);
55
view_area = new Rectangle(0, 0, 0, 0);
6+
view_scroll_progress_x = new Tween(0, 0, -1, 1, TweenLimitMode.CLAMP, true);
67

78
grid_menu_functions();
Lines changed: 97 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,86 @@
11
event_inherited();
2+
var _x_offset = 0;
3+
var _y_offset = 0;
4+
5+
if (view_width > 0 && view_scroll_progress_x.v != 0) {
6+
_x_offset = (cursor_padding + column_width) * -view_scroll_progress_x.v;
7+
}
8+
9+
if (view_height > 0 && view_scroll_progress_y.v != 0) {
10+
_y_offset = (item_height + line_spacing) * -view_scroll_progress_y.v;
11+
}
212

313
for (var i=view_area.left; i<=view_area.right; i++) {
4-
var _x = x + cursor_padding * (i-view_area.left+1) + column_width * i;
14+
var _x = x + cursor_padding * (i-view_area.left+1) + column_width * (i-view_area.left);
15+
var _y = y;
516

617
for (var j=view_area.top; j<=view_area.bottom; j++) {
718
var _item = items[# i, j];
8-
if (!is_struct(_item)) continue;
9-
10-
var _y = y + (item_height + line_spacing) * (j-view_area.top);
11-
self.menu_base_draw_item(_item, _x, _y);
19+
20+
if (is_struct(_item)) {
21+
if (view_width > 0) {
22+
if (view_scroll_progress_x.v < 0 && i == view_area.right) {
23+
// Scroll left last element
24+
draw_set_alpha(1-abs(view_scroll_progress_x.v));
25+
} else if (view_scroll_progress_x.v > 0 && i == view_area.left) {
26+
// Scroll right first element
27+
draw_set_alpha(1-abs(view_scroll_progress_x.v));
28+
}
29+
}
30+
31+
if (view_height > 0) {
32+
if (view_scroll_progress_y.v < 0 && j == view_area.bottom) {
33+
// Scroll up last element
34+
draw_set_alpha(1-abs(view_scroll_progress_y.v));
35+
} else if (view_scroll_progress_y.v > 0 && j == view_area.top) {
36+
// Scroll down first element
37+
draw_set_alpha(1-abs(view_scroll_progress_y.v));
38+
}
39+
}
40+
41+
self.menu_base_draw_item(_item, _x + _x_offset, _y + _y_offset);
42+
}
43+
44+
if (view_width > 0 && i == view_area.left) {
45+
if (view_scroll_progress_x.v < 0 && view_area.left > 0) {
46+
// Scroll left first element
47+
_item = items[# view_area.left - 1, j];
48+
if (is_struct(_item)) {
49+
draw_set_alpha(abs(view_scroll_progress_x.v));
50+
self.menu_base_draw_item(_item, x - column_width + _x_offset, _y + _y_offset);
51+
}
52+
} else if (view_scroll_progress_x.v > 0 && view_area.right + 1 < items_width) {
53+
// Scroll right last element
54+
_item = items[# view_area.right + 1, j];
55+
if (is_struct(_item)) {
56+
draw_set_alpha(abs(view_scroll_progress_x.v));
57+
self.menu_base_draw_item(_item, _x + (column_width + cursor_padding)*2 + _x_offset, _y + _y_offset);
58+
}
59+
}
60+
}
61+
62+
draw_set_alpha(menu_alpha.v);
63+
_y += item_height + line_spacing;
64+
}
65+
66+
if (view_height > 0) {
67+
if (view_scroll_progress_y.v < 0 && view_area.top > 0) {
68+
// Scroll up first element
69+
_item = items[# i, view_area.top - 1];
70+
if (is_struct(_item)) {
71+
draw_set_alpha(abs(view_scroll_progress_y.v));
72+
self.menu_base_draw_item(_item, _x + _x_offset, y - (item_height + line_spacing) + _y_offset);
73+
draw_set_alpha(menu_alpha.v);
74+
}
75+
} else if (view_scroll_progress_y.v > 0 && view_area.bottom + 1 < items_height) {
76+
// Scroll down last element
77+
_item = items[# i, view_area.bottom + 1];
78+
if (is_struct(_item)) {
79+
draw_set_alpha(abs(view_scroll_progress_y.v));
80+
self.menu_base_draw_item(_item, _x + _x_offset, _y + _y_offset);
81+
draw_set_alpha(menu_alpha.v);
82+
}
83+
}
1284
}
1385
}
1486

@@ -17,5 +89,24 @@ if (enabled) {
1789
x + (cursor_padding + column_width) * (pos.x - view_area.left),
1890
y + (item_height + line_spacing) * (pos.y - view_area.top) + item_height / 2
1991
);
92+
93+
if (view_height >= 1) {
94+
if (view_area.top > 0) {
95+
draw_sprite(view_scroll_arrows_spr, 0, x + view_scroll_arrows_x, y - view_scroll_arrows_margin);
96+
}
97+
98+
if (view_area.bottom < items_height - 1) {
99+
draw_sprite_ext(view_scroll_arrows_spr, 0, x + view_scroll_arrows_x, _y + view_scroll_arrows_margin, 1, -1, 0, c_white, 1);
100+
}
101+
}
102+
if (view_width >= 1) {
103+
if (view_area.left > 0){
104+
draw_sprite_ext(view_scroll_arrows_spr, 0, x - view_scroll_arrows_margin, y + view_scroll_arrows_y, 1, 1, 90, c_white, 1);
105+
}
106+
107+
if (view_area.right < items_width - 1) {
108+
draw_sprite_ext(view_scroll_arrows_spr, 0, _x + view_scroll_arrows_margin + cursor_padding, y + view_scroll_arrows_y, 1, 1, 270, c_white, 1);
109+
}
110+
}
20111
}
21-
draw_set_alpha(1);
112+
draw_set_alpha(menu_alpha.v);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
event_inherited();
2+
3+
view_scroll_progress_x.update();
4+
5+
if ((view_scroll_progress_x.d > 0 && view_scroll_progress_x.v > 0)
6+
|| (view_scroll_progress_x.d < 0 && view_scroll_progress_x.v < 0)) {
7+
view_scroll_progress_x.d = 0;
8+
view_scroll_progress_x.v = 0;
9+
}

current-scripts/Demos/useful-scripts/objects/obj_grid_menu/Step_1.gml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ if (control_state.pressed_state[MENU_CONTROLS.UP]) {
1919
&& ds_list_find_index(_item.types, "divider") == -1)
2020
|| _cur_pos == pos.y)
2121

22-
self.grid_menu_update_view();
23-
22+
var _should_scroll = self.grid_menu_update_view().y && (pos.y < _cur_pos);
23+
if (_should_scroll) self.grid_menu_start_scroll_up();
2424
audio_play_sound(cursor_move_sfx, 1, false);
2525
}
2626
}
@@ -37,8 +37,8 @@ if (control_state.pressed_state[MENU_CONTROLS.DOWN]) {
3737
&& ds_list_find_index(_item.types, "divider") == -1)
3838
|| _cur_pos == pos.y)
3939

40-
self.grid_menu_update_view();
41-
40+
var _should_scroll = self.grid_menu_update_view().y && (pos.y > _cur_pos);
41+
if (_should_scroll) self.grid_menu_start_scroll_down();
4242
audio_play_sound(cursor_move_sfx, 1, false);
4343
}
4444
}
@@ -67,7 +67,8 @@ if (control_state.pressed_state[MENU_CONTROLS.LEFT]) {
6767
&& ds_list_find_index(_item.types, "divider") == -1)
6868
|| _cur_pos == pos.x)
6969

70-
self.grid_menu_update_view();
70+
var _should_scroll = self.grid_menu_update_view().x && (pos.x < _cur_pos);
71+
if (_should_scroll) self.grid_menu_start_scroll_left();
7172
audio_play_sound(cursor_move_sfx, 1, false);
7273
}
7374

@@ -95,7 +96,8 @@ if (control_state.pressed_state[MENU_CONTROLS.RIGHT]) {
9596
&& ds_list_find_index(_item.types, "divider") == -1)
9697
|| _cur_pos == pos.x)
9798

98-
self.grid_menu_update_view();
99+
var _should_scroll = self.grid_menu_update_view().x && (pos.x > _cur_pos);
100+
if (_should_scroll) self.grid_menu_start_scroll_right();
99101
audio_play_sound(cursor_move_sfx, 1, false);
100102
}
101103

current-scripts/Demos/useful-scripts/objects/obj_grid_menu/obj_grid_menu.yy

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)