Текущая версия SA-MP: 0.3.7


IP: 77.220.180.96:7777
  Новые сообщения · Поиск
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: KaTacTpOqpa  
Как создать TDM мод для SAMP?
Polcar Сообщение # 1  | 19:32:02
Руководитель проекта SM
Администраторы
Сообщений: 788
Репутация: 323
Создание командного deathmatch

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

Code

#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, это не переменные, а константы, они не изменяются. Теперь ниже добавьте:

Code

new gTeam[MAX_PLAYERS];

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

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

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

Code

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

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

Code

SetPlayerTeamFromClass(playerid, classid);

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

Code

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:

Code

SetPlayerToTeamColor(playerid);

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

Code

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

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

Code

else
      {
       gTeam[playerid] = TEAM_BALLA;
      }

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

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

Code

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

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

Code

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

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

Code

else
      {
       SetPlayerColor(playerid, TEAM_BALLA_COLOR);
      }

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




Demetrius Сообщение # 2  | 19:28:59
VIP-пользователи
Сообщений: 1192
Репутация: 158
Ну это проще biggrin

Sweet >>> Armin >>> Demetrius

SA:MP >> MTA:SA >> IRL
Polcar Сообщение # 3  | 06:32:09
Руководитель проекта SM
Администраторы
Сообщений: 788
Репутация: 323
инструкций по созданию командного дезматча почти нигде нет, вот вам редчайшая инструкция, юзайте)



Demetrius Сообщение # 4  | 12:36:55
VIP-пользователи
Сообщений: 1192
Репутация: 158
а я с wiki.sa-mp все переводил когда тут понятней(((

Добавлено (25.06.2010, 12:36)
---------------------------------------------
но у меня есть инструкция но она на половину переведена(((


Sweet >>> Armin >>> Demetrius

SA:MP >> MTA:SA >> IRL
Polcar Сообщение # 5  | 12:44:44
Руководитель проекта SM
Администраторы
Сообщений: 788
Репутация: 323
ясно



ANGEL Сообщение # 6  | 22:22:41
Глав. Модераторы
Сообщений: 503
Репутация: 228
Снова программирование... Не, мне это не нра...



Можете задавать вопросы в личку на сайте...
Demetrius Сообщение # 7  | 11:26:13
VIP-пользователи
Сообщений: 1192
Репутация: 158
оу, это проще, и мне это нравится, это же просто!!! Главное понять, а для этого и существуют форумы)))

Sweet >>> Armin >>> Demetrius

SA:MP >> MTA:SA >> IRL
ANGEL Сообщение # 8  | 11:27:19
Глав. Модераторы
Сообщений: 503
Репутация: 228
[off]Я тут где то уже написал... После паскаля, мне плохо от программ...



Можете задавать вопросы в личку на сайте...
Demetrius Сообщение # 9  | 11:28:51
VIP-пользователи
Сообщений: 1192
Репутация: 158
[off]ааа, ясно, но тогда отдыхай))) но я думаю что это даже поможет в изучении паскаля, хотя я его только в этом году изучать буду)))

Sweet >>> Armin >>> Demetrius

SA:MP >> MTA:SA >> IRL
ANGEL Сообщение # 10  | 11:29:38
Глав. Модераторы
Сообщений: 503
Репутация: 228
[off]Хм... У меня конспект сохранился по нему... Надо?



Можете задавать вопросы в личку на сайте...
Demetrius Сообщение # 11  | 11:31:54
VIP-пользователи
Сообщений: 1192
Репутация: 158
[off]не ненадо, спс)

Sweet >>> Armin >>> Demetrius

SA:MP >> MTA:SA >> IRL
ANGEL Сообщение # 12  | 11:32:18
Глав. Модераторы
Сообщений: 503
Репутация: 228
[off]Да, пока еще не зачто...



Можете задавать вопросы в личку на сайте...
Demetrius Сообщение # 13  | 11:33:07
VIP-пользователи
Сообщений: 1192
Репутация: 158
[off]хех)

Sweet >>> Armin >>> Demetrius

SA:MP >> MTA:SA >> IRL
blazer321 Сообщение # 14  | 00:44:30
VIP-пользователи
Сообщений: 641
[off]Оффтоп детектед xDD

Старший админ сервера Универсал.

Polcar Сообщение # 15  | 16:14:12
Руководитель проекта SM
Администраторы
Сообщений: 788
Репутация: 323
тдм моды круче чем дм моды, их конечно делать труднее, но прикольнее



Demetrius Сообщение # 16  | 23:03:22
VIP-пользователи
Сообщений: 1192
Репутация: 158
ага, даже и делать то их не так уж сложно, по сравнению с gf модами... wacko

Sweet >>> Armin >>> Demetrius

SA:MP >> MTA:SA >> IRL
Polcar Сообщение # 17  | 18:49:43
Руководитель проекта SM
Администраторы
Сообщений: 788
Репутация: 323
ахахаах, ага, гф моды это ваще ппц



Demetrius Сообщение # 18  | 12:12:21
VIP-пользователи
Сообщений: 1192
Репутация: 158
ага там да 13000 строк доходит и больше...

Sweet >>> Armin >>> Demetrius

SA:MP >> MTA:SA >> IRL
Staff Сообщение # 19  | 12:02:42
Проверенные
Сообщений: 208
Репутация: 23
и кто их пишет?
Demetrius Сообщение # 20  | 08:03:04
VIP-пользователи
Сообщений: 1192
Репутация: 158
я, правда собираюсь но для рп модов нужно 100% знание pawno вот как научусь напишу.)

Sweet >>> Armin >>> Demetrius

SA:MP >> MTA:SA >> IRL
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: