Antoxa39

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

4 posts in this topic

Здрасти, сегодня мы разберем паблик 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;

}

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

Edited by Antoxa39

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

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

Share this post


Link to post
Share on other sites

@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 возвращаемое значение не играет роли, про это можно и умолчать.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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


@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\" "); //верное использование кавычек.

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

Edited by glvde.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • Kutuzov
      By Kutuzov
      Всем привет, хотелось бы спросить у тех, кто разбирается в PluginSDK.
      Какие есть источники, руководства, документации о PluginSDK?
      Я пока что ничего нормального не нахожу.
      Заранее спасибо 
    • Danila_Fazz
      By Danila_Fazz
      Добрый день вписал систему 3д номеров все запустилось, но когда создаю номера пишет что они записаны в бд но они не записываются в бд  когда еще раз отпровляю команду пишет опять что все записано, но не чо не записываеться когда компелирую мод показывает только варнинги 202 на разные строки
       
      C:\Users\Danila_Fazz\Desktop\Сервак\gamemodes\srp061.pwn(23135) : warning 202: number of arguments does not match definition
      C:\Users\Danila_Fazz\Desktop\Сервак\gamemodes\srp061.pwn(23162) : warning 202: number of arguments does not match definition
      C:\Users\Danila_Fazz\Desktop\Сервак\gamemodes\srp061.pwn(23199) : warning 202: number of arguments does not match definition
      C:\Users\Danila_Fazz\Desktop\Сервак\gamemodes\srp061.pwn(23288) : warning 202: number of arguments does not match definition
      C:\Users\Danila_Fazz\Desktop\Сервак\gamemodes\srp061.pwn(23335) : warning 202: number of arguments does not match definition
      C:\Users\Danila_Fazz\Desktop\Сервак\gamemodes\srp061.pwn(23388) : warning 202: number of arguments does not match definition
      C:\Users\Danila_Fazz\Desktop\Сервак\gamemodes\srp061.pwn(23397) : warning 202: number of arguments does not match definition
      Pawn compiler 3.10.20150531              Copyright (c) 1997-2006, ITB CompuPhase
      Header size:          18160 bytes
      Code size:          8734120 bytes
      Data size:          3641416 bytes
      Stack/heap size:      16384 bytes; estimated max. usage=6660 cells (26640 bytes)
      Total requirements:12410080 bytes
      7 Warnings.
      на каждой этой страке находиться   if(IsPlayerAdmin(playerid, 7)) return 1;
       
    • Владислав2
      By Владислав2
      Здравствуйте, хотел бы попросить у вас помощи, мне нужна система /aban на павно, щяс опишу все
      Допустим администратор (Назовём его 1) сливает свой пост, и это видит другой администратор (Назовём его 2) И Администратор 2 может ввести команду /aban и id другово админа, после его у обих администраторов блокируются админ возможности (Кто написал /aban и кому выдали /aban  после в чате будет написано:
      "Администратор 1 выдал aban администратору 2.
      Немедленно сообщите руководсву о произошедшем!" (красным цветом)

      Потом после разборок и тд, руководство заходит в игру и снимает aban по команде /unaban Снять можно только id