[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 Код: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
- 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)
Код: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.
Код: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 Код:Primeiro, você deve usar o operador lógico OR (|) para dar um valor à sua bandeira.
Neste ponto sua variável está nula.
- Código:
public OnPlayerConnect ( playerid )
{
PlayerFlags [ playerid ] | = JOGADOR_CONECTADO;
retornar 1 ;
}
Agora sua variável tem um valor:
0b1
peão Код:0b1
- 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?
Код: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 Код:Como eu consigo o valor de uma determinada bandeira?
Usando o operador lógico AND (&) e comparando o resultado com um sinalizador.
- 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 Код: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 (^)
- 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 Код:este post explica isso melhor.
Macros ъteis:
- 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.
Esse é um script que faz uso de Bit Flags.
creditos: rockfire