Difference between revisions of "Modules/game menu"

From MSX Game Library

< Modules

(Usage)
(Usage)
Line 59: Line 59:
 
A page is generally composed of a list of entries, and a menu is composed of a list of pages.
 
A page is generally composed of a list of entries, and a menu is composed of a list of pages.
  
La fonction d'initialisation des
+
The menu system initialization function (<tt>Menu_Initialize</tt>) takes as its parameter an array of pages representing a whole menu.
 +
 
 +
=== Exemple ===
 +
Here's an example of a table with 2 pages (Main and Option) each containing 5 entries.
 +
// Entries description for the Main menu
 +
const MenuItem g_MenuMain[] =
 +
{
 +
{ "Start",              MENU_ITEM_ACTION, MenuAction_Start, 1 }, // Entry to start a game (will trigger MenuAction_Start with 'value' parameter equal to '1')
 +
{ "Options",            MENU_ITEM_GOTO, NULL, MENU_OPTION },    // Entry to go to Option menu page
 +
{ "Align",              MENU_ITEM_GOTO, NULL, MENU_ALIGN },      // Entry to go to Align menu page
 +
{ NULL,                  MENU_ITEM_EMPTY, NULL, 0 },              // Blank entry to create a gap
 +
{ "Exit",                MENU_ITEM_ACTION, MenuAction_Start, 0 }, // Entry to exit the game (will trigger MenuAction_Start with 'value' parameter equal to '0')
 +
};
 +
 +
// Entries description for the Option menu
 +
MenuItem g_MenuOption[] =
 +
{
 +
{ "Mode",                MENU_ITEM_ACTION, MenuAction_Screen, 0 }, // Entry to change the screen mode (will trigger MenuAction_Screen)
 +
{ "Integer",            MENU_ITEM_INT, &g_Integer, 0 },          // Entry to edit an integer
 +
{ "Boolean",            MENU_ITEM_BOOL, &g_Boolean, 0 },          // Entry to edit a boolean
 +
{ NULL,                  MENU_ITEM_EMPTY, NULL, 0 },              // Blank entry to create a gap
 +
{ "Back",                MENU_ITEM_GOTO, NULL, MENU_MAIN },        // Entry to go back to the main menu
 +
};
 +
 +
// List of all menus
 +
const Menu g_Menus[MENU_MAX] =
 +
{
 +
{ "Main",    g_MenuMain,  numberof(g_MenuMain),  NULL }, // MENU_MAIN
 +
{ "Options", g_MenuOption, numberof(g_MenuOption), NULL }, // MENU_OPTION
 +
};
 +
 +
Then, you can itnialize the menu using: <tt>Menu_Initialize(&g_Menus);</tt>
  
 
== Annexe ==
 
== Annexe ==

Revision as of 23:54, 31 October 2023

The game_menu module automatically manages menus based on tables representing each page and its interactions.

Dependencies

Settings

Modules can be customized into the project's msxgl_config.h file to fullfill your needs:

#define MENU_USE_DEFAULT_CALLBACK	TRUE		// Use default input/print callback
#define MENU_SCREEN_WIDTH		MENU_VARIABLE	// Screen width
#define MENU_FRAME_X			0		// Frame position X
#define MENU_FRAME_Y			6		// Frame position Y
#define MENU_FRAME_WIDTH		32		// Frame width
#define MENU_FRAME_HEIGHT		8		// Frame height
#define MENU_CHAR_CLEAR			'\0'		// Clear character
#define MENU_CHAR_CURSOR		'@'		// Cursor character 
#define MENU_CHAR_TRUE			'O'		// True character
#define MENU_CHAR_FALSE			'X'		// False character
#define MENU_CHAR_LEFT			'<'		// Left edit character
#define MENU_CHAR_RIGHT			'>'		// Right edit character
#define MENU_TITLE_X			4		// Title position X
#define MENU_TITLE_Y			6		// Title position Y
#define MENU_ITEM_X			6		// Item label X position
#define MENU_ITEM_Y			8		// Item label X position
#define MENU_ITEM_X_GOTO		6		// Goto type item label X position
#define MENU_ITEM_ALIGN			MENU_ITEM_ALIGN_LEFT // Item label alignment
#define MENU_ITEM_ALIGN_GOTO		ENU_ITEM_ALIGN_LEFT // Goto type item label alignment
#define MENU_VALUE_X			14		// Item value X position
// Type of cursor
// - MENU_CURSOR_MODE_NONE		No cursor
// - MENU_CURSOR_MODE_CHAR		Character cursor
// - MENU_CURSOR_MODE_SPRT		Sprite cursor (WIP)
#define MENU_CURSOR_MODE		MENU_CURSOR_MODE_CHAR
#define MENU_CURSOR_OFFSET		(-2)		// Cursor X position offset

