2010-11-01 41 views
2

Vous en avez une cette fois-ci, question de logique binaire/logique booléenne!Comportement de la logique bit à bit (logique booléenne) La structure dans mon code semble incorrecte!

Je travaille actuellement dans Visual Studio 2010 en utilisant C# comme langue et j'essaie de garder la trace de certains états en utilisant une énumération [Flags].

Je les ai utilisé plusieurs fois (et franchement les trouver très utile !!)

Il dispose de 5 états tous les pouvoirs de 2 ofc aucun problème partout, le nom est characterState (variable dans laquelle je stocke les valeurs)

Dans l'exemple de code suivant:

private void DebugLogState() 
{ 
    //Check and log the current state of the character 
    //If a state matches, play it's respective animation 
    if ((currentCharacterState & Controller_2D.CharacterState.Idle) > 0) 
    { 
     Debug.Log("Idle state is active, log from object: Controller_2D"); 
    } 
    if ((currentCharacterState & Controller_2D.CharacterState.Walking) > 0) 
    { 
     Debug.Log("Walking state is active, log from object: Controller_2D"); 
    } 
    if ((currentCharacterState & Controller_2D.CharacterState.Running) > 0) 
    { 
     Debug.Log("Running state is active, log from object: Controller_2D"); 
    } 
    if ((currentCharacterState & Controller_2D.CharacterState.Jumping) > 0) 
    { 
     Debug.Log("Jumping state is active, log from object: Controller_2D"); 
    } 
    if ((currentCharacterState & Controller_2D.CharacterState.Crouching) > 0) 
    { 
     Debug.Log("Crouching state is active, log from object: Controller_2D"); 
    } 
} 

maintenant ce que j'espérais consiste à comparer 01011 (ou toute autre permutation où ralenti est réglé sur 1) avec l'état IDLE (01000) & les deux et vérifier> 0 pour vérifier i f IDLE = vrai. J'ai eu une alarme dans ma tête disant RECODE CECI MAINTENANT !!! Mais je commence juste à regarder et à regarder et je me demande quelle est la meilleure façon. N'hésitez pas à m'aider pour trouver ce qui va être la meilleure vérification pour l'état IDLE, je vais essayer de comparer avec certains de mon ancien code enum en attendant.

Répondre

6

Étant donné que vous utilisez VS2010, je suppose que vous compilez pour .NET 4.0? Si oui, vous pouvez utiliser la méthode Enum.HasFlag:

bool isIdleSet = currentCharacterState.HasFlag(Controller_2D.CharacterState.Idle); 

Sinon, vous pouvez faire:

(currentCharacterState & Controller_2D.CharacterState.Idle) == Controller_2D.CharacterState.Idle 

Notez que la méthode >0 a 2 problèmes:

  1. ne fonctionne pas correctement avec la valeur 0 (faux négatifs).
  2. Ne fonctionne pas correctement lorsque le drapeau candidat est lui-même un état composite (faux positifs). par exemple. si Idle étaient 1001, alors 1000 passerait le test alors qu'il ne le devrait pas.

test que le résultat de l'opération ET est égal au drapeau candidat se élude tous les deux.

+0

Merci, juste ce dont j'avais besoin! Et se révèle-je stupide mon programme jusqu'à Net 2.0 Ouais .... Il est comme frapper les rochers ensemble pour que je sais cuisiner :( Vous aide était valueable pour mon apprentissage quel que soit Tx – Proclyon

2

Si vous compilez contre .NET 4.0, vous pouvez utiliser Enum.HasFlags:

bool isIdle = currentCharacterState.HasFlag(Controller_2D.CharacterState.Idle); 

Dans le cas contraire, votre logique existante est pas trop loin. Je fais habituellement ce qui suit:

bool isIdle = currentCharacterState & Controller_2D.CharacterState.Idle 
    == Controller_2D.CharacterState.Idle; 
+0

Merci pour la help! Ceci est une solution de travail, je ne peux pas utiliser. NET 4.0 mais 2.0 il se avère que je vais juste devoir imbiber le programme à nouveau. – Proclyon