понедельник, 22 декабря 2008 г.

Иерархия игровых объектов

Работаю над иерархией и общей структурой объектов. Сначала в движке планировал разбить иерархию объектов на два класса – сцена и игровой уровень. Предполагалось, что в сцене мы храним сами пулы простых объектов, а в классе уровня – глобальные ссылки на них и пулы сложных объектов, собирающие несколько ссылок на простые объекты. Кроме того, логически, уровнь будет содержать классы конкретной игры, а сцена – более общие классы.

Вот такая была схема:

class Scene 
{      
 Lights      
 Particles      
 Decals      
 SceneObjects 
}  
class GameObject 
{           
 LightsID           
 ParticlesID           
 DecalsID           
 SceneObjectsID  
}  
class GameLevel 
{           
 ParticlesType      
 DecalsType      
 ActorsType      
 StaticsType      
 DynamicsType        
 LightsID      
 ParticlesID      
 DecalsID       
 Actors:GameObject;      
 Static:GameObject;      
 Dynamic:GameObject;       
}

Однако, при ближайшем рассмотрении всё пошло пи… короче такая схемка не покатит. И вот почему. Во-первых, отсечение по ок-трии в целях оптимизации надо будет делать в  классе уровня, ибо отсечь один GameObject быстрее чем кучу SceneObjects, Particles и других его составляющих. Во-вторых, сомнительная радость размазывать хранение параметров для типов объекта по двум классам (например партиклы, декалы). В третьих же сериализация опять таки достаётся классу уровня.

Вот таким макаром класс Сцены становится всё худее и худее, а его значимость – всё меньше и меньше.

Вообщем волевым решением я всё перенёс в мега-класс GameScene:

class ageGameScene: public ageSingleton 
{    
 ageResourseManager  ActorsType;   
 ageResourseManager  DynObjectsType;   
 ageResourseManager  StatObjectsType;   
 ageResourseManager  StatParticlesType;   
 ageResourseManager  StatDecalsType;     
 ageCDynArray        SceneObjects;    
 ageCDynArray          Cameras;     
 ageCDynArray          Lights;    
 ageCDynArray          Decals;    
 ageCDynArray      Particles;     
 ageCDynArray          Actors;    
 ageCDynArray        DynObjects;    
 ageCDynArray        StatObjects;      

 //world objects   
 ageSimpleArray<int>      ActorsID;    
 ageSimpleArray<int>      DynObjectsID;    
 ageSimpleArray<int>      StatObjectsID;    
 ageSimpleArray<int>      LightsID;    
 ageSimpleArray<int>      ParticlesID;    
 ageSimpleArray<int>      DecalsID;    
 int               CameraID;  
};

Вот такой жирдяй-класс. В нём же практически вся игра будет :-D

----- 
К слову о проектировании. В голове эти все объекты у меня выглядят таким образом :-D 

Комментариев нет: