我正在尝试编写一些代码来检测特定图像并播放声音。在我的源代码中,我使用 ImageGetName 来获取图像本身的名称。
ImageGetName如下:
const char *ImageGetName(const image_c *image)
{
const image_c *rim;
rim = (const image_c *) image;
return rim->name;
}
在我的主函数中,我定义了这个:
const char *image = ImageGetName(mo->subsector->sector->floor.image);
它应该在调用时将 *image 指向 floor.image 并根据需要对它们进行排序。
现在,我要做的是使用
访问当前图像名称ImageGetName(mo->subsector->sector->floor.image).
所以要做到这一点,我假设我必须使用 strcmp。但也许我没有正确地做到这一点。有问题的 block :
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);
}
所以这里的问题是它完全忽略了第一个 strcmp if(!strcmp(image, "WATER")) 并直接转到第二个:else if(strcmp(image , "水") == 0)。它不应该那样做。在大多数情况下,它应该将第一部分评估为真实,除非玩家实际踩到 WATER 图像。
问题是玩家实际上并没有踩到标记为“WATER”的图像,而是玩家踩到的每一个图像都会产生第二个输出(检测到水!)。
我需要它来评估访问的图像 - 如果它没有找到它,“正常地板”,如果找到,“检测到水!”。
使用 !strcmp 应该假定它甚至不需要费心查看图像,而普通的 strcmp 应该评估被踩踏的图像。但这并没有发生。
我可以在这里得到一些帮助吗?非常感谢!
最佳答案
修复缩进,其中一个问题变得清晰:
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);
最后两行不是 else if
block 的一部分。您需要用花括号将您希望包含在 else if
block 中的语句括起来。
另一个问题是 !strcmp(image, "WATER")
和 strcmp(image, "WATER") == 0
做完全相同的事情 - 或者它们都是真的,或者它们都是假的。我不知道你想在那里做什么,但这不是它实际做的。
关于C++:strcmp 被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34447701/