Compare commits
2 Commits
d2e5ed82ad
...
96a6ccff39
Author | SHA1 | Date |
---|---|---|
|
96a6ccff39 | |
|
451b099ec4 |
43
engine/gui.c
43
engine/gui.c
|
@ -1,5 +1,7 @@
|
||||||
#include "gui.h"
|
#include "gui.h"
|
||||||
|
#include "raylib.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#define RAYGUI_MAX_CONTROLS 16 // Maximum number of standard controls
|
#define RAYGUI_MAX_CONTROLS 16 // Maximum number of standard controls
|
||||||
#define RAYGUI_MAX_PROPS_BASE 16 // Maximum number of standard properties
|
#define RAYGUI_MAX_PROPS_BASE 16 // Maximum number of standard properties
|
||||||
|
@ -633,6 +635,7 @@ float UI_slider(const UIComp_t* comp, const char *textLeft, const char *textRigh
|
||||||
|
|
||||||
void vert_scrollarea_init(VertScrollArea_t* scroll_area, Rectangle display_area, Vector2 canvas_dims)
|
void vert_scrollarea_init(VertScrollArea_t* scroll_area, Rectangle display_area, Vector2 canvas_dims)
|
||||||
{
|
{
|
||||||
|
scroll_area->comp.font = GetFontDefault();
|
||||||
scroll_area->canvas = LoadRenderTexture(canvas_dims.x, canvas_dims.y);
|
scroll_area->canvas = LoadRenderTexture(canvas_dims.x, canvas_dims.y);
|
||||||
scroll_area->scroll_pos = canvas_dims.y - display_area.height;
|
scroll_area->scroll_pos = canvas_dims.y - display_area.height;
|
||||||
scroll_area->scroll_bounds = (Vector2){
|
scroll_area->scroll_bounds = (Vector2){
|
||||||
|
@ -661,14 +664,32 @@ void vert_scrollarea_set_item_dims(VertScrollArea_t* scroll_area, unsigned int i
|
||||||
{
|
{
|
||||||
scroll_area->item_height = item_height;
|
scroll_area->item_height = item_height;
|
||||||
scroll_area->item_padding = item_padding;
|
scroll_area->item_padding = item_padding;
|
||||||
scroll_area->n_items = (scroll_area->canvas.texture.height - scroll_area->item_padding) / (scroll_area->item_height + scroll_area->item_padding);
|
scroll_area->max_items = (scroll_area->canvas.texture.height - scroll_area->item_padding) / (scroll_area->item_height + scroll_area->item_padding);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool vert_scrollarea_n_items(VertScrollArea_t* scroll_area, unsigned int n_items) {
|
||||||
|
if (n_items >= scroll_area->max_items) return false;
|
||||||
|
|
||||||
|
// Due to OpenGL convention where y is -1 downwards,
|
||||||
|
// The scroll bar is set to decreases the scroll_pos when going down
|
||||||
|
// This value is used as the offset when rendering, which results in correctly
|
||||||
|
// give the illusion of 'scrolling down'
|
||||||
|
// So, adjust the minimum bound which is the height of the items that are not shown
|
||||||
|
scroll_area->n_items = n_items;
|
||||||
|
scroll_area->scroll_bounds.x =
|
||||||
|
(scroll_area->max_items - n_items)* (scroll_area->item_height + scroll_area->item_padding) + scroll_area->item_padding;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void vert_scrollarea_insert_item(VertScrollArea_t* scroll_area, char* str, unsigned int item_idx)
|
void vert_scrollarea_insert_item(VertScrollArea_t* scroll_area, char* str, unsigned int item_idx)
|
||||||
{
|
{
|
||||||
if (item_idx >= scroll_area->n_items) return;
|
if (item_idx >= scroll_area->max_items) return;
|
||||||
|
|
||||||
DrawText(str, 0, scroll_area->item_padding + (scroll_area->item_height + scroll_area->item_padding) * item_idx, scroll_area->item_height, BLACK);
|
DrawTextEx(
|
||||||
|
scroll_area->comp.font,
|
||||||
|
str,
|
||||||
|
(Vector2){0, scroll_area->item_padding + (scroll_area->item_height + scroll_area->item_padding) * item_idx}
|
||||||
|
, scroll_area->item_height, 0, BLACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int vert_scrollarea_set_pos(VertScrollArea_t* scroll_area, Vector2 pos)
|
unsigned int vert_scrollarea_set_pos(VertScrollArea_t* scroll_area, Vector2 pos)
|
||||||
|
@ -676,18 +697,22 @@ unsigned int vert_scrollarea_set_pos(VertScrollArea_t* scroll_area, Vector2 pos)
|
||||||
float x = pos.x - scroll_area->display_area.x;
|
float x = pos.x - scroll_area->display_area.x;
|
||||||
float y = pos.y - scroll_area->display_area.y;
|
float y = pos.y - scroll_area->display_area.y;
|
||||||
|
|
||||||
if (x >= scroll_area->display_area.width || x < 0) return scroll_area->n_items;
|
if (x >= scroll_area->display_area.width || x < 0) return scroll_area->max_items;
|
||||||
if (y >= scroll_area->display_area.height || y < 0) return scroll_area->n_items;
|
if (y >= scroll_area->display_area.height || y < 0) return scroll_area->max_items;
|
||||||
|
|
||||||
|
// How much have scroll down
|
||||||
|
float canvas_offset = (scroll_area->scroll_bounds.y - scroll_area->scroll_pos);
|
||||||
|
|
||||||
scroll_area->curr_selection = (y - scroll_area->item_padding + (scroll_area->scroll_bounds.y - scroll_area->scroll_pos)) / (scroll_area->item_height + scroll_area->item_padding);
|
scroll_area->curr_selection = (y + canvas_offset - scroll_area->item_padding) / (scroll_area->item_height + scroll_area->item_padding);
|
||||||
|
|
||||||
return scroll_area->curr_selection;
|
return scroll_area->curr_selection;
|
||||||
}
|
}
|
||||||
|
|
||||||
void vert_scrollarea_refocus(VertScrollArea_t* scroll_area)
|
void vert_scrollarea_refocus(VertScrollArea_t* scroll_area)
|
||||||
{
|
{
|
||||||
float selection_y = scroll_area->curr_selection * (scroll_area->item_height + scroll_area->item_padding) + scroll_area->item_padding - (scroll_area->scroll_bounds.y - scroll_area->scroll_pos);
|
float canvas_offset = (scroll_area->scroll_bounds.y - scroll_area->scroll_pos);
|
||||||
|
// Reverse from item selection to y in display area
|
||||||
|
float selection_y = scroll_area->curr_selection * (scroll_area->item_height + scroll_area->item_padding) + scroll_area->item_padding - canvas_offset;
|
||||||
|
|
||||||
// Auto adjust scroll based on selection
|
// Auto adjust scroll based on selection
|
||||||
if (selection_y < 0)
|
if (selection_y < 0)
|
||||||
|
@ -717,7 +742,9 @@ void vert_scrollarea_render(VertScrollArea_t* scroll_area)
|
||||||
scroll_area->display_area.width,
|
scroll_area->display_area.width,
|
||||||
scroll_area->display_area.height
|
scroll_area->display_area.height
|
||||||
};
|
};
|
||||||
float selection_y = scroll_area->curr_selection * (scroll_area->item_height + scroll_area->item_padding) + scroll_area->item_padding - (scroll_area->scroll_bounds.y - scroll_area->scroll_pos);
|
|
||||||
|
float canvas_offset = (scroll_area->scroll_bounds.y - scroll_area->scroll_pos);
|
||||||
|
float selection_y = scroll_area->curr_selection * (scroll_area->item_height + scroll_area->item_padding) + scroll_area->item_padding - canvas_offset;
|
||||||
|
|
||||||
DrawRectangle(
|
DrawRectangle(
|
||||||
scroll_area->display_area.x,
|
scroll_area->display_area.x,
|
||||||
|
|
|
@ -9,6 +9,7 @@ typedef struct UIComp {
|
||||||
GuiState state;
|
GuiState state;
|
||||||
float alpha;
|
float alpha;
|
||||||
bool pressed;
|
bool pressed;
|
||||||
|
Font font;
|
||||||
} UIComp_t;
|
} UIComp_t;
|
||||||
|
|
||||||
typedef struct VertScrollArea {
|
typedef struct VertScrollArea {
|
||||||
|
@ -18,12 +19,14 @@ typedef struct VertScrollArea {
|
||||||
RenderTexture2D canvas; // Complete canvas
|
RenderTexture2D canvas; // Complete canvas
|
||||||
|
|
||||||
unsigned int n_items;
|
unsigned int n_items;
|
||||||
|
unsigned int max_items;
|
||||||
unsigned int curr_selection;
|
unsigned int curr_selection;
|
||||||
unsigned int item_height;
|
unsigned int item_height;
|
||||||
unsigned int item_padding;
|
unsigned int item_padding;
|
||||||
|
|
||||||
float scroll_pos;
|
float scroll_pos;
|
||||||
Vector2 scroll_bounds;
|
Vector2 scroll_bounds;
|
||||||
|
|
||||||
UIComp_t scroll_bar;
|
UIComp_t scroll_bar;
|
||||||
|
|
||||||
} VertScrollArea_t;
|
} VertScrollArea_t;
|
||||||
|
@ -31,6 +34,7 @@ typedef struct VertScrollArea {
|
||||||
void init_UI(void);
|
void init_UI(void);
|
||||||
void vert_scrollarea_init(VertScrollArea_t* scroll_area, Rectangle display_area, Vector2 canvas_dims);
|
void vert_scrollarea_init(VertScrollArea_t* scroll_area, Rectangle display_area, Vector2 canvas_dims);
|
||||||
void vert_scrollarea_set_item_dims(VertScrollArea_t* scroll_area, unsigned int item_height, unsigned int item_padding);
|
void vert_scrollarea_set_item_dims(VertScrollArea_t* scroll_area, unsigned int item_height, unsigned int item_padding);
|
||||||
|
bool vert_scrollarea_n_items(VertScrollArea_t* scroll_area, unsigned int n_items);
|
||||||
void vert_scrollarea_insert_item(VertScrollArea_t* scroll_area, char* str, unsigned int item_idx);
|
void vert_scrollarea_insert_item(VertScrollArea_t* scroll_area, char* str, unsigned int item_idx);
|
||||||
unsigned int vert_scrollarea_set_pos(VertScrollArea_t* scroll_area, Vector2 pos);
|
unsigned int vert_scrollarea_set_pos(VertScrollArea_t* scroll_area, Vector2 pos);
|
||||||
void vert_scrollarea_refocus(VertScrollArea_t* scroll_area);
|
void vert_scrollarea_refocus(VertScrollArea_t* scroll_area);
|
||||||
|
|
|
@ -7,10 +7,10 @@
|
||||||
static void level_select_render_func(Scene_t* scene)
|
static void level_select_render_func(Scene_t* scene)
|
||||||
{
|
{
|
||||||
LevelSelectSceneData_t* data = &(CONTAINER_OF(scene, LevelSelectScene_t, scene)->data);
|
LevelSelectSceneData_t* data = &(CONTAINER_OF(scene, LevelSelectScene_t, scene)->data);
|
||||||
Sprite_t* spr = get_sprite(&scene->engine->assets, "bunny_spr1");
|
|
||||||
Sprite_t* level_board = get_sprite(&scene->engine->assets, "lvl_board");
|
Sprite_t* level_board = get_sprite(&scene->engine->assets, "lvl_board");
|
||||||
Sprite_t* level_select = get_sprite(&scene->engine->assets, "lvl_select");
|
Sprite_t* level_select = get_sprite(&scene->engine->assets, "lvl_select");
|
||||||
Sprite_t* preview = get_sprite(&scene->engine->assets, "lvlprvw");
|
Sprite_t* preview = get_sprite(&scene->engine->assets, "lvlprvw");
|
||||||
|
Font* menu_font = get_font(&scene->engine->assets, "MenuFont");
|
||||||
BeginTextureMode(scene->layers.render_layers[0].layer_tex);
|
BeginTextureMode(scene->layers.render_layers[0].layer_tex);
|
||||||
ClearBackground(BLANK);
|
ClearBackground(BLANK);
|
||||||
draw_sprite(level_select, 0, (Vector2){0,0},0, false);
|
draw_sprite(level_select, 0, (Vector2){0,0},0, false);
|
||||||
|
@ -20,13 +20,8 @@ static void level_select_render_func(Scene_t* scene)
|
||||||
level_select->frame_size.x + (level_board->frame_size.x - preview->frame_size.x) / 2,
|
level_select->frame_size.x + (level_board->frame_size.x - preview->frame_size.x) / 2,
|
||||||
(level_board->frame_size.y - preview->frame_size.y) / 2,
|
(level_board->frame_size.y - preview->frame_size.y) / 2,
|
||||||
},0, false);
|
},0, false);
|
||||||
DrawText("Level Select", 10, 10, 40, BLACK);
|
DrawTextEx(*menu_font, "Level Select", (Vector2){60, 20}, 40, 4, BLACK);
|
||||||
vert_scrollarea_render(&data->scroll_area);
|
vert_scrollarea_render(&data->scroll_area);
|
||||||
draw_sprite(
|
|
||||||
spr, 0, (Vector2){
|
|
||||||
scene->engine->intended_window_size.x / 2,
|
|
||||||
scene->engine->intended_window_size.y / 2,
|
|
||||||
}, 0, false);
|
|
||||||
EndTextureMode();
|
EndTextureMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,7 +43,7 @@ static void level_select_do_action(Scene_t* scene, ActionType_t action, bool pre
|
||||||
case ACTION_DOWN:
|
case ACTION_DOWN:
|
||||||
if (!pressed)
|
if (!pressed)
|
||||||
{
|
{
|
||||||
if (data->scroll_area.curr_selection < data->scroll_area.n_items - 1)
|
if (data->scroll_area.curr_selection < data->level_pack->n_levels - 1)
|
||||||
{
|
{
|
||||||
data->scroll_area.curr_selection++;
|
data->scroll_area.curr_selection++;
|
||||||
vert_scrollarea_refocus(&data->scroll_area);
|
vert_scrollarea_refocus(&data->scroll_area);
|
||||||
|
@ -69,7 +64,7 @@ static void level_select_do_action(Scene_t* scene, ActionType_t action, bool pre
|
||||||
{
|
{
|
||||||
unsigned int prev_sel = data->scroll_area.curr_selection;
|
unsigned int prev_sel = data->scroll_area.curr_selection;
|
||||||
// TODO: Add scene offset to scroll area calculation
|
// TODO: Add scene offset to scroll area calculation
|
||||||
if (vert_scrollarea_set_pos(&data->scroll_area, scene->mouse_pos) != data->scroll_area.n_items)
|
if (vert_scrollarea_set_pos(&data->scroll_area, scene->mouse_pos) != data->scroll_area.max_items)
|
||||||
{
|
{
|
||||||
vert_scrollarea_refocus(&data->scroll_area);
|
vert_scrollarea_refocus(&data->scroll_area);
|
||||||
|
|
||||||
|
@ -107,10 +102,9 @@ static void level_select_do_action(Scene_t* scene, ActionType_t action, bool pre
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FONT_SIZE 15
|
#define FONT_SIZE 22
|
||||||
#define TEXT_PADDING 3
|
#define TEXT_PADDING 3
|
||||||
#define DISPLAY_AREA_HEIGHT 400
|
#define SCROLL_TOTAL_HEIGHT 800
|
||||||
#define SCROLL_TOTAL_HEIGHT 400
|
|
||||||
void init_level_select_scene(LevelSelectScene_t* scene)
|
void init_level_select_scene(LevelSelectScene_t* scene)
|
||||||
{
|
{
|
||||||
init_scene(&scene->scene, &level_select_do_action, 0);
|
init_scene(&scene->scene, &level_select_do_action, 0);
|
||||||
|
@ -124,26 +118,31 @@ void init_level_select_scene(LevelSelectScene_t* scene)
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
scene->scene.bg_colour = BLACK;
|
scene->scene.bg_colour = BLACK;
|
||||||
vert_scrollarea_init(&scene->data.scroll_area, (Rectangle){50, 100, 150, DISPLAY_AREA_HEIGHT - 100}, (Vector2){150, SCROLL_TOTAL_HEIGHT});
|
Sprite_t* level_select = get_sprite(&scene->scene.engine->assets, "lvl_select");
|
||||||
|
vert_scrollarea_init(&scene->data.scroll_area, (Rectangle){50, 75, level_select->frame_size.x * 0.6, level_select->frame_size.y * 3 / 4}, (Vector2){level_select->frame_size.x * 0.6, SCROLL_TOTAL_HEIGHT});
|
||||||
vert_scrollarea_set_item_dims(&scene->data.scroll_area, FONT_SIZE, TEXT_PADDING);
|
vert_scrollarea_set_item_dims(&scene->data.scroll_area, FONT_SIZE, TEXT_PADDING);
|
||||||
|
Font* menu_font = get_font(&scene->scene.engine->assets, "MenuFont");
|
||||||
|
if (menu_font != NULL) {
|
||||||
|
scene->data.scroll_area.comp.font = *menu_font;
|
||||||
|
}
|
||||||
char buf[32];
|
char buf[32];
|
||||||
ScrollAreaRenderBegin(&scene->data.scroll_area);
|
ScrollAreaRenderBegin(&scene->data.scroll_area);
|
||||||
ClearBackground(BLANK);
|
ClearBackground(BLANK);
|
||||||
if (scene->data.level_pack != NULL)
|
if (scene->data.level_pack != NULL)
|
||||||
{
|
{
|
||||||
scene->data.scroll_area.n_items = scene->data.level_pack->n_levels;
|
vert_scrollarea_n_items(&scene->data.scroll_area, scene->data.level_pack->n_levels);
|
||||||
for (unsigned int i = 0; i < scene->data.level_pack->n_levels; ++i)
|
for (unsigned int i = 0; i < scene->data.level_pack->n_levels; ++i)
|
||||||
{
|
{
|
||||||
vert_scrollarea_insert_item(&scene->data.scroll_area, scene->data.level_pack->levels[i].level_name, i);
|
vert_scrollarea_insert_item(&scene->data.scroll_area, scene->data.level_pack->levels[i].level_name, i);
|
||||||
}
|
}
|
||||||
for (unsigned int i = scene->data.level_pack->n_levels; i < scene->data.scroll_area.n_items; ++i)
|
for (unsigned int i = scene->data.level_pack->n_levels; i < scene->data.scroll_area.max_items; ++i)
|
||||||
{
|
{
|
||||||
vert_scrollarea_insert_item(&scene->data.scroll_area, "---", i);
|
vert_scrollarea_insert_item(&scene->data.scroll_area, "---", i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (unsigned int i = 0; i < scene->data.scroll_area.n_items; ++i)
|
for (unsigned int i = 0; i < scene->data.scroll_area.max_items; ++i)
|
||||||
{
|
{
|
||||||
sprintf(buf, "Level %u", i);
|
sprintf(buf, "Level %u", i);
|
||||||
vert_scrollarea_insert_item(&scene->data.scroll_area, buf, i);
|
vert_scrollarea_insert_item(&scene->data.scroll_area, buf, i);
|
||||||
|
|
Loading…
Reference in New Issue