Ru:Using New Menu System

From AlliedModders Wiki
(Redirected from Ru Using New Menu System)
Jump to: navigation, search


Введение

Это статья поможет вам разобраться в новой системе меню.

Урок по созданию меню

Давайте попробуем воспользоваться новой системмой меню. Мы пройдем через этоу простую инструкцию и создадим простое голосование смены карты.

Заголовочные файлы

Как обычно мы начинаем с добавления необходимых заголовочных файлов

#include <amxmodx>

Глобальные переменные

new g_Menu;	// Переменная обработки главного меню
new g_Votes[3];	// Сохраняем голосования Да как 1, No как 2

Здесь мы создали 2 глобальные переменные. Одна будет содержать указатель на ваше меню, другая будет хранить результаты голосования. Голоса 'За' будут сохранены в g_Votes[1], а 'Против' - в g_Votes[2]. g_Votes[0] - не используется(?).

Регистрируем Плагин и Меню

public plugin_init()
{
	// Регистрируем ваш плагин
	register_plugin("Vote Menu","1.0","Freecode");
 
	// Регистрируем меню смены карты
	g_Menu = menu_create("Change Level?","menu_handle");
 
	register_clcmd("amx_startvote","startvote",ADMIN_CFG,"Gaben");
 
	// Теперь нам надо создать наше меню
	build_menu();
}

Lets break this down.

  • Регистрирует ваш плагин
register_plugin("Vote Menu","1.0","Freecode");
  • g_Menu - Указатель на ваше меню. Это будет установлено после вызова menu_create.
g_Menu = menu_create("Change Level?","menu_handle");
 
//menu_create ( title[], handler[], ml=0 )
//title[] - Заголовок меню
//handler[] - Эта функция будет вызвана когда будет нажата клавиша в вашем меню.
  • Мы добавили эту команду. Она начинает ваше голосование.
register_clcmd("amx_startvote","startvote",ADMIN_CFG,"Gaben");
  • Это вызов функции. build_menu() функция создает ваше меню.
build_menu();

Создение меню

Конструирование заключается в добавлении пунктов в ваше меню. Прежде чем начали добавлять пункты, мы должны взглянуть на menu_additem .

menu_additem ( menu, const name[], const command[], paccess=0, callback=-1 )
  • menu - указатель на меню. Это указывает menu_additem меню к которому нужно добавить пункты.
  • const name[] - имя пункта меню. Это то что будет показано в меню.
  • const command[] - информация пункта меню.

Теперь давайте приступим к созданию нашего меню. Как уже говорилось, это простое голосование смены карты. Так что нам надо всего 2 пункта меню. А именно "Да" и "Нет".

build_menu()
{
	menu_additem(g_Menu, "Yes", "1");
	menu_additem(g_Menu, "No", "2");
 
	menu_setprop(g_Menu, MPROP_PERPAGE, 0);
}
  • Примечание
    • Как вы можете видеть вместо command[] я указал числа. Это необходимо для более простой идентификации пунктов меню.
    • Я так-же добавил menu_setprop. Это говорит нашему меню что оно не имеет страниц. Для дополнительной информации смотрите в amxconst.inc

Показывает меню голосования

Для того что-бы показать меню мы должны использовать menu_display.

menu_display ( id, menu, page )
  • id - id пользователя которому надо показать это меню.
  • menu - тут указываем хэндл меню которое показываем пользователю.
  • page - какая страница (номер страницы меню) с которой начинаем. Страницы меню начинаются с 0.

Ok теперь посмотрим на наш код.

public startvote(id)
{
	for(new i = 0; i < 33; i++)
	{
		if( is_user_alive(i) )
		{
			menu_display(i, g_Menu, 0);
		}
	}
 
	return PLUGIN_HANDLED;
}
  • Примечание:
    • Используем цыкл для прохождения по всем игрокам и показываем меню тем кто живой.

Обработка выборов меню

Последний этап заключается в обработке выбора меню. Это делается через функцию обработки. Она вызывается каждый раз когда пользователь сделал выбор. Вот 3 переменные которые передаются в функцию.

  • id - id пользователя
  • menu - открытое меню у пользователя
  • item - тут выбор пункта меню пользователем

Далее мы объявляем несколько специальных переменных таких как меню выхода.

#define MENU_EXIT	-3
#define	MENU_BACK	-2
#define MENU_MORE	-1

Теперь нам надо проверить если пункт меню выбран и он не является специальной переменной

if( item < 0 ) return PLUGIN_CONTINUE;

Следующим шагом мы получаем информацию о выбранном пункте меню. Все что мы ищем это номер пункта меню. (Да = 1, Нет = 2). Для этого надо использовать menu_item_getinfo.

menu_item_getinfo ( menu, item, &access, command[], cmdlen, name[]="", namelen=0, &callback )
  • menu - меню в котором находится пункт меню.
  • item - the item itself
  • &access - (edit)
  • command[] - (edit)(это то где сохраняются идентификационные номера меню)
  • cmdlen - размер command[]
  • name[] - имя пункта меню
  • namelen - размер name[]
  • &callback - (edit)

После того как мы получили информацию о пуектах меню, надо взять из command[] номера выбранных меню(это должно быть 1 или 2). Теперь надо добавить в g_Votes теми голосами что были сделаны. Вот как завершонная функция должна выглядеть:

public menu_handle(id, menu, item)
{
	if( item < 0 ) return PLUGIN_CONTINUE;
 
	// Get item info
	new cmd[3];
	new access, callback;
 
	menu_item_getinfo(menu, item, access, cmd,2,_,_, callback);
 
	new iChoice = str_to_num(cmd);
 
	g_Votes[iChoice]++;
 
	return PLUGIN_HANDLED;
}

Завершение

Ну вот и все. Вы завершили Урок по созданию меню. Используя новую систему меню, можно создать более удобное управление. В следующем уроке вы увидите более сложную систему меню, которая будет использовать callbacks, уничтожение меню и его создание. Вот итоговый код, который должен получиться у вас после выполнения всех действий урока.

#include <amxmodx>
 
new g_Menu;	// Переменная обработки главного меню
new g_Votes[3];	// Сохраняем голосования Да как 1, No как 2
 
 
public plugin_init()
{
	// Регистрируем ваш плагин
	register_plugin("Vote Menu","1.0","Freecode");
 
	// Регистрируем меню смены карты
	g_Menu = menu_create("Change Level?","menu_handle");
 
	register_clcmd("amx_startvote","startvote",ADMIN_CFG,"Gaben");
 
	// Теперь нам надо создать наше меню
	build_menu();
}
 
build_menu()
{
	menu_additem(g_Menu, "Yes", "1");
	menu_additem(g_Menu, "No", "2");
 
	menu_setprop(g_Menu, MPROP_PERPAGE, 0);
}
 
public startvote(id)
{
	for(new i = 0; i < 33; i++)
	{
		if( is_user_alive(i) )
		{
			menu_display(i, g_Menu, 0);
		}
	}
 
	return PLUGIN_HANDLED;
}
 
public menu_handle(id, menu, item)
{
	if( item < 0 ) return PLUGIN_CONTINUE;
 
	// Получаем информацию о пункте
	new cmd[3];
	new access, callback;
 
	menu_item_getinfo(menu, item, access, cmd,2,_,_, callback);
 
	new iChoice = str_to_num(cmd);
 
	g_Votes[iChoice]++;
 
	return PLUGIN_HANDLED;
}