Difference between revisions of "Ru Using New Menu System"

From AlliedModders Wiki
Jump to: navigation, search
(Создение меню)
(redirect)
 
(9 intermediate revisions by 3 users not shown)
Line 1: Line 1:
[[Category:Ru:Scripting (AMX Mod X)]]
+
#REDIRECT [[Ru:Using_New_Menu_System]]
 
 
= Введение =
 
Это статья поможет вам разобраться в новой системе меню.
 
 
 
== Урок по созданию меню ==
 
Давайте попробуем воспользоваться новой системмой меню. Мы пройдем через этоу простую инструкцию и создадим простое голосование смены карты.
 
 
 
=== Заголовочные файлы ===
 
Как обычно мы начинаем с добавления необходимых заголовочных файлов
 
<pawn>
 
#include <amxmodx>
 
</pawn>
 
 
 
=== Глобальные переменные ===
 
<pawn>
 
new g_Menu; // Переменная обработки главного меню
 
new g_Votes[3]; // Сохраняем голосования Да как 1, No как 2
 
</pawn>
 
 
 
Тут мы создали 2 глобальные переменные. Одна содержит указатель вашего меню, другая хранит резуьтаты голосования. Голоса 'Да' будут сохранены в g_Votes[1] ,а 'Нет' будет сохранена в g_Votes[2].
 
 
 
=== Регистрируем Плагин и Меню ===
 
<pawn>
 
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();
 
}
 
</pawn>
 
 
 
Lets break this down.
 
 
 
*Регистрирует ваш плагин
 
<pawn>register_plugin("Vote Menu","1.0","Freecode");</pawn>
 
 
 
*g_Menu - Указатель на ваше меню. Это будет установлено после вызова menu_create.
 
<pawn>g_Menu = menu_create("Change Level?","menu_handle");
 
 
 
//menu_create ( title[], handler[], ml=0 )
 
//title[] - Заголовок меню
 
//handler[] - Эта функция будет вызвана когда будет нажата клавиша в вашем меню.
 
</pawn>
 
 
 
* Мы добавили эту команду. Она начинает ваше голосование.
 
<pawn>register_clcmd("amx_startvote","startvote",ADMIN_CFG,"Gaben");
 
</pawn>
 
 
 
* Это вызов функции. build_menu() функция создает ваше меню.
 
<pawn>build_menu();</pawn>
 
 
 
=== Создение меню ===
 
Конструирование заключается в добавлении пунктов в ваше меню. Прежде чем начали добавлять пункты, мы должны взглянуть на
 
menu_additem .
 
<pawn>menu_additem ( menu, const name[], const command[], paccess=0, callback=-1 )</pawn>
 
* menu - указатель на меню. Это указывает menu_additem меню к которому нужно добавить пункты.
 
* const name[] - имя пункта меню. Это то что будет показано в меню.
 
* const command[] - информация пункта меню.
 
 
 
Теперь давайте приступим к созданию нашего меню. Как уже говорилось, это простое голосование смены карты. Так что нам надо всего 2 пункта меню. А именно "Да" и "Нет".
 
<pawn>build_menu()
 
{
 
menu_additem(g_Menu, "Yes", "1");
 
menu_additem(g_Menu, "No", "2");
 
 
menu_setprop(g_Menu, MPROP_PERPAGE, 0);
 
}</pawn>
 
*<tt>Примечание</tt>
 
** Как вы можете видеть вместо command[] я указал числа. Это необходимо для более простой идентификации пунктов меню.
 
** Я так-же добавил menu_setprop. Это говорит нашему меню что оно не имеет страниц. Для дополнительной информации смотрите в amxconst.inc
 
 
 
=== Показывает меню голосования ===
 
Для того что-бы показать меню мы должны использовать menu_display.
 
<pawn>menu_display ( id, menu, page )</pawn>
 
* id - id пользователя которому надо показать это меню.
 
* menu - тут указываем хэндл меню которое показываем пользователю.
 
* page - какая страница (номер страницы меню) с которой начинаем. Страницы меню начинаются с 0.
 
 
 
Ok теперь посмотрим на наш код.
 
<pawn>public startvote(id)
 
{
 
for(new i = 0; i < 33; i++)
 
{
 
if( is_user_alive(i) )
 
{
 
menu_display(i, g_Menu, 0);
 
}
 
}
 
 
return PLUGIN_HANDLED;
 
}</pawn>
 
*<tt>Примечание:</tt>
 
** Используем цыкл для прохождения по всем игрокам и показываем меню тем кто живой.
 
 
 
=== Обработка выборов меню ===
 
Последний этап заключается в обработке выбора меню. Это делается через функцию обработки.
 
Она вызывается каждый раз когда пользователь сделал выбор.
 
Вот  <b>3</b> переменные которые передаются в функцию.
 
* id - id пользователя
 
* menu - открытое меню у пользователя
 
* item - тут выбор пункта меню пользователем
 
 
 
Далее мы объявляем несколько специальных переменных таких как меню выхода.
 
<pawn>#define MENU_EXIT -3
 
#define MENU_BACK -2
 
#define MENU_MORE -1</pawn>
 
 
 
Теперь нам надо проверить если пункт меню выбран и он не является специальной переменной
 
<pawn>if( item < 0 ) return PLUGIN_CONTINUE;</pawn>
 
 
 
Слкдующим шагом мы получаем информацию о выбранном пункте меню. Все что мы ищем это номер пункта меню. (Да = 1, Нет = 2).
 
Для этого надо использовать menu_item_getinfo.
 
<pawn>menu_item_getinfo ( menu, item, &access, command[], cmdlen, name[]="", namelen=0, &callback )</pawn>
 
* menu - меню в котором находится пункт меню.
 
* item - the item itself
 
* &access - (edit)
 
* command[] - (edit)(это то где сохраняются идентификационные номера меню)
 
* cmdlen - размер command[]
 
* name[] - имя пункта меню
 
* namelen - размер name[]
 
* &callback - (edit)
 
 
 
После того как мы получили информацию о пуектах меню, надо взять из command[] номера выбранных меню(это должно быть 1 или 2).
 
Теперь надо добавить в g_Votes теми голосами что были сделаны.
 
Вот как завершонная функция должна выглядеть:
 
<pawn>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;
 
}
 
</pawn>
 
 
 
=== Зевершение ===
 
Это конец. Вы завершили Урок по созданию меню. Используя новую систему меню можно создать более удобное управление.
 
В следующем уроке вы увидите более сложную систему меню которая будет использовать callbacks, уничтожение меню и создание.
 
Вот код который должен получится посли всех действий.
 
<pawn>#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;
 
}</pawn>
 

Latest revision as of 04:31, 6 November 2008