Создание командного deathmatch

From SA-MP Wiki

Jump to: navigation, search


Итак, Вы уже знаете, как создать классы и разместить их, теперь попробуем создать команды, наконец-то мы займемся программированием, хоть и довольно простым. Я буду использовать 2 класса, созданные ранее, если у Вас их больше, удалите лишние или создайте новый мод, добавив туда только 2 класса. Классы нумеруются с 0, таким образом первый класс будет иметь номер 0, второй - 1 и т.д. (компьютеры и программы обычно начинают отсчет от 0 (Ваш id в тестовой игре тоже будет 0)). Мы хотим устанавливать команду на основе выбранного игроком класса (Грувы или Балласы). Посмотрев на список вызываемых функций и подумав, вы придете к выводу, что это нужно делать в функции OnPlayerRequestClass, и Вы будете совершенно правы. Когда игрок выбирает класс, нам необходимо определить команду, основываясь на его выборе, это нельзя сделать в OnPlayerSpawn, т.к. там неизвестно, какой класс выбрал пользователь (это - параметр, и только значения параметров, либо глобальных переменных (с этим мы разберемся чуть позже) могут использоваться в функциях). Для начала нам нужно объявить команды, после строк "#include" в начале файла добавьте следующие строки:

#define TEAM_GROVE 1
 #define TEAM_BALLA 2
 #define TEAM_GROVE_COLOR 0x00FF00AA // Bright Green (in RGBA format)
 #define TEAM_BALLA_COLOR 0xFF00FFAA // Bright Purple

Если Вы хотите сменить цвета, помните, что последние 2 цифры задают прозрачность и чем они меньше, тем менее различим цвет. Эти объявления - просто замены, теперь, если вы захотите использовать число 1 в скрипте, можно использовать TEAM_GROVE, это не самая лучшая идея при обычных вычислениях, т.к. затрудняет их понимание, но при объявлении команд, которые характеризуются только числом, это делает их более понятными (также, в дальнейшем легче поменять команды местами или изменить их, т.к. нужно изменить значение только в 1 месте, а не во всем коде). При компиляции все TEAM_GROVE заменятся на 1, это не переменные, а константы, они не изменяются. Теперь ниже добавьте:

new gTeam[MAX_PLAYERS];

Так мы создаем глобальный массив. Массив - это множество переменных (мест хранения данных для чтения/записи) сгруппированных для сохранения множества данных в 1 переменной. "MAX_PLAYERS" - предопределенная константа (определена точно так же, как мы определяли свои константы). Значение MAX_PLAYERS равно 100 (в samp 0.2.2 - 200, в 0.2.5 будет 500 - прим. переводчика), это означает, что в массиве может храниться 100 переменных. Буква g в имени означает, что массив глобальный, но не делает его глобальным (это сделано, чтобы было ясно, глобальная переменная или локальная), объявление переменной вне функций делает её глобальной и доступной всем функциям. Все переменные, объявленные внутри функции, локальны для неё, и их имена не могут совпадать с именами других локальных переменных этой функции, либо глобальных переменных (вот почему удобно добавлять g перед именами глобальных переменных), однако их имена могут совпадать с именами локальных переменных других функций. се переменные "playerid" в Вашем чистом скрипте, на самом деле, независимы, каждая локальна в одной функции, однако они передают одинаковые данные, но помните, что все написанные Вами функции не будут автоматически получать эти данные. Теперь мы можем установить команды:

public SetPlayerTeamFromClass(playerid, classid)
 {
 	if (classid == 0)
 	{
 		gTeam[playerid] = TEAM_GROVE;
 	}
 	else
 	{
 		gTeam[playerid] = TEAM_BALLA;
 	}
 }

Разместите этот код ВНЕ функций в Вашем скрипте (т.к. это новая функция) и добавьте следующий код сразу после открывающих скобок в OnPlayerRequestClass (замечание: т.к. переменные не глобальные, нужно передать их в функцию):

SetPlayerTeamFromClass(playerid, classid);

Так команды игроков сохранятся в массив с помощью нашей функции. Данные в массиве доступны по номеру, так array[0] это первый элемент массива, array[1] - второй и так далее, т.к. мы используем gTeam[playerid], элемент, в котором будут сохраняться данные, определяется по ID игрока, так для 5 игрока данные будут сохраняться в массиве в позиции 5 (запомните, это шестой по счету элемент). Теперь скопируйте эту функцию:

public SetPlayerToTeamColor(playerid)
 {
 	if (gTeam[playerid] == TEAM_GROVE)
 	{
 		SetPlayerColor(playerid, TEAM_GROVE_COLOR);
 	}
 	else if (gTeam[playerid] == TEAM_BALLA)
 	{
 		SetPlayerColor(playerid, TEAM_BALLA_COLOR);
 	}
 }

И добавьте следующую строку в OnPlayerSpawn:

SetPlayerToTeamColor(playerid);

Теперь у нас есть команды, но что же мы на самом деле сделали?

if (classid == 0)
 	{
 		gTeam[playerid] = TEAM_GROVE;
 	}

В нашей первой функции мы проверяем, какой класс был выбран (не забыли, что классы нумеруются с ?) "==" означает равенство, одиночный знак равенства устанавливает переменной переданное значение (как видно из следующей строки). Фигурные скобки отделяют функции от остального кода, так, они будут вызваны только если выбран 0 класс (cj), в противном случае вызывается блок else (он выполняется всегда, когда условие оператора "if" ложно (false) (в данном случае класс не 0)), так как мы выбираем только из двух классов, это означает, что выбран Баллас:

else
 	{
 		gTeam[playerid] = TEAM_BALLA;
 	}

Нам не нужно возвращать здесь никакого результата.

Вторая половина устанавливает цвета игроков при респауне, так вы можете сказать, кто в какой команде. Так как мы сохранили информацию о командах в глобальный массив, у нас есть доступ к ней из любых функций.

if (gTeam[playerid] == TEAM_GROVE)
 	{
 		SetPlayerColor(playerid, TEAM_GROVE_COLOR);
 	}

Думаю, вы понимаете, что делают эти строки, если игрок (в функцию передается его id) в TEAM_GROVE, устанавливаем его цвет в TEAM_GROVE_COLOR.

else if (gTeam[playerid] == TEAM_BALLA)
 	{
 		SetPlayerColor(playerid, TEAM_BALLA_COLOR);
 	}

Следующий участок кода немного отличается, проще его можно было бы сделать таким образом:

else
 	{
 		SetPlayerColor(playerid, TEAM_BALLA_COLOR);
 	}

Но таким образом можно будет устанавливать цвет только в TEAM_BALLA_COLOR, если первое условие ложно. В приведенном же ранее варианте, можно добавить больше вариантов, путем добавления блоков "else if ()" в конце, причем все условия будут проверены последовательно.

Personal tools