Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2019, 20:34   #1
Jebbyk
Новичок
Джуниор
 
Регистрация: 14.06.2019
Сообщений: 1
По умолчанию Массив содержащий компоненты игрового обьекта

как можно сделать чтоб внутри класса GameObject можно было хранить массив или список наследников класса Component (например TransfromComponent : public Component или Collider : public Component и т.д.)
У Component есть метод Update. соответственно я хочу чтоб GameObject который содержит набор экземпляров разных наследников Component мог вызывать их Update.
Как такое можно сделать?

В данный момент, если я придумываю новый компонент который можно было бы прицепить к GameObject мне приходится прописывать однотипные методы которые отличаются только типом компонента, а так же отдельные поля для хранения каждого типа компонента.

Короче выглядит это вот так, и что то мне подсказывает, что это лютая дичь
Код:
class GameObject{
****TransformComponent *transform;
****Body *body;
****Collider *collider;
****DrawComponent *draw;
****Spacecraft *spacecraft;
****ParticleController *particleController;
****ParticleSystem *particleSystem;
****BackgroundController *backgroundController;
****FireController *fireController;
****Button *button;
****TextWindow *textWindow;
****FireLight *fireLightController;
****WeaponLight *weaponLightController;
****ExplosionLight *explosionLightController;
****Asteroid *asteroidController;
****ExplosionController *explosionController;
****PlayerController *playerController;
****EngineParticleController *engineParticleController;
****Bullet *bulletController;
****Weapon *weaponController;
****bool destroy = false;
****String tag;
public:
****GameObject()
****{
**transform = NULL;
**body = NULL;
**collider = NULL;
**draw = NULL;
**spacecraft = NULL;
**particleSystem = NULL;
**particleController = NULL;
**backgroundController = NULL;
**fireController = NULL;
**button = NULL;
**textWindow = NULL;
**fireLightController = NULL;
**asteroidController = NULL;
**explosionController = NULL;
**playerController = NULL;
**bulletController = NULL;
**weaponController = NULL;
**weaponLightController = NULL;
**explosionLightController = NULL;
****}

****void SetTransform(TransformComponent *_trnasform)
****{
**transform = _trnasform;
**tag = transform->GetTag();
****}
****void SetDrawComponent(DrawComponent *_draw){draw = _draw;}
****void SetCollider(Collider *_collider){collider = _collider;}
****void SetBody(Body *_body){body = _body;}
****void SetSpacecraft(Spacecraft *_spacecraft){spacecraft = _spacecraft;}
****void SetParticleController(ParticleController *_particleController){particleController = _particleController;}
****void SetBackgroundController(BackgroundController *_backgroundController){backgroundController = _backgroundController;}
****void SetButtonController(Button *_button){button = _button;}
****void SetParticleSystem(ParticleSystem *_particleSystem){particleSystem = _particleSystem;}
****void SetFireController(FireController *_fireController){fireController = _fireController;}
****void SetTextWindowController(TextWindow *_textWindow){textWindow = _textWindow;}
****void SetFireLitghtController(FireLight *_fireLightController){fireLightController = _fireLightController;}
****void SetAteroidController(Asteroid *_asteriodController){asteroidController = _asteriodController;}
****void SetExplosionController(ExplosionController *_explosionController){explosionController = _explosionController;}
****void SetPlayerController(PlayerController *_playerController){playerController = _playerController;}
****void SetEngineParticleController(EngineParticleController *_engineParticleController){engineParticleController = _engineParticleController;}
****void SetBulletController(Bullet *_bulletController){bulletController = _bulletController;}
****void SetWeaponController(Weapon *_weapon) { weaponController = _weapon; }
****void SetWeaponLightController(WeaponLight *_weaponLight) { weaponLightController = _weaponLight; }
****void SetExplosionLightController(ExplosionLight *_explosionLight) { explosionLightController = _explosionLight; }

****TransformComponent* GetTransformComponent(){return transform;}
****DrawComponent* GetDrawComonent(){return draw;}
****Collider* GetCollider() {return collider;}
****Body *GetBody(){return body;}
****Spacecraft *GetSpacecraft(){return spacecraft;}
****ParticleController *GetParticleController(){return particleController;}
****BackgroundController *GetBackgroundController(){return backgroundController;}
****Button *GetButton() { return button; }
****TextWindow *GetTextWindow(){return textWindow;}
****FireLight *GetFireLightController(){return fireLightController;}
****Asteroid *GetAsteroidController(){return asteroidController;}
****ExplosionController *GetExplosionController(){return explosionController;}
****PlayerController *GetPlayerController(){return playerController;}
****EngineParticleController *GetEngineParticleController(){return engineParticleController;}
****bool GetDestroy(){return destroy;}
****ParticleSystem *GetParticleSystem(){return particleSystem;}
****FireController *GetFireController(){return fireController;}
****Bullet *GetBulletController(){return bulletController;}
****Weapon *GetWeaponController() { return weaponController; }
****WeaponLight *GetWeaponLightController() { return weaponLightController; }
****ExplosionLight *GetExplosionLightController() { return explosionLightController; }
****String *GetTag(){return &tag;}
****void Update(RenderWindow &window)
****{
**//printf("\n\n%s \n", transform->GetName().toAnsiString().c_str());
**if (backgroundController != NULL){backgroundController->Update();}
**if (textWindow != NULL){textWindow->Update(window);}
**if (button != NULL){button->Update(window);}
**if (body != NULL){body->Update();}
**if (spacecraft != NULL){spacecraft->Update();}
**if (particleSystem != NULL){particleSystem->Update();}
**if (particleController != NULL){particleController->Update();}
**if (fireController != NULL){fireController->Update();}
**if (fireLightController != NULL){fireLightController->Update();}
**if (asteroidController != NULL){asteroidController->Update();}
**if (explosionController != NULL){explosionController->Update();}
**if (playerController != NULL){playerController->Update();}
**if (engineParticleController != NULL){engineParticleController->Update();}
**if (bulletController != NULL){bulletController->Update();}
**if (weaponController != NULL) { weaponController->Update(); }
**if (weaponLightController != NULL) { weaponLightController->Update(); }
**if (explosionLightController != NULL) { explosionLightController->Update(); }
**if (draw != NULL){draw->Draw(window);}
****}

****void Destroy()
****{
**if (transform != NULL){transform->Destroy();}
**if (collider != NULL){collider->Destroy();}
**if (draw != NULL){draw->Destroy();}
**if (body != NULL){body->Destroy();}
**if (spacecraft != NULL){spacecraft->Destroy();}
**if (particleController != NULL){particleController->Destroy();}
**if (particleSystem != NULL){particleSystem->Destroy();}
**if (backgroundController != NULL) { backgroundController->Destroy(); }
**if (button != NULL){button->Destroy();}
**if (textWindow != NULL){textWindow->Destroy();}
**if (fireController != NULL){fireController->Destroy();}
**if (asteroidController != NULL){asteroidController->Destroy();}
**if (fireLightController != NULL){fireLightController->Destroy();}
**if (explosionController != NULL){explosionController->Destroy();}
**if (playerController != NULL){playerController->Destroy();}
**if (engineParticleController != NULL){engineParticleController->Destroy();}
**if (bulletController != NULL){bulletController->Destroy();}
**if (weaponController != NULL) { weaponController->Destroy(); }
**if (weaponLightController != NULL) { weaponLightController->Destroy(); }
**if (explosionLightController != NULL) { explosionLightController->Destroy(); }
**destroy = true;
****}
};
Jebbyk вне форума Ответить с цитированием
Старый 14.06.2019, 20:40   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Jebbyk Посмотреть сообщение
Как такое можно сделать?
Прочитайте про полиморфизм и виртуальные методы.
waleri вне форума Ответить с цитированием
Старый 30.06.2019, 08:07   #3
CppLinux345
Пользователь
 
Регистрация: 26.09.2018
Сообщений: 23
По умолчанию

Создавший массив указателей Component,и сделав Component АБК(абстрактным базовым классом)
CppLinux345 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
дан массив, содержащий сведения о книгах мама Паскаль, Turbo Pascal, PascalABC.NET 2 27.02.2013 21:46
имеется массив содержащий множество интервалов diamn3452 Общие вопросы C/C++ 1 19.03.2012 22:23
Массив, содержащий записи структуры Д@ш@ Помощь студентам 3 26.05.2011 20:26
Массив, содержащий записи структуры Д@ш@ Паскаль, Turbo Pascal, PascalABC.NET 0 29.04.2011 21:59
Занесеие параметров игрового обьекта в файл. Вадим Буренков Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 27.04.2009 17:53