Difference between revisions of "Ru Using New Menu System"

From AlliedModders Wiki
Jump to: navigation, search
(Обработка выборов меню)
(Завершение)
Line 150: Line 150:
 
</pawn>
 
</pawn>
  
=== Зевершение ===
+
=== Завершение ===
 
Это конец. Вы завершили Урок по созданию меню. Используя новую систему меню можно создать более удобное управление.
 
Это конец. Вы завершили Урок по созданию меню. Используя новую систему меню можно создать более удобное управление.
 
В следующем уроке вы увидите более сложную систему меню которая будет использовать callbacks, уничтожение меню и создание.
 
В следующем уроке вы увидите более сложную систему меню которая будет использовать callbacks, уничтожение меню и создание.

Revision as of 22:03, 11 December 2006


Введение

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

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

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

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

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

#include <amxmodx>

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

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

Тут мы создали 2 глобальные переменные. Одна содержит указатель вашего меню, другая хранит резуьтаты голосования. Голоса 'Да' будут сохранены в g_Votes[1] ,а 'Нет' будет сохранена в g_Votes[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();
}

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;
}