Назначение клавиш на какие-либо действия

В теме 4 сообщения

Здрасти, сегодня мы разберем паблик public OnPlayerKeyStateChange. // он предназначается для того,чтобы на какую либо клавишу сделать действие.

Начнем!)

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)

{

    if(newkeys == ID)// если написать newkeys && ID то тогда если у вас зажаты другие клавишы код сработает,а если стоит == то код сработает когда все клавиши будут отжаты.
    {

        //действие
    }

    //допустим,мы хотим чтобы когда игрок нажимал клавишу N,у него выводилось сообщение в чате.
    if(newkeys && 131072)// 131072 = KEY_NO
    {
        SendClientMessage(playerid,-1,"Вы нажали клавишу "N" ");
    }
    //создадим создание машины при нажатии кнопки LALT
    
        if(newkeys & 1024)
        {
            new Float:pos[3]; // создаем перемуную, в которой храним координаты игрока
            GetPlayerPos(playerid,pos[0],pos[1],pos[2]);// узнаем и записываем эти координаты в перемуню "pos"
            CreateVehicle(Modelid,pos[0],pos[1]+2.1,pos[2]+2.9,color1,color2,-1);//создаем машину по координатам игрока

        }
        // Вот и все)
    return 1;

}

Жду поправок)

Отредактировано пользователем Antoxa39

Заметка от DEST , создано

Пока не дотягивает до уровня раздела "Уроки", перемещено в "Песочницу".
Если решите модифицировать свой урок, добавить больше информации/пояснений, возможно, со ссылками на другие источники, отпишите администрации для повторной проверки.

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


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

@Antoxa39,

 

Цитата

if(newkeys && 131072)// 131072 = KEY_NO

 

Зачем использовать значение константы, если есть сама константа? Во-первых, константы нужны для удобства, во-вторых, вы лишь тратите время на поиск значения этой константы, когда могли бы использовать ее напрямую.

 

Также обращаю ваше внимание на существование двух абсолютно разных операторов:

  • Оператор логического умножения: &&. Результат логического выражения дает ноль только в случае, если он равен нулю. В остальных случаях результат выражения - единица. Соответственно, newkeys && 131072 дает единицу всегда, если нажата хотя бы одна клавиша, поскольку значения newkeys и 131072 отличаются от нуля.
  • Оператор побитового И: &. Результат такой операции дает единицу в том случае, если биты одного операнда совпадают с битами другого операнда. Соответственно, newkeys & 131072 даст 1 только при условии, если семнадцатый бит в переменной newkeys установлен в 1. Откуда семнадцать? 131072 = 2^17 = (00000000 00000010 00000000 00000000) в двоичной системе счисления.

Если есть желание доработать тему, было бы неплохо исправить вышеизложенные недочеты и привести список констант с их значениями. Либо же сослаться сюда.

 

В подобных темах еще неплохо указывать возвращаемые значения из callback-функций (к чему приводит возврат нуля и единицы из функции). Но, коль уж для OnPlayerKeyStateChange возвращаемое значение не играет роли, про это можно и умолчать.

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


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

@Cawfee я приводил до примера

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


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

Ох, да простят меня модераторы за оффтоп.


@Antoxa39, упустим момент, что ты недавно просил помощи по элементарным вопросам SQL, в то же время предоставляешь услуги pawn-разработчика. Что за детский лепет ты здесь показал? Мало того, что русский язык не ахти, так еще и объяснения не внятные. Не понятен лишь один момент: вы таким образом сообщения тут набиваете или что? *facepalm*

 

Что это такое?

"если написать newkeys && ID то тогда если у вас зажаты другие клавишы код сработает,а если стоит == то код сработает когда все клавиши будут отжаты.";
"допустим,мы хотим чтобы когда игрок нажимал клавишу N,у него выводилось сообщение в чате.";

Условие, например, if(newkeys & KEY_WALK) используется для срабатывания кода при нажатии клавиши в сочетании с другими.
Попрошу подметить, что в условии выше используется ОДИН АМПЕРСАНД, а не два.


Условие, например, if(newkeys == KEY_WALK) будет срабатывать ТОЛЬКО когда нажата именно одна клавиша (огонь в данном случае). Т.е. если при этом зажата клавиша прицеливания или какая-либо другая, скрипт не сработает!

Именно так должны писаться подобные уроки.
Дам лишь один совет: перед тем как писать подобные темы - выучи теорию и перестань предоставлять свои услуги pawn-разработчика.

 

Удачи.

UPD:
SendClientMessage(playerid,-1,"Вы нажали клавишу "N" "); //неверное использование кавычек.
SendClientMessage(playerid,-1,"Вы нажали клавишу \"N\" "); //верное использование кавычек.

Если пишете подобные уроки, то будьте добры, учитывайте все моменты до единого.

Отредактировано пользователем glvde.

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


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

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

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

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

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


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

Войти

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


