Я в некотором роде: скажем, я делаю простую, 2D, Zelda-подобную игру.Когда два Объекта сталкиваются, у каждого должно быть результирующее действие.Однако, когда главный герой сталкивается с чем-то, его реакция зависит исключительно от типа объекта, с которым он столкнулся.Если это монстр, он должен прийти в норму, если это стена, ничего не должно случиться, если это волшебная синяя коробка с лентами, он должен исцелить и т. Д. (Это всего лишь примеры).
Я должен такжеобратите внимание, что ОБА вещи являются частью столкновения, то есть события столкновения должны происходить как для персонажа, так и для монстра, а не только для одного или другого.
Как бы вы написали такой код?Я могу придумать несколько невероятных способов, например, иметь виртуальные функции в глобальном классе WorldObject, для идентификации атрибутов - например, функцию GetObjectType () (возвращает ints, char * s, все, что идентифицирует объект как Monster, Box или Wall), то в классах с большим количеством атрибутов, например, Monster, может быть больше виртуальных функций, например, GetSpecies ().
Однако это становится раздражающим в обслуживании и приводит к большому каскадному переключению(или If) в обработчике коллизий
MainCharacter::Handler(Object& obj)
{
switch(obj.GetType())
{
case MONSTER:
switch((*(Monster*)&obj)->GetSpecies())
{
case EVILSCARYDOG:
...
...
}
...
}
}
Существует также возможность использования файлов, и файлы будут иметь такие вещи, как:
Object=Monster
Species=EvilScaryDog
Subspecies=Boss
И затем код может получитьатрибуты без необходимости виртуальных функций, загромождающих все.Это не решает проблему каскадного If, однако.
И затем есть возможность иметь функцию для каждого случая, скажем, CollideWall (), CollideMonster (), CollideHealingThingy ().Лично это мой наименее любимый (хотя все они далеки от симпатии), потому что это кажется самым громоздким в обслуживании.
Может кто-нибудь подсказать более изящные решения этой проблемы?Спасибо за любую помощь!