Usage

The module is data-driven, meaning that its behavior is completely determined by the data passed to it. The system is based on two structures.

Structure that represents an entry on a menu page:

// Menu item structure
typedef struct
{
	const c8* Text;		// Name of the item
	u8        Type;		// Type of the item (see <MENU_ITEM_TYPE>)
	void*     Action;	// Action associated to the item (depends on item type)
	i16       Value;	// Value associated to the item (depends on item type)
} MenuItem;

Structure that represents a complete page:

// Menu structure
typedef struct
{
	const c8* Title;		// Title of the page (NULL means no title)
	MenuItem* Items;		// List of the page's menu entries
	u8        ItemNum;		// Number of the page's menu entries
	callback  Callback;		// Function to be called when page is opened
} Menu;

A page is generally composed of a list of entries, and a menu is composed of a list of pages.

The menu system initialization function (Menu_Initialize) takes as its parameter an array of pages representing a whole menu.

Exemple

Here's an example of a table with 2 pages (Main and Option) each containing 5 entries.

// Entries description for the Main menu
const MenuItem g_MenuMain[] =
{
	{ "Start",               MENU_ITEM_ACTION, MenuAction_Start, 1 }, // Entry to start a game (will trigger MenuAction_Start with 'value' parameter equal to '1')
	{ "Options",             MENU_ITEM_GOTO, NULL, MENU_OPTION },     // Entry to go to Option menu page
	{ "Align",               MENU_ITEM_GOTO, NULL, MENU_ALIGN },      // Entry to go to Align menu page
	{ NULL,                  MENU_ITEM_EMPTY, NULL, 0 },              // Blank entry to create a gap
	{ "Exit",                MENU_ITEM_ACTION, MenuAction_Start, 0 }, // Entry to exit the game (will trigger MenuAction_Start with 'value' parameter equal to '0')
};

// Entries description for the Option menu
MenuItem g_MenuOption[] =
{
	{ "Mode",                MENU_ITEM_ACTION, MenuAction_Screen, 0 }, // Entry to change the screen mode (will trigger MenuAction_Screen)
	{ "Integer",             MENU_ITEM_INT, &g_Integer, 0 },           // Entry to edit an integer
	{ "Boolean",             MENU_ITEM_BOOL, &g_Boolean, 0 },          // Entry to edit a boolean
	{ NULL,                  MENU_ITEM_EMPTY, NULL, 0 },               // Blank entry to create a gap
	{ "Back",                MENU_ITEM_GOTO, NULL, MENU_MAIN },        // Entry to go back to the main menu
};

// List of all menus
const Menu g_Menus[MENU_MAX] =
{
	{ "Main",    g_MenuMain,   numberof(g_MenuMain),   NULL }, // MENU_MAIN
	{ "Options", g_MenuOption, numberof(g_MenuOption), NULL }, // MENU_OPTION
};

Then, you can itnialize the menu using: Menu_Initialize(&g_Menus);

Annexe

  • See also: Sample program s_menu

Documentation