SSGamers - 12 Anos online por você.

#SSGamers - A Comunidade que mais crescer no brasil!

Participe do fórum, é rápido e fácil

SSGamers - 12 Anos online por você.

#SSGamers - A Comunidade que mais crescer no brasil!

SSGamers - 12 Anos online por você.

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Chegou o novo tema 6.5.5 - SSGamers - Servidores online de qualidade - Aproveite e entre para nossa comunidade, inscreva-se já! - Ouça nossa web radio - Veja nossas novidades - Participe dos nossos setores de jogos online - Parcerias aberta fale já com um administrador.

    [Tutorial] Sinalizadores de bits

    Weslley_Script
    Weslley_Script
    SS - Fundador
    SS - Fundador


    Steam Steam : WeslleySSGames
    Zello : WeslleySSGames
    Mensagens : 11381
    Moedas : 1031991
    Data de inscrição : 06/10/2011
    Idade : 28
    Localização : Brasil

    [Tutorial] Sinalizadores de bits Empty [Tutorial] Sinalizadores de bits

    Mensagem por Weslley_Script Sáb 29 Abr 2023 - 6:37

    [size=48]Bit Flags[/size]

    Bit Flags não são nada mais e nada menos que valores binários, você pode criar 31 variáveis ​​booleanas com uma única variável.

    Você precisa de uma noзгo bбsica de nъmeros binбrios, recomendo o seguinte tutorial:
    https://scriptsamp.forumeiros.com/t51849-tutorial-uma-visao-aprofundada-dos-operadores-binarios-e-binarios#101594
    peão Код:

    Código:
    novos BitFlags;


    Seria o mesmo que:
    peão Код:

    Código:
    novo  bool : Booleanos [ 31 ] ;


    Você precisa de um enumerador para distinguir facilmente os valores.
    peão Код:

    Código:
    enum  ( <<=  1 )
    {
         first_flag = 0b1,
        second_flag,
        terceiro_flag
    }


    O "(<<= 1)" no exemplo acima deslocará o valor da constante anterior (exceto a primeira) para a esquerda uma vez: (
    Semelhante à nota científica que você deve ter aprendido em matemática)
    Код:

    Código:
    0b1 << 1 = 0b10.
    0b10 << 1 = 0b100.
    0b100 << 1 = 0b1000.


    Cada um desses bits representa uma potência de 2:
    IMPORTANTE: Nesse exemplo o ^ é usado para representar a potência.
    Код:

    Código:
    [size=14][size=13]2^0 = 1 = 0b1
    2^1 = 2 = 0b10
    2^2 = 4 = 0b100[/size][/size]


    [size=14]peão Код:
    [size=13]enum  ( <<=  1 )
    {
         PLAYER_CONNECTED = 0b1,
        PLAYER_HAS_VEHICLE,
        PLAYER_LIKES_STRAWBERRIES,
        PLAYER_HAS_DEGREE
    }
    new PlayerFlags [ MAX_PLAYERS ] ;[/size][/size]


    Ok, mas como eu uso isso?
    Primeiro, você deve usar o operador lógico OR (|) para dar um valor à sua bandeira.

    Neste ponto sua variável está nula.
    peão Код:

    Código:
    public OnPlayerConnect ( playerid )
    {
         PlayerFlags [ playerid ] | = JOGADOR_CONECTADO;
        retornar  1 ;
    }


    Agora sua variável tem um valor:
    0b1
    peão Код:

    Código:
    CMD : morangos ( playerid, params [ ] )
    {
         PlayerFlags [ playerid ] | = PLAYER_LIKES_STRAWBERRIES;
        retornar  1 ;
    }


    Assim quк o jogador digita o comando /strawberries, ele "ligará" a flag PLAYER_LIKES_STRAWBERRIES, correspondente ao terceiro bit, equivalente a 0b100.
    Agora sua variável tem um valor diferente de antes:
    0b101

    Aqui vai uma dica (Pode lhe ajudar ou lhe atrapalhar dependendo do seu raciocínio):
    Inverta o 0b100.
    0b001, certo?
    Код:

    Código:
    0b1
    +0b001
     -----
     0b101


    Se isso lhe confundiu, apenas esqueça.

    Como eu consigo o valor de uma determinada bandeira?
    Usando o operador lógico AND (&) e comparando o resultado com um sinalizador.
    peão Код:

    Código:
    CMD : morangosftw ( playerid, params [ ] )
    {
        if ( ( PlayerFlags [ playerid ]  & PLAYER_LIKES_STRAWBERRIES )  == PLAYER_LIKES_STRAWBERRIES )
            return SendClientMessage ( playerid, - 1 , "MORANGOS VALEM MEU TEMPO!!!!1111111111111" ) ;

        retornar  1 ;
    }


    E para comparar valores múltiplos?
    peão Код:

    Código:
    CMD : morangosftw ( playerid, params [ ] )
    {
        if ( ( PlayerFlags [ playerid ]  &  ( PLAYER_LIKES_STRAWBERRIES | PLAYER_CONNECTED ) )  ==  ( PLAYER_LIKES_STRAWBERRIES | PLAYER_CONNECTED ) )
            return SendClientMessage ( playerid, - 1 , "MORANGOS VALEM MEU TEMPO!!! !1111111111111" ) ;

        retornar  1 ;
    }


    Este post explica isso melhor.

    E para mudar o valor de 1 para 0 e vice-versa?
    Isso é chamado de swap, e envolve o uso do operador lógico XOR (^)
    peão Код:

    Código:
    CMD : iambipolar ( playerid, params [ ] )
    {
         PlayerFlags [ playerid ]  ^= PLAYER_LIKES_STRAWBERRIES;

        retornar  1 ;
    }


    Você também pode usar AND (&) em conjunto com o NOT (~)
    peão Код:

    Código:
    CMD : iambipolar ( playerid, params [ ] )
    {
         PlayerFlags [ playerid ]  &= ~PLAYER_LIKES_STRAWBERRIES;

        retornar  1 ;
    }


    Se você usar o AND sem o NOT, ele iria "resetar" o valor de todas exceto o bit correspondente aos outros flags, o NOT simplesmente vai inverter (eg 0b100 para 0b011).
    este post explica isso melhor.

    Macros ъteis:
    peão Код:

    Código:
    #define BitFlag_Set(%0,%1) %0 |= %1
    #define BitFlag_Clear(%0,%1) %0 &= ~%1
    #define BitFlag_Get(%0,%1) (((%0) & (%1)) == (%1)))
    #define BitFlag_Toggle(%0,%1) %0 ^= %1


    Utilização:
    Esse é um script que faz uso de Bit Flags.
    creditos: rockfire



    [Tutorial] Sinalizadores de bits D07Xwqb
    [Tutorial] Sinalizadores de bits Yjab9HN

      Data/hora atual: Sex 17 maio 2024 - 7:14