Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Урок Плавный шлагбаум

OKStyle

Эксперт
Когда ещё не было плавного движения и поворота объектов соответствующей функцией MoveObject , шлагбаумы уже могли открываться плавно. Идея такая же, как в моём TextDraw Intro: по итерациям.

Для начала, нам нужно объявить константу объекта и одну переменную, относительно который будет считаться поворот по оси:
PHP:
new Object[1], rotating = -90;
Теперь при старте мода или скрипта (или где вам удобно) создадим этот объект, придав константе значение, равное порядковому номеру объекта:
PHP:
Object[0] = CreateObject(2920, 1544.68994141, -1630.84997559, 13.0, -90.0, 0.0, 0.0);
Напишем небольшую команду для открытия шлагбаума:
PHP:
if(strcmp(cmdtext, "/lspd", true) == 0)
{
    SetTimer("OpenLSPDBarrier", 50, 0); // таймер, который будет поворачивать шлагбаум
    return 1;
}
Теперь самое важное: управляющие таймеры. Начнём с того, который будет открывать шлагбаум:
PHP:
forward OpenLSPDBarrier();
public OpenLSPDBarrier()
{
    new Float:RotX, Float:RotY, Float:RotZ; // объявим переменные, в которые будут записаны углы поворота по осям
    GetObjectRot(Object[0], RotX, RotY, RotZ); // получаем уголы поворота шлагбаума по осям и записываем их в объявленные переменные
    SetObjectRot(Object[0], RotX + 1.0, RotY, RotZ); // устанавливаем угол поворота побольше (по оси X должен вертеться шлагбаум, чтобы открываться и закрываться)
    if(rotating < 0) // т.к. базовый поворот -90, то поворот открытого - 0, а следовательно пишем такое условие
    {
        rotating += 1; // если ещё призакрыт, то поворачиваем
        SetTimer("OpenLSPDBarrier", 50, 0); // запускаем таймер снова для повтора поворота
    }
    else
    {
        SetTimer("CloseLSPDBarrier", 5000, 0); // если открыт полностью - запускаем таймер, который через 5 секунд начнёт закрывать шлагбаум
    }
    return 1;
}
Теперь напишем таймер, который будет закрывать наш шлагбаум:
PHP:
forward CloseLSPDBarrier();
public CloseLSPDBarrier()
{
    if(rotating > -90) // если шлагбаум ещё не закрыт
    {
        new Float:RotX, Float:RotY, Float:RotZ;
        GetObjectRot(Object[0], RotX, RotY, RotZ);
        SetObjectRot(Object[0], RotX - 1.0, RotY, RotZ);
        rotating -= 1; // уменьшаем поворот
        SetTimer("CloseLSPDBarrier", 50, 0); // повторно запускаем таймер закрытия
    }
    return 1;
}
ВНИМАНИЕ: при выгрузке мода или скрипта прописать:
Код:
DestroyObject(Object[0]); // чтобы объекты не дублировались
PHP:
new Object[1], rotating = -90;
public OnFilterScriptInit()
{
// Шлагбаум (by OKStyle)
    Object[0] = CreateObject(2920, 1544.68994141, -1630.84997559, 13.0, -90.0, 0.0, 0.0); //object(police_barrier) (1)
    return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
    if(strcmp(cmdtext, "/lspd", true) == 0)
    {
        SetTimer("OpenLSPDBarrier", 50, 0);
        return 1;
    }
    return 0;
}
public OnFilterScriptExit()
{
    DestroyObject(Object[0]);
    return 1;
}
forward OpenLSPDBarrier();
public OpenLSPDBarrier()
{
    new Float:RotX, Float:RotY, Float:RotZ;
    GetObjectRot(Object[0], RotX, RotY, RotZ);
    SetObjectRot(Object[0], RotX + 1.0, RotY, RotZ);
    if(rotating < 0)
    {
        rotating += 1;
        SetTimer("OpenLSPDBarrier", 50, 0);
    }
    else
    {
        SetTimer("CloseLSPDBarrier", 5000, 0);
    }
    return 1;
}
forward CloseLSPDBarrier();
public CloseLSPDBarrier()
{
    if(rotating > -91)
    {
        new Float:RotX, Float:RotY, Float:RotZ;
        GetObjectRot(Object[0], RotX, RotY, RotZ);
        SetObjectRot(Object[0], RotX - 1.0, RotY, RotZ);
        rotating -= 1;
        SetTimer("CloseLSPDBarrier", 50, 0);
    }
    return 1;
}

Автор: OKStyle
 
Сверху Снизу