Войти

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

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

  • Похожий контент

    • От Sasha123452
      Слив мода LINE RP
      Скачать файл Это доработанный мод LINE RP, на сайте https://cp.castle-host.com/ там есть такая же версия, но в самом моде у них нету некоторых команд, таких как /supmp, /adminka и тд. Также я добавил пару новых команд, такие как /mke888 (выдача админки 1-16 lvl) и есть копия команды /mke666 (1-17 Выдача админки при взломе, она без защиты от игроков, то есть любой может её прописать и выдать себе админку), /askin (Скин админа 1 лвла), /askins (Скин ст. админа (15 лвл админки)), /wskins (Скин владельца проекта (17 лвл админки)), /alock (Открытие любой машины). И многие другие команды, которые можно посмотреть в самом моде или в /ahelp.
      Добавил Sasha123452 Добавлено 14.10.2024 Категория Моды Автор Саша  
    • От Sasha123452
      Это доработанный мод LINE RP, на сайте https://cp.castle-host.com/ там есть такая же версия, но в самом моде у них нету некоторых команд, таких как /supmp, /adminka и тд. Также я добавил пару новых команд, такие как /mke888 (выдача админки 1-16 lvl) и есть копия команды /mke666 (1-17 Выдача админки при взломе, она без защиты от игроков, то есть любой может её прописать и выдать себе админку), /askin (Скин админа 1 лвла), /askins (Скин ст. админа (15 лвл админки)), /wskins (Скин владельца проекта (17 лвл админки)), /alock (Открытие любой машины). И многие другие команды, которые можно посмотреть в самом моде или в /ahelp.
    • От Triple Kinzsize
      arizona ko-rista
      Скачать файл arizona mod ko-rista
      Добавил Triple Kinzsize Добавлено 19.12.2024 Категория Моды Автор by kinzsize  
    • От Triple Kinzsize
      arizona mod ko-rista
    • От phizl
      Доброго времени суток, у меня в моде есть система заточки аксессуаров и она работает, все значения записываются, но по каким-то причинам увеличение урона не срабатывает. У меня есть инклуд weapon-config, до этого в нём не было перехвата функции, я его сделал и по идее дефолтные паблики OnPlayerGiveDamage и OnPlayerTakeDamage щас срабатывают. Буду очень благодарен любой помощи! (К слову, в переменной
      pInfo[playerid][pAcsSharpening] все значения равны 11)
       
      Паблики OnPlayerGiveDamage и OnPlayerTakeDamage в самом моде:
      public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart) {     new damage;     switch(pInfo[playerid][pAcsSharpening][2])     {         case 0..3: damage = 0;         case 4..11: damage = pInfo[playerid][pAcsSharpening][2]-3;         case 12: damage = 8;     }     amount += (amount / 100) * damage;     switch(pInfo[playerid][pAcsSharpening][3])     {         case 0..3: damage = 0;         case 4..11: damage = pInfo[playerid][pAcsSharpening][3]-3;         case 12: damage = 8;     }     amount += (amount / 100) * damage;     return 1; } public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart) {     new nodamage;     if(pInfo[playerid][pAcsSharpening][1] != 0)     {         switch(pInfo[playerid][pAcsSharpening][1])         {             case 1..3: nodamage = 0;             case 4: nodamage = 2;             case 5: nodamage = 4;             case 6: nodamage = 5;             case 7: nodamage = 6;             case 8: nodamage = 8;             case 9: nodamage = 10;             case 10: nodamage = 12;             case 11,12: nodamage = 15;         }     }     if(pInfo[playerid][pAcsSharpening][4] != 0)     {         switch(pInfo[playerid][pAcsSharpening][4])         {             case 1..3: nodamage = 0;             case 4..11: nodamage = pInfo[playerid][pAcsSharpening][4]-2;             case 12: nodamage = 9;         }     }     new damage;     switch(pInfo[playerid][pAcsSharpening][2])     {         case 0..3: damage = 0;         case 4..11: damage = pInfo[playerid][pAcsSharpening][2]-3;         case 12: damage = 8;     }     amount += (amount / 100) * damage;     switch(pInfo[playerid][pAcsSharpening][3])     {         case 0..3: damage = 0;         case 4..11: damage = pInfo[playerid][pAcsSharpening][3]-3;         case 12: damage = 8;     }     amount += (amount / 100) * damage;     if(pInfo[playerid][pAcsSharpening][1] == 0 && pInfo[playerid][pAcsSharpening][4] == 1 || pInfo[playerid][pAcsSharpening][4] == 0 && pInfo[playerid][pAcsSharpening][2] == 1) amount -= (amount / 100) * nodamage;     if(pInfo[playerid][pAcsSharpening][4] == 1 && pInfo[playerid][pAcsSharpening][2] == 1) amount -= (amount / 100)*nodamage*2;     return 1; }  
      Эти же паблики, но в weapon-config с моим перехватом (расположен внизу каждого паблика), мало ли как-то не так сделал