2015-12-24 1 views
-1

J'essaye de faire du code pour détecter une certaine image et jouer un son. Dans ma source, j'utilise ImageGetName pour obtenir le nom de l'image elle-même.C++: strcmp étant ignoré

ImageGetName est comme suit:

const char *ImageGetName(const image_c *image) 
{ 
    const image_c *rim; 

    rim = (const image_c *) image; 

    return rim->name; 
} 

Dans ma fonction principale, j'ai cette définition:

const char *image = ImageGetName(mo->subsector->sector->floor.image); 

Il devrait simplement pointer * image pour floor.image quand appelé et les trier comme approprié.

Maintenant, ce que je veux faire est d'accéder au nom de l'image actuelle avec

ImageGetName(mo->subsector->sector->floor.image). 

Donc, pour ce faire, je suppose que je dois utiliser strcmp. Mais peut-être que je ne le fais pas correctement. Le bloc en question:

  if (mo->player && gravity > 0 && -zmove > OOF_SPEED && ! fly_or_swim) 
     { 

      if(!strcmp(image, "WATER")) //false, do no lookup 
      { 
      CON_Message("Normal Floor!"); 
      mo->player->deltaviewheight = zmove/8.0f; 
      S_StartFX(mo->info->oof_sound, P_MobjGetSfxCategory(mo), mo); 
      } 
      else if(strcmp(image, "WATER") == 0) //true, look this up!! 
      CON_Message("Detected WATER FLAT!"); 
      mo->player->deltaviewheight = zmove/10.0f; 

      S_StartFX(mo->info->secretsound, P_MobjGetSfxCategory(mo), mo); 
     } 

Le problème ici est qu'il est ignorant complètement la première strcmp if (strcmp (image, "EAU")!) et aller droit à la deuxième: else if (strcmp (image, "EAU") == 0). Cela ne devrait pas être le cas. Dans la plupart des cas, la première partie doit être considérée comme vraie à moins que le joueur ne marche réellement sur une image WATER. Le problème est que le joueur ne marche pas réellement sur l'image marquée "EAU", mais plutôt chaque image seule image le pas du joueur produira la deuxième sortie (Détecté EAU!).

J'en ai besoin pour évaluer l'image accessible - si elle ne la trouve pas, "Normal Floor", et si c'est le cas, "Detected WATER!". L'utilisation de! Strcmp devrait supposer qu'il n'a même pas besoin de se soucier de regarder l'image, alors que strcmp normal devrait évaluer l'image sur laquelle on marche. Mais ce n'est pas le cas.

Puis-je avoir de l'aide ici? J'apprécie vraiment cela!

+0

Utilisez 'std :: string' et appréciez les opérateurs de comparaison qui sont réellement lisibles par l'homme. –

+0

L'implémentation de 'ImageGetName' est loin d'être verbeuse. Il suffit d'écrire 'return image-> name;'. –

Répondre

2

fixer votre empreinte et l'un des vos problèmes devient clair:

if(!strcmp(image, "WATER")) //false, do no lookup 
{ 
    CON_Message("Normal Floor!"); 
    mo->player->deltaviewheight = zmove/8.0f; 
    S_StartFX(mo->info->oof_sound, P_MobjGetSfxCategory(mo), mo); 
} 
else if(strcmp(image, "WATER") == 0) //true, look this up!! 
    CON_Message("Detected WATER FLAT!"); 
mo->player->deltaviewheight = zmove/10.0f; 

S_StartFX(mo->info->secretsound, P_MobjGetSfxCategory(mo), mo); 

Les deux dernières lignes ne font pas partie du bloc else if. Vous devez entourer les instructions que vous voulez être dans le bloc else if avec des accolades.

L'autre problème est que !strcmp(image, "WATER") et strcmp(image, "WATER") == 0 font exactement la même chose - les deux sont vrais, ou les deux sont faux. Je ne sais pas ce que vous essayiez de faire là-bas, mais ce n'est pas ce qu'elle fait réellement.

1

1 manque-vous avez une paire d'accolades pour entourer le bloc else if

2- else if ne sera jamais exécuter indépendamment. strcmp renvoie 0 s'il y a une correspondance, ce qui équivaut à false. Donc, en supposant qu'il y ait une correspondance, la condition à l'intérieur if() évaluera à !0 qui évaluera à vrai. Le else if (condition) évalue à else if (0==0) which is also equal to true. Remove the!`dans la condition if et ça devrait aller.

0

Je suppose à la fois si et si les conditions sont les mêmes. Je ne comprends pas vraiment ce que vous allez faire là comme une réflexion. Pouvez-vous fournir plus d'informations à ce sujet?

C'est comme ça que si tout le reste échoue si on le cherche et s'il échoue aussi, il passera à autre chose. Corrigez-moi si c'est faux. Pour vous les deux conditions sont les mêmes.

if (! 0) == true et si (0 == 0) == true

et ici à la fois la condition pour le joueur est également identique à celui décrit par la détection de l'eau.

Dans les jeux, je me sens mieux d'utiliser strcmpi() au lieu de strcmp(), mais cela ne vous donnera pas de solution ici où les deux conditions sont les mêmes.