Кому то просто нужно ближе подобраться к понятию инициализация
Кому то просто нужно ближе подобраться к понятию инициализация
[Anticheat]___Invisible Fly Hack
[Anticheat]____Weapon/Ammo Hack
[Function]______ResetPlayerWeaponSlot
[Function]_______FIX_SetPlayerAmmo
[ServerMod]______TDM | Zombie Apokalypse
Данный приём стоит использовать только тогда, когда массив имеет большое кол-во ячеек.
Ибо инициализация таких объемных наборов данных занимает достаточно продолжительное время, особенно в тех массивах, кои занимают по 1500-2000 байт и выше.
Применять оператор goto, или отправлять инструкцию jump, в местах, например, где необходимо проинициализировать массив, заточенный под форматирование - бессмысленно.
Так и не решился создавать отдельную тему, так что отпишу сюда.
Очень часто в чужих скриптах вижу, как один и тот же диалог повторяется в нескольких местах. Это мало того, что потребляет лишнюю память, так ещё и доставляет трудности в случае, если вдруг захочется изменить текст этого диалога (да, можно пользоваться автозаменой, но я хочу предложить альтернативу, которая и уменьшит потребление памяти, и не заставит мучиться с автозаменой).
А если это целая система, построенная на диалогах - всё становится ещё страшнее, ибо переплетение в виде кучи вызовов разных диалогов напрочь убивает читаемость.
В общем-то, думаю, ни для кого не секрет, что повторяющийся код лучше убирать в отдельную функцию и вызывать уже функцию, а не каждый раз прописывать код. И как раз именно это я предлагаю использовать. Только если в случае с одним конкретным диалогом всё, вроде как, понятно, то когда у вас целая система, построенная на диалогах, создавать для каждого диалога свою функцию тоже не очень удобно, ибо придётся помнить кучу ненужных названий. Собственно, я хочу предложить решение (точнее, просто натолкнуть на эту идею тех, кто сам до неё не дошёл) для подобных ситуаций. Заключается оно в том, что для одной конкретной системы будет использоваться одна функция, через которую уже будут показываться все диалоги этой системы. В общем-то реализация проста:
И уже просто в том месте, где нужно (повторно) показать диалог, прописываем:PHP код:
stock ShowRegistrationDialog(playerid, dialogid)
{
switch(dialogid)
{
case id_диалога_1:
{
ShowPlayerDialog(playerid, dialogid, прочая_информация);
}
case id_диалога_2:
{
//Тут любой код, что требуется выполнять при каждом показе диалога
ShowPlayerDialog(playerid, dialogid, прочая_информация);
}
case id_диалога_3:
{
ShowPlayerDialog(playerid, /*тут можно именно dialogid и указывать, ибо там в любом случае будет хранится нужный ID диалога, если условие в switch сработает*/, прочая_информация);
}
}
return 1;
}
Всё это и код в более опрятный вид приводит, ибо нет строк, что за границы экрана уходят, и позволяют без проблем вызывать диалоги там, где это требуется, без каких-либо копирований целого диалога.PHP код:
ShowRegistrationDialog(playerid, id_диалога_1);
Только стоит обязательно учитывать, что не стоит в одну такую функцию пихать кучу диалогов, ибо это будет, опять же, неудобно. Лучше, как я писал выше, для каждой системы выделять одну функцию.
И если использовать перечисление для хранения ID диалогов, то код становится ещё опрятнее:
Собственно, всё. Вроде, вполне логичное оформление кода, но, судя по коду в паблике, практически никто не доходит до использования подобного.PHP код:
enum
{
dRegisterMain,
dRegisterInputName,
dRegisterInputPass
}
stock ShowRegistrationDialog(playerid, dialogid)
{
switch(dialogid)
{
case dRegisterMain:
{
ShowPlayerDialog(playerid, dialogid, прочая_информация);
}
case dRegisterInputName:
{
//Тут любой код, что требуется выполнять при каждом показе диалога
ShowPlayerDialog(playerid, dialogid, прочая_информация);
}
case dRegisterInputPass:
{
ShowPlayerDialog(playerid, /*тут можно именно dialogid и указывать, ибо там в любом случае будет хранится нужный ID диалога, если условие в switch сработает*/, прочая_информация);
}
}
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case dRegisterMain:
{
if(!response)
return 1;
else
return ShowRegistrationDialog(playerid, dRegisterInputName);
}
case dRegisterInputName:
{
if(!response)
return ShowRegistrationDialog(playerid, dRegisterMain);
else
return ShowRegistrationDialog(playerid, dRegisterInputPass);
}
case dRegisterInputName:
{
if(!response)
return ShowRegistrationDialog(playerid, dRegisterInputName);
else
return SpawnPlayer(playerid);
}
}
}
Последний раз редактировалось DeimoS; 16.09.2017 в 14:31.
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
Nexius_Tailer (16.09.2017) SooBad (16.09.2017) VVWVV (16.09.2017)
Для подобных случаев есть: TDW Dialog Library
Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman
Ну, во-первых, знания о том, как такое можно реализовать, лишними не будут никогда. Слепое пользование чужим инструментом часто приводит к тому, что пользователь не может решить, казалось бы, простые проблемы, связанные с этим инструментом.
Во-вторых, изучать синтаксис целой библиотеки (который, к слову, далеко не самый удачный, как по мне) ради подобного - не самое лучшее распределение собственного времени =)
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
Использую самописанную библиотеку для тех же целей, похожую на версию от Стяжкина (то бишь, синтаксис максимально приближен к синтаксису оригинальных функций), но это не помешало написать мне тот пост :) У каждого свои предпочтения и, как можно заметить, большинство предпочитает не пользоваться какими-то сторонними библиотеками для обработки диалогов. И моя информация именно для них
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)