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

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

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

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

Мануал [Pawn.RakNet] Определяем нажатие кнопок WASD пешком и AD в автомобиле

oxygenium

Изучающий
Professional
Пользователь
Регистрация
5 Ноя 2013
Сообщения
957
Лучшие ответы
18
Репутация
445
Награды
3
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!

Доброго времени суток. В SA:MP по умолчанию можно отследить только кнопки W и S, при этом только если игрок находится в автомобиле. В этой теме я покажу простое решение, которое позволит взаимодействовать с кнопками WASD, если игрок находится НЕ в автомобиле и с A и D, если игрок находится в автомобиле.

Естественно, для всего этого Вам понадобится плагин Pawn.RakNet

Для начала создадим макросы для кнопок

C++:
#define KEY_ONFOOT_W 300
#define KEY_ONFOOT_A 301
#define KEY_ONFOOT_S 302
#define KEY_ONFOOT_D 303
#define KEY_IN_CAR_A 304
#define KEY_IN_CAR_D 305
А так же создадим переменную, которая будет в себе хранить кнопку, которая была нажата. Это нужно для того, чтобы отслеживать и нажатие и отжатие кнопки.

C++:
new OLD_KEY[MAX_PLAYERS];
Затем просто при входящем пакете получаем данные о кнопках и в зависимости от нажатой кнопки вызываем OnPlayerKeyStateChange

C++:
public OnIncomingPacket(playerid, packetid, BitStream:bs)
{
    if(packetid == 207)
    {
        new onFootData[PR_OnFootSync];
        BS_IgnoreBits(bs, 8);
        BS_ReadOnFootSync(bs, onFootData);

        if(onFootData[PR_udKey] == 65408)     OnPlayerKeyStateChange(playerid, KEY_ONFOOT_W, 0), OLD_KEY[playerid] = KEY_ONFOOT_W;
        if(onFootData[PR_udKey] == 128)     OnPlayerKeyStateChange(playerid, KEY_ONFOOT_S, 0), OLD_KEY[playerid] = KEY_ONFOOT_S;
        if(onFootData[PR_lrKey] == 65408)     OnPlayerKeyStateChange(playerid, KEY_ONFOOT_A, 0), OLD_KEY[playerid] = KEY_ONFOOT_A;
        if(onFootData[PR_lrKey] == 128)     OnPlayerKeyStateChange(playerid, KEY_ONFOOT_D, 0), OLD_KEY[playerid] = KEY_ONFOOT_D;

        if(onFootData[PR_udKey] == 0 && OLD_KEY[playerid] == KEY_ONFOOT_W) OnPlayerKeyStateChange(playerid, 0, KEY_ONFOOT_W), OLD_KEY[playerid] = 0;
        if(onFootData[PR_udKey] == 0 && OLD_KEY[playerid] == KEY_ONFOOT_S) OnPlayerKeyStateChange(playerid, 0, KEY_ONFOOT_S), OLD_KEY[playerid] = 0;
        if(onFootData[PR_lrKey] == 0 && OLD_KEY[playerid] == KEY_ONFOOT_A) OnPlayerKeyStateChange(playerid, 0, KEY_ONFOOT_A), OLD_KEY[playerid] = 0;
        if(onFootData[PR_lrKey] == 0 && OLD_KEY[playerid] == KEY_ONFOOT_D) OnPlayerKeyStateChange(playerid, 0, KEY_ONFOOT_D), OLD_KEY[playerid] = 0;
    }
    if(packetid == 200)
    {
        new inCarData[PR_InCarSync];
        BS_IgnoreBits(bs, 8);
        BS_ReadInCarSync(bs, inCarData);

        if(inCarData[PR_lrKey] == 65408)     OnPlayerKeyStateChange(playerid, KEY_IN_CAR_A, 0), OLD_KEY[playerid] = KEY_IN_CAR_A;
        if(inCarData[PR_lrKey] == 128)         OnPlayerKeyStateChange(playerid, KEY_IN_CAR_D, 0), OLD_KEY[playerid] = KEY_IN_CAR_D;

        if(inCarData[PR_lrKey] == 0 && OLD_KEY[playerid] == KEY_IN_CAR_A) OnPlayerKeyStateChange(playerid, 0, KEY_IN_CAR_A), OLD_KEY[playerid] = 0;
        if(inCarData[PR_lrKey] == 0 && OLD_KEY[playerid] == KEY_IN_CAR_D) OnPlayerKeyStateChange(playerid, 0, KEY_IN_CAR_D), OLD_KEY[playerid] = 0;
    }
    return 1;
}
Вот и все, теперь в OnPlayerKeyStateChange мы можем обрабатывать кнопки WASD как обычные кнопки

C++:
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if(newkeys & KEY_ONFOOT_W)
    {
        print("Нажата кнопка W");
        // Ваш код
    }
    if(newkeys & KEY_ONFOOT_A)
    {
        print("Нажата кнопка A");
        // Ваш код
    }
    return 1;
}
C++:
#define KEY_ONFOOT_W 40
#define KEY_ONFOOT_A 41
#define KEY_ONFOOT_S 42
#define KEY_ONFOOT_D 43
#define KEY_IN_CAR_A 44
#define KEY_IN_CAR_D 45
C++:
new OLD_KEY[MAX_PLAYERS char];
C++:
public OnIncomingPacket(playerid, packetid, BitStream:bs)
{
    if(packetid == 207)
    {
        new onFootData[PR_OnFootSync];
        BS_IgnoreBits(bs, 8);
        BS_ReadOnFootSync(bs, onFootData);

        if(onFootData[PR_udKey] == 65408)     OnPlayerKeyStateChange(playerid, KEY_ONFOOT_W, 0), OLD_KEY{playerid} = KEY_ONFOOT_W;
        if(onFootData[PR_udKey] == 128)     OnPlayerKeyStateChange(playerid, KEY_ONFOOT_S, 0), OLD_KEY{playerid} = KEY_ONFOOT_S;
        if(onFootData[PR_lrKey] == 65408)     OnPlayerKeyStateChange(playerid, KEY_ONFOOT_A, 0), OLD_KEY{playerid} = KEY_ONFOOT_A;
        if(onFootData[PR_lrKey] == 128)     OnPlayerKeyStateChange(playerid, KEY_ONFOOT_D, 0), OLD_KEY{playerid} = KEY_ONFOOT_D;

        if(onFootData[PR_udKey] == 0 && OLD_KEY{playerid} == KEY_ONFOOT_W) OnPlayerKeyStateChange(playerid, 0, KEY_ONFOOT_W), OLD_KEY{playerid} = 0;
        if(onFootData[PR_udKey] == 0 && OLD_KEY{playerid} == KEY_ONFOOT_S) OnPlayerKeyStateChange(playerid, 0, KEY_ONFOOT_S), OLD_KEY{playerid} = 0;
        if(onFootData[PR_lrKey] == 0 && OLD_KEY{playerid} == KEY_ONFOOT_A) OnPlayerKeyStateChange(playerid, 0, KEY_ONFOOT_A), OLD_KEY{playerid} = 0;
        if(onFootData[PR_lrKey] == 0 && OLD_KEY{playerid} == KEY_ONFOOT_D) OnPlayerKeyStateChange(playerid, 0, KEY_ONFOOT_D), OLD_KEY{playerid} = 0;
    }
    if(packetid == 200)
    {
        new inCarData[PR_InCarSync];
        BS_IgnoreBits(bs, 8);
        BS_ReadInCarSync(bs, inCarData);

        if(inCarData[PR_lrKey] == 65408)     OnPlayerKeyStateChange(playerid, KEY_IN_CAR_A, 0), OLD_KEY{playerid} = KEY_IN_CAR_A;
        if(inCarData[PR_lrKey] == 128)         OnPlayerKeyStateChange(playerid, KEY_IN_CAR_D, 0), OLD_KEY{playerid} = KEY_IN_CAR_D;

        if(inCarData[PR_lrKey] == 0 && OLD_KEY{playerid} == KEY_IN_CAR_A) OnPlayerKeyStateChange(playerid, 0, KEY_IN_CAR_A), OLD_KEY{playerid} = 0;
        if(inCarData[PR_lrKey] == 0 && OLD_KEY{playerid} == KEY_IN_CAR_D) OnPlayerKeyStateChange(playerid, 0, KEY_IN_CAR_D), OLD_KEY{playerid} = 0;
    }
    return 1;
}
 
Последнее редактирование:
Сверху Снизу