新增 GUI 库

This commit is contained in:
lxbpxylps@126.com 2021-08-10 15:00:09 +08:00
parent 75318d2f7d
commit 52a7f85f93
2 changed files with 211 additions and 0 deletions

174
User/GameEngine/GE_GUI.c Normal file
View File

@ -0,0 +1,174 @@
//游戏引擎 GUI 库
#include "sys.h"
#include "key.h"
#include "lcd.h"
#include "GameEngine.h"
#include "GE_GUI.h"
/**
* @brief GE_GUI
*/
void GE_GUI_Init(void)
{
}
/**
* @brief
* @param x
* @param y
* @param width:
* @param height:
* @param color:
* @param thickness: 线
*/
void GE_GUI_ThickRectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color, uint16_t thickness)
{
for (uint16_t i = 0; i < thickness; i++)
GE_Draw_Rectangle(x + i, y + i, width - 2 * i, height - 2 * i, color);
}
/**
* @brief
* @param x
* @param y
* @param width:
* @param height:
* @param font_color:
* @param fill_color:
* @param rectangle_color:
* @param thickness: 线
* @param str:
*/
void GE_GUI_TextBox(
uint16_t x,
uint16_t y,
uint16_t width,
uint16_t height,
uint16_t font_color,
uint16_t fill_color,
uint16_t rectangle_color,
uint16_t thickness,
uint8_t *str)
{
GE_GUI_ThickRectangle(x, y, width, height, rectangle_color, thickness);
GE_Draw_Fill(x + thickness, y + thickness, width - 2 * thickness, height - 2 * thickness, fill_color);
GE_Font_Print(x + thickness + 1, y + thickness + 1, width - 2 * (thickness + 1), height - 2 * (thickness + 1), FONT_16, font_color, WHITE, TRUE, str);
}
/**
* @brief
* @param x:
* @param y:
* @param width:
* @param height:
* @param color:
* @param thickness: 线
*/
void GE_GUI_DoubleThickRectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color, uint16_t thickness)
{
GE_GUI_ThickRectangle(x, y, width, height, color, thickness);
GE_GUI_ThickRectangle(x + thickness + 1, y + thickness + 1, width - (thickness + 1) * 2, height - (thickness + 1) * 2, color, thickness);
}
/**
* @brief
* @param x
* @param y
* @param width:
* @param height:
* @param head:
* @param content:
* @param handler_func: 退退 NULL 退
*/
void GE_GUI_MsgBox(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t *head, uint8_t *content, MsgBoxHandler handler_func)
{
//边框
GE_GUI_DoubleThickRectangle(x, y, width, height, BLACK, 2);
//标题分隔线
GE_Draw_Rectangle(x + 5, y + FONT_16 + 7, width - 10, 2, BLACK);
//标题
GE_Font_Print(x + 6, y + 6, BORDER_MAX, FONT_16, FONT_16, BLACK, WHITE, FALSE, head);
//内容
GE_Font_Print(x + 6, y + FONT_16 + 10, width - 12, BORDER_MAX, FONT_16, BLACK, WHITE, FALSE, content);
//调用回调函数
if (handler_func != NULL)
handler_func();
}
/**
* @brief
* @param x
* @param y
* @param width:
* @param height:
* @param head:
* @param content_amount:
* @param content:
* @param handler_func: NULL
* @retval 1
*/
uint8_t GE_GUI_MenuBox(
uint16_t x,
uint16_t y,
uint16_t width,
uint16_t height,
uint8_t *head,
uint8_t content_amount,
uint8_t content[][GE_GUI_MENUBOX_CONTENT_LEN],
MenuBoxHandler handler_func)
{
uint8_t choice_num = 1;
//边框
GE_GUI_DoubleThickRectangle(x, y, width, height, BLACK, 2);
//标题分隔线
GE_Draw_Rectangle(x + 5, y + FONT_16 + 7, width - 10, 2, BLACK);
//标题
GE_Font_Print(x + 6, y + 6, BORDER_MAX, FONT_16, FONT_16, BLACK, WHITE, FALSE, head);
//绘制选项
for (uint8_t i = 0; i < content_amount; i++)
{
if (i + 1 == choice_num)
GE_GUI_TextBox(x + 4, y + FONT_16 + 8 + i * (FONT_16 + 3), width - 8, FONT_16 + 4, WHITE, BLUE, BLACK, 1, content[i]);
else
GE_GUI_TextBox(x + 4, y + FONT_16 + 8 + i * (FONT_16 + 3), width - 8, FONT_16 + 4, BLACK, WHITE, BLACK, 1, content[i]);
}
while (1)
{
uint8_t key = KEY_GetKeyWait();
if (key == KEY2)
{
break;
}
else if (key == KEY3 && choice_num > 1)
{
GE_GUI_TextBox(x + 4, y + FONT_16 + 8 + (choice_num - 1) * (FONT_16 + 3), width - 8, FONT_16 + 4, BLACK, WHITE, BLACK, 1, content[choice_num - 1]);
choice_num--;
GE_GUI_TextBox(x + 4, y + FONT_16 + 8 + (choice_num - 1) * (FONT_16 + 3), width - 8, FONT_16 + 4, WHITE, BLUE, BLACK, 1, content[choice_num - 1]);
}
else if (key == KEY1 && choice_num < content_amount)
{
GE_GUI_TextBox(x + 4, y + FONT_16 + 8 + (choice_num - 1) * (FONT_16 + 3), width - 8, FONT_16 + 4, BLACK, WHITE, BLACK, 1, content[choice_num - 1]);
choice_num++;
GE_GUI_TextBox(x + 4, y + FONT_16 + 8 + (choice_num - 1) * (FONT_16 + 3), width - 8, FONT_16 + 4, WHITE, BLUE, BLACK, 1, content[choice_num - 1]);
}
}
//调用回调函数
if (handler_func != NULL)
handler_func(choice_num);
return choice_num;
}

37
User/GameEngine/GE_GUI.h Normal file
View File

@ -0,0 +1,37 @@
//游戏引擎 GUI 库
#ifndef __GE_GUI_H
#define __GE_GUI_H
//回调函数定义
typedef void (*MsgBoxHandler)(void);
typedef void (*MenuBoxHandler)(uint8_t choice_num);
void GE_GUI_Init(void);
void GE_GUI_TextBox(
uint16_t x,
uint16_t y,
uint16_t width,
uint16_t height,
uint16_t font_color,
uint16_t fill_color,
uint16_t rectangle_color,
uint16_t thickness,
uint8_t *str);
void GE_GUI_MsgBox(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t *head, uint8_t *content, MsgBoxHandler func);
#define GE_GUI_MENUBOX_MAX_CONTENT_NUM 10 //适用参数 5, 5, 310, 230
#define GE_GUI_MENUBOX_CONTENT_LEN 37 //适用参数 5, 5, 310, 230
uint8_t GE_GUI_MenuBox(
uint16_t x,
uint16_t y,
uint16_t width,
uint16_t height,
uint8_t *head,
uint8_t content_amount,
uint8_t content[][GE_GUI_MENUBOX_CONTENT_LEN],
MenuBoxHandler handler_func);
#endif