简洁的计算 #define 方法

Concise way to calculate #define

本文关键字:方法 #define 计算 简洁      更新时间:2023-10-16

我在生成的标头中有一组 #define,如下所示:

#define SFX_SOIL_DESTROY_1 2
#define SFX_SOIL_DESTROY_2 14
#define SFX_SOIL_PLACE_1 32
#define SFX_SOIL_PLACE_2 33
#define SFX_WOOD_DESTROY_1 5

我有一个方法,必须为材料类型和声音类型返回正确的定义。这是一个冗长而不简洁的解决方案:

int getSfx (MaterialType material, SoundType sound)
{
     switch (material)
     {
         case SOIL:
         {
             switch (sound)
             {
                 case DESTROY:
                     return rand()%2 ?  SFX_SOIL_DESTROY_1 : SFX_SOIL_DESTROY_2;
                 case PLACE:
                 // And so on

有没有某种宏观黑客可以压缩这一点?任何帮助将不胜感激。

将其存储为数据查找要快得多,并且只需要处理一次(设置时)。因此,假设材料和声音或多或少是从零开始的顺序(否则进行查找翻译):

int soundLut [MAX_MATERIAL][MAX_SOUND][2] = {
    {        // SOIL
        {SFX_SOIL_DESTROY_1, SFX_SOIL_DESTROY_2},  // destroy
        {SFX_SOIL_PLACE_1, SFX_SOIL_PLACE_2},      // Place
        // etc - if only one effect, put 2 values the same
    },
    {        // WOOD
        // and so on
    }        
};

然后:

int getSfx (MaterialType material, SoundType sound)
{
    return soundLut [material][sound][rand()%2];
}

也许您可以使用地图来实现此目的,其解决方案与@Mike非常相似(但可能更安全)。

void initialize()
{
    // This is your class member.
    // std::map< std::pair< MaterialType, SoundType >, std::pair< int, int > > sfxs;
    sfxs[ std::make_pair( SOIL, DESTROY ) ] = std::make_pair( SFX_SOIL_DESTROY_1, SFX_SOIL_DESTROY_2 );
    sfxs[ std::make_pair( SOIL, PLACE )   ] = std::make_pair( SFX_SOIL_PLACE_1,   SFX_SOIL_PLACE_2 );
    // ...
}
int getSfx( MaterialType aMaterial, SoundType aSound )
{
    const auto key = std::make_pair( aMaterial, aSound );
    if ( sfxs.find( key ) != sfxs.end() )
    {
        return ( rand() % 2 ) ? ( sfxs[ key ].first ) : ( sfxs[ key ].second );
    }
    return -1;
}