游戏世界是由很多个场景组成的,场景具有唯一性,所以要设计出一种唯一id去标记一个场景。假如一个具有副本概念的国战类游戏,它的每一个场景应该是由副本id+国家id+地图id构成。假设由高位到低位为副本id16位,国家id8位,地图id16位,则可以通过一个哈希函数或者宏定义出场景id:
#define sceneid_hash_func(copyid, countryid, mapid) \
(unsigned long)(((mapid)&0xffff) | (((countryid)&0xff) << 16) | ((((unsigned long)copyid)&0xffff) << 24))
同时根据sceneid又可以得到副本id,国家id和地图id:
#define copyid_from_sceneid_func(sceneid) (unsigned int) ((sceneid)&0xffff)
#define countryid_from_sceneid_func(sceneid) (unsigned int) (((sceneid)>>16)&0xff)
#define mapid_from_sceneid_func(sceneid) (unsigned int) (((sceneid)>>24)&0xffff)
因为副本是一种特殊的场景,常常会有判断一个场景是否是副本的情形,所以可以通过以下定义来判断一个场景是否为一个副本:
#define is_copymap_func(sceneid) (copyid_from_sceneid(sceneid) > 0)
对于副本来说,可以把副本id和地图id设置为相同的值,但是要注意的是副本id和地图id要进行区分,并不是一个东西。一般来说游戏里面的地图分为动态地图和静态地图,副本通常是动态地图由副本id,国家id,地图id生成,静态地图一般是场景服启动的时候就创建好的,由国家id和地图id组成,而副本id为0。