我试着做一些代码来检测某个图像并播放声音。在我的源代码中,我使用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);它应该在调用时将*映像指向floor.image,并根据需要对它们进行排序。
现在,我要做的是使用
ImageGetName(mo->subsector->sector->floor.image). 为了做到这一点,我想我必须使用strcmp。但也许我做得不对。所涉区块:
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(图像,“水”)),然后右转到第二个:else if(strcmp(图像,“==”)== 0)。它不应该这样做。在大多数情况下,它应该评估第一部分是真实的,除非球员实际上踩水图像。
问题是,玩家实际上并不是踩到标记为“水”的图像,而是每一张图像都会产生第二个输出(检测到的水!)。
我需要它来评估被访问的图像--如果它找不到它,“普通地板”,如果它找到了,“探测到水!”
使用!strcmp应该假设它甚至不需要看图像,而普通的strcmp应该评估正在执行的图像。但这不会发生的。
我能在这里得到一些帮助吗?我真的很感激!
发布于 2015-12-24 05:28:18
修复您的缩进,您的一个问题变得清楚:
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块的一部分。您需要用大括号包围希望在else if块中的语句。
另一个问题是,!strcmp(image, "WATER")和strcmp(image, "WATER") == 0做的事情完全一样--要么是真的,要么是假的。我不知道你在那里想做什么,但这不是它的实际作用。
发布于 2015-12-24 05:39:35
1-在else if块周围缺少一对大括号
无论怎样,else if都不会执行。如果有匹配的,则strcmp 返回0,这相当于false。因此,如果有匹配,则if()内部的条件将计算为!0,计算结果为真。在if条件下,else if (condition)的计算结果为else if (0==0) which is also equal to true. Remove the!‘,应该是可以的。
发布于 2015-12-24 09:41:10
如果条件相同的话,我想这两种情况都是一样的。我真的不明白你要在那里做什么,因为答案之一反映了这一点。你能提供更多的投入吗?
就像如果失败,所有其他的,如果正在被查找,如果他们也失败,它将进入其他条件。如果错了就纠正我。对你们来说,两种情况是一样的。
if (!0) == true和if (0 == 0) == true
在这里,这两个条件的播放器也是相同的,由水的检测。
在游戏中,我感觉更好地使用strcmpi()而不是strcmp().However,这不会在两个条件相同的情况下给出解决方案。
https://stackoverflow.com/questions/34447701
复制相似问题