←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Połączenie stałych IN_* (jeden warunek jes...


Best Answer GwynBleidD 21.06.2015 14:02

if(buttons & (IN_RELOAD|~IN_ATTACK))


Nope, nie zadziała...

Załóżmy że IN_RELOAD to zaświecony bit 1, a IN_ATTACK to 2, czyli:
IN_RELOAD  = 0b00000001
IN_ATTACK  = 0b00000010

// dalej:
~IN_ATTACK = 0b11111101
IN_RELOAD|~IN_ATTACK = 0b11111101 // czyli dokładnie to samo, co samo ~IN_ATTACK!
Wynik? Sprawdzimy czy jest wciśnięty jakikolwiek przycisk prócz IN_ATTACK, więc jeśli wciśniemy np stzałkę w przud, use, reload, cokolwiek innego... Również gdy razem z tymi przyciskami wciśniemy IN_ATTACK!

IN_RELOAD | IN_ATTACK  = 0b00000011
IN_RELOAD & ~IN_ATTACK = 0b00000001

if (buttons & (IN_RELOAD | IN_ATTACK) == (IN_RELOAD & ~IN_ATTACK))
Wynik? Najpierw wygaszamy wszystkie bity które nie dotyczą naszych 2ch przycisków, czyli dostajemy 4 możliwe kombinacje:
0b00000011, 0b00000010, 0b00000001, 0b00000000

Następnie porównujemy to do stanu, który nas interesuje, czyli wciśnięty IN_RELOAD i NIE wciśnięty IN_ATTACK.

Prostszej metody bez 2ch porównań nie ma, lepiej jest w tym przypadku zrobić 2 warunki. Jeśli chcemy sprawdzić 3 przyciski to już się opłaca użyć tej metody. Go to the full post

  • +
  • -
Rivit's Photo Rivit 20.06.2015

Witam,

pytanie z cyklu: "autor to ***** i nie może sobie poradzić"

if(buttons & IN_RELOAD && !(buttons & IN_ATTACK))

Jak to zastąpić jednym sprawdzeniem?

Gdyby nie negacja użyłbym sumy bitowej...

Quote

  • +
  • -
DarkGL's Photo DarkGL 20.06.2015

Ale po co skoro masz już warunek :D

Quote

  • +
  • -
Rivit's Photo Rivit 20.06.2015

Pytam z ciekawości, próbuję zrobić coś czego nie potrafię, a chcę umieć...

 

 

jak zrobić żeby było

if(buttons & (IN_RELOAD [...] IN_ATTACK)) //zeby to zsumowac i bylo jako jedno

No wiesz o co chodzi :X

Quote

  • +
  • -
Asiap's Photo Asiap 20.06.2015

if(buttons & (IN_RELOAD|IN_ATTACK))
Quote

  • +
  • -
Rivit's Photo Rivit 20.06.2015

Przeczytaj pierwszy post...
Quote

  • +
  • -
Asiap's Photo Asiap 20.06.2015

if(buttons & (IN_RELOAD|~IN_ATTACK))
Quote

  • +
  • -
Best Answer GwynBleidD's Photo GwynBleidD 21.06.2015

if(buttons & (IN_RELOAD|~IN_ATTACK))


Nope, nie zadziała...

Załóżmy że IN_RELOAD to zaświecony bit 1, a IN_ATTACK to 2, czyli:
IN_RELOAD  = 0b00000001
IN_ATTACK  = 0b00000010

// dalej:
~IN_ATTACK = 0b11111101
IN_RELOAD|~IN_ATTACK = 0b11111101 // czyli dokładnie to samo, co samo ~IN_ATTACK!
Wynik? Sprawdzimy czy jest wciśnięty jakikolwiek przycisk prócz IN_ATTACK, więc jeśli wciśniemy np stzałkę w przud, use, reload, cokolwiek innego... Również gdy razem z tymi przyciskami wciśniemy IN_ATTACK!

IN_RELOAD | IN_ATTACK  = 0b00000011
IN_RELOAD & ~IN_ATTACK = 0b00000001

if (buttons & (IN_RELOAD | IN_ATTACK) == (IN_RELOAD & ~IN_ATTACK))
Wynik? Najpierw wygaszamy wszystkie bity które nie dotyczą naszych 2ch przycisków, czyli dostajemy 4 możliwe kombinacje:
0b00000011, 0b00000010, 0b00000001, 0b00000000

Następnie porównujemy to do stanu, który nas interesuje, czyli wciśnięty IN_RELOAD i NIE wciśnięty IN_ATTACK.

Prostszej metody bez 2ch porównań nie ma, lepiej jest w tym przypadku zrobić 2 warunki. Jeśli chcemy sprawdzić 3 przyciski to już się opłaca użyć tej metody.
GwynBleidD (21.06.2015 14:05):
Tej metody można użyć do dowolnej kombinacji przycisków lub innych flag (np flag admina). W pierwszym nawiasie wypisujemy wszystkie flagi, które sprawdzamy (bez ich negacji), w drugim wypisujemy jaki ma być stan tych flag gdy warunek jest spełniony. Drugi nawias zaczyna się trochę komplikować jeśli klika przycisków ma być wciśniętych, a kilka nie, bo musimy zamiennie używać & i |
Quote

  • +
  • -
Rivit's Photo Rivit 21.06.2015

Dzięki Gwyn, nie mogłem wymyślić sposobu, o to mi chodziło
Quote