Гость stibs

Создание движущихся ворот

В теме 31 сообщение

11 минут назад, DEST сказал:

@MaJoR Таймером, SetTimer функция Вам в помощь. 

Я не знаю что там прописывать и где именно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Gates_V2.0


Кратко о Gates_V2.0:

  • Полностью переписан код относительно первого поста
  • Переведена анимация ворот с команды на клавишу
    • В примере используется клавиша с ID - 2 (KEY_CROUCH), т.е. клавиша 'C', либо же 'H' находясь в Т/С.
  • Добавлена проверка на расстояние от объекта
  • Добавлено закрытие ворот по истечению определенного времени
    • В примере данное значение равно 10 секундам
  • Добавлен массив хранящий информацию о воротах

В начало мода, ко всем define'ам добавим:

#define MAX_GATE			3

С помощью данной строки мы определяем, что при использовании MAX_GATE компилятор будет подразумевать 2.
2 - в данном примере - максимальное* число ворот, оно нам понадобится при дальнейшем использовании в циклах и при создании массива.
 

Далее. К глобальным переменным необходимо добавить это:

new
	gID[MAX_GATE], //Уникальный идентификатор для каждых ворот
	gTime[MAX_GATE], //Переменная для хранения времени в формате unix
	bool:gStatus[MAX_GATE]; //Статус ворот

В переменной gID будет хранится уникальный идентификатор ворот, который будет выдаваться им при их создании.
Переменная gTime будет хранить в себе время в формате Unix, которое в дальнейшем понадобится для определения того, когда закрывать ворота.
Переменная gStatus же, будет хранить в себе информацию о статусе ворот, т.е. true - если они открыты или же false - если закрыты.

Немного ниже вставим вот это:

enum gInfo { //Объявляем перечисление
	gObject,
Float:gPos[6],
Float:gPosClose[6]
};

new Gate[MAX_GATE][gInfo] = { //Объявляем массив
	{968,{1141.64,-1201.89,18.89,0.00,-92.00,90.00},{1141.64,-1201.89,18.89,0.00,-12.00,90.00}},
	{968,{1761.91,-1813.37, 13.24,0.00,-90.00,-13.20},{1761.91,-1813.37,13.24,0.00,-10.00,-13.20}},
	{968,{2236.71,-2217.96,13.25,0.00,-90.00,-45.00},{2236.71,-2217.96,13.25,0.00,-5.00,-45.00}}
};

Перечисление необходимо для определения структуры массива.
О самом массиве: благодаря тому, что чуть выше мы объявили перечисление и использовали его при создании массива, массив теперь имеет структуру описанную в перечислении. Например gObject, исходя из примера будет равен 968, Z-координата первого объекта - 18.89.

Далее, после создания массива с енуменатором, переходим в OnGameModeInit и прописываем следующее:

for(new i; i != MAX_GATE; i ++) {
		gID[i] = CreateObject(Gate[i][gObject],Gate[i][gPos][0],Gate[i][gPos][1],Gate[i][gPos][2],Gate[i][gPos][3],Gate[i][gPos][4],Gate[i][gPos][5]);
		gStatus[i] = false;
}

Тут мы создали цикл (for), в котором прописали создание объекта (ворот) и указали их первоначальный статус (закрыты).
После успешного создания цикла, переходим в OnPlayerKeyStateChange и вставляем следующий код:

if((((newkeys & (KEY_CROUCH)) == (KEY_CROUCH)) && ((oldkeys & (KEY_CROUCH)) != (KEY_CROUCH)))) { //Если игрок нажал на KEY_CROUCH
	for(new i; i != MAX_GATE; i ++) { //Создание цикла
		if(IsPlayerInRangeOfPoint(playerid,10.0,Gate[i][gPos][0],Gate[i][gPos][1],Gate[i][gPos][2])) { //Проверка на расстояние до объекта
			MoveObject(gID[i], Gate[i][gPosClose][0],Gate[i][gPosClose][1],Gate[i][gPosClose][2] + 0.05, 0.05, Gate[i][gPosClose][3],Gate[i][gPosClose][4],Gate[i][gPosClose][5]); //Движение объекта
			gTime[i] = gettime(); //Записываем время в формате unix
			gStatus[i] = true; //Устанавливаем статус открытых ворот
			break; //Останавливаем цикл
		}
	}
}

OnPlayerKeyStateChange срабатывает при нажатии на определенные клавиши. В коде выше мы задали проверку на нажатие клавиши с ID - KEY_CROUCH.
При нажатии этой клавиши будет срабатывать цикл, он нам необходим для проверки на то, находится ли игрок вблизи от ворот. Если проверка пройдена успешно, то мы используем функцию MoveObject для движения объекта. В переменную gTime мы записываем время в формате unix, оно нам понадобится для дальнейшего определения того - когда закрывать ворота.

Далее, нам необходим таймер, срабатывающий каждую секунду, такие таймеры используются в большинстве игровых модов, для определения например времени Pay-Day. В него прописываем это:

for(new i; i != MAX_GATE; i ++) { //Создаем цикл
	if(gTime[i] + (10) < gettime() && gStatus[i] == true) { //Проверка на то, прошло ли заданное время и на статус ворот
		MoveDynamicObject(gID[i], Gate[i][gPos][0],Gate[i][gPos][1],Gate[i][gPos][2] - 0.05, 0.05, Gate[i][gPos][3],Gate[i][gPos][4],Gate[i][gPos][5]); //Движение ворот
		gStatus[i] = false; //Устанавливаем статус закрытых ворот
	}
}

На этом все.

Так же, вы можете скачать тестовый скрипт - Click
Ссылка на VirusTotal - Click

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Спойлер

G:\Сервер\MOD\1.GTA3 RP MOD\pawno\include\mxdate.inc(119) : warning 219: local variable "h" shadows a variable at a preceding level
G:\Сервер\MOD\1.GTA3 RP MOD\pawno\include\mxdate.inc(119) : warning 219: local variable "m" shadows a variable at a preceding level
G:\Сервер\MOD\1.GTA3 RP MOD\pawno\include\mxdate.inc(119) : warning 219: local variable "s" shadows a variable at a preceding level
G:\Сервер\MOD\1.GTA3 RP MOD\pawno\include\YSI\y_debug.inc(382) : warning 219: local variable "s" shadows a variable at a preceding level
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(4878) : warning 219: local variable "s" shadows a variable at a preceding level
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(4894) : warning 219: local variable "s" shadows a variable at a preceding level
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(4910) : warning 219: local variable "s" shadows a variable at a preceding level
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(4926) : warning 219: local variable "s" shadows a variable at a preceding level
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(4942) : warning 219: local variable "s" shadows a variable at a preceding level
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6043) : warning 219: local variable "s" shadows a variable at a preceding level
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6101) : warning 219: local variable "h" shadows a variable at a preceding level
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6101) : warning 219: local variable "m" shadows a variable at a preceding level
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6101) : warning 219: local variable "s" shadows a variable at a preceding level
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6243) : warning 219: local variable "saturday" shadows a variable at a preceding level
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6243) : warning 219: local variable "w" shadows a variable at a preceding level
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6945) : error 055: start of function body without function header
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6949) : error 010: invalid function or declaration
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6951) : error 010: invalid function or declaration
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6953) : error 021: symbol already defined: "mysql_log"
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6955) : error 010: invalid function or declaration
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6959) : error 010: invalid function or declaration
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6963) : error 021: symbol already defined: "mysql_tquery"
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6970) : error 021: symbol already defined: "mysql_tquery"
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6973) : error 021: symbol already defined: "mysql_tquery"
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6989) : error 021: symbol already defined: "mysql_tquery"
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6993) : error 021: symbol already defined: "mysql_tquery"
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6995) : error 021: symbol already defined: "mysql_tquery"
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6998) : error 001: expected token: ";", but found ")"
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(6999) : error 010: invalid function or declaration
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(7004) : error 010: invalid function or declaration
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(7006) : error 010: invalid function or declaration
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(7017) : error 021: symbol already defined: "gettime"
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(7030) : error 021: symbol already defined: "AddPlayerClass"
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(7032) : error 010: invalid function or declaration
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(7035) : error 010: invalid function or declaration
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(7038) : error 010: invalid function or declaration
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(7040) : error 010: invalid function or declaration
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(7042) : error 021: symbol already defined: "KickEx"
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(7044) : error 010: invalid function or declaration
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(7051) : warning 219: local variable "TeamPlayers@YSII_Ag" shadows a variable at a preceding level
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(7051) : error 025: function heading differs from prototype
G:\Сервер\MOD\1.GTA3 RP MOD\gamemodes\Zentorno.pwn(7051) : error 010: invalid function or declaration

 

Что делать?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как сделать что-бы открывать шлаг баум и дверь обычная что-бы какая либо фракция (dc_cmd)

 

Отредактировано пользователем Дима Нисанский

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу