main.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #include <QGuiApplication>
  2. #include <QQmlApplicationEngine>
  3. #include <QOpenGLContext>
  4. #include <QSurfaceFormat>
  5. #include <QDebug>
  6. #include <QDir>
  7. #include <QQuickWindow>
  8. #include "engine/core/world.h"
  9. #include "engine/core/component.h"
  10. #include "render/gl/renderer.h"
  11. #include "render/gl/camera.h"
  12. #include "game/systems/movement_system.h"
  13. #include "game/systems/combat_system.h"
  14. #include "game/systems/selection_system.h"
  15. class GameEngine : public QObject {
  16. Q_OBJECT
  17. public:
  18. GameEngine() {
  19. // Initialize core systems
  20. m_world = std::make_unique<Engine::Core::World>();
  21. m_renderer = std::make_unique<Render::GL::Renderer>();
  22. m_camera = std::make_unique<Render::GL::Camera>();
  23. // Add game systems
  24. m_world->addSystem(std::make_unique<Game::Systems::MovementSystem>());
  25. m_world->addSystem(std::make_unique<Game::Systems::CombatSystem>());
  26. m_world->addSystem(std::make_unique<Game::Systems::AISystem>());
  27. m_selectionSystem = std::make_unique<Game::Systems::SelectionSystem>();
  28. m_world->addSystem(std::make_unique<Game::Systems::SelectionSystem>());
  29. setupTestScene();
  30. }
  31. void initialize() {
  32. if (!m_renderer->initialize()) {
  33. qWarning() << "Failed to initialize renderer";
  34. return;
  35. }
  36. m_renderer->setCamera(m_camera.get());
  37. // Set up RTS camera view
  38. m_camera->setRTSView(QVector3D(0, 0, 0), 15.0f, 45.0f);
  39. m_camera->setPerspective(45.0f, 16.0f/9.0f, 0.1f, 1000.0f);
  40. m_initialized = true;
  41. qDebug() << "Game engine initialized successfully";
  42. }
  43. void ensureInitialized() {
  44. if (!m_initialized) {
  45. initialize();
  46. }
  47. }
  48. void update(float deltaTime) {
  49. if (m_world) {
  50. m_world->update(deltaTime);
  51. }
  52. }
  53. void render() {
  54. if (m_renderer && m_world && m_initialized) {
  55. m_renderer->beginFrame();
  56. m_renderer->renderWorld(m_world.get());
  57. m_renderer->endFrame();
  58. }
  59. }
  60. private:
  61. void setupTestScene() {
  62. // Create some test units
  63. for (int i = 0; i < 5; ++i) {
  64. auto entity = m_world->createEntity();
  65. // Add transform component
  66. auto transform = entity->addComponent<Engine::Core::TransformComponent>();
  67. transform->position.x = i * 2.0f;
  68. transform->position.y = 0.0f;
  69. transform->position.z = 0.0f;
  70. // Add renderable component
  71. auto renderable = entity->addComponent<Engine::Core::RenderableComponent>("", "");
  72. renderable->visible = true;
  73. // Add unit component
  74. auto unit = entity->addComponent<Engine::Core::UnitComponent>();
  75. unit->unitType = "warrior";
  76. unit->health = 100;
  77. unit->maxHealth = 100;
  78. unit->speed = 2.0f;
  79. // Add movement component
  80. entity->addComponent<Engine::Core::MovementComponent>();
  81. }
  82. qDebug() << "Test scene created with 5 units";
  83. }
  84. std::unique_ptr<Engine::Core::World> m_world;
  85. std::unique_ptr<Render::GL::Renderer> m_renderer;
  86. std::unique_ptr<Render::GL::Camera> m_camera;
  87. std::unique_ptr<Game::Systems::SelectionSystem> m_selectionSystem;
  88. bool m_initialized = false;
  89. };
  90. int main(int argc, char *argv[])
  91. {
  92. QGuiApplication app(argc, argv);
  93. // Set up OpenGL 3.3 Core Profile
  94. QSurfaceFormat format;
  95. format.setVersion(3, 3);
  96. format.setProfile(QSurfaceFormat::CoreProfile);
  97. format.setDepthBufferSize(24);
  98. format.setStencilBufferSize(8);
  99. format.setSamples(4); // 4x MSAA
  100. QSurfaceFormat::setDefaultFormat(format);
  101. // Set up QML engine
  102. QQmlApplicationEngine engine;
  103. // Register C++ types with QML if needed
  104. // qmlRegisterType<GameEngine>("StandardOfIron", 1, 0, "GameEngine");
  105. // Load QML from the compiled resource path (see generated :/StandardOfIron/ui/qml/*)
  106. engine.load(QUrl(QStringLiteral("qrc:/StandardOfIron/ui/qml/Main.qml")));
  107. if (engine.rootObjects().isEmpty()) {
  108. qWarning() << "Failed to load QML file";
  109. return -1;
  110. }
  111. qDebug() << "Application started successfully";
  112. qDebug() << "Assets directory:" << QDir::currentPath() + "/assets";
  113. // Get the QQuickWindow from the loaded QML
  114. QObject* rootObj = engine.rootObjects().first();
  115. QQuickWindow* window = qobject_cast<QQuickWindow*>(rootObj);
  116. if (!window) {
  117. // Try to find a QQuickWindow child
  118. window = rootObj->findChild<QQuickWindow*>();
  119. }
  120. auto gameEngine = new GameEngine();
  121. if (window) {
  122. // Per-frame update/render loop (context is current here)
  123. QObject::connect(window, &QQuickWindow::beforeRendering, gameEngine, [gameEngine]() {
  124. gameEngine->ensureInitialized();
  125. gameEngine->update(1.0f / 60.0f); // Fixed timestep for now
  126. gameEngine->render();
  127. }, Qt::DirectConnection);
  128. // In Qt 6, the default clear before rendering is handled by the scene graph; our renderer also clears per frame.
  129. } else {
  130. qWarning() << "No QQuickWindow found for OpenGL initialization.";
  131. }
  132. return app.exec();
  133. }
  134. #include "main.moc"