diff --git a/src/Client/CMakeLists.txt b/src/Client/CMakeLists.txt index d1cb810..ecee594 100644 --- a/src/Client/CMakeLists.txt +++ b/src/Client/CMakeLists.txt @@ -26,7 +26,7 @@ else() add_executable(${CURRENT_PROJECT} ${SOURCE_CPP}) endif() -target_link_libraries(${CURRENT_PROJECT} PUBLIC ${PROJECT_NAME}Core) +target_link_libraries(${CURRENT_PROJECT} PUBLIC ${PROJECT_NAME}Core TestLvl) target_include_directories(${CURRENT_PROJECT} PUBLIC ${PUBLIC_INCUDE_DIR}) target_include_directories(${CURRENT_PROJECT} PRIVATE ${PRIVATE_INCUDE_DIR}) diff --git a/src/Client/main.cpp b/src/Client/main.cpp index 729e975..ce1d549 100644 --- a/src/Client/main.cpp +++ b/src/Client/main.cpp @@ -9,6 +9,7 @@ #include #include #include +#include int main(int argc, char *argv[]) @@ -21,9 +22,10 @@ int main(int argc, char *argv[]) QQmlApplicationEngine engine; ClientApp client; + client.registerLevel(); + if (!client.init(&engine)) { return 1; } - return app.exec(); } diff --git a/src/Core/Crawl/clientapp.cpp b/src/Core/Crawl/clientapp.cpp index 7ebf448..282ce03 100644 --- a/src/Core/Crawl/clientapp.cpp +++ b/src/Core/Crawl/clientapp.cpp @@ -67,25 +67,6 @@ void ClientApp::initLang() { } } -void ClientApp::initLvls() { - auto plugins = availablePlugins(); - QList _availableWorlds; - for (const auto& lvl: plugins) { - WordlData data; - IWorld* pluginData = PluginLoader::load(lvl.absoluteFilePath()); - - if (pluginData) { - - data.model = pluginData; - data.viewModel = new WorldViewData(data.model); - _availableWorlds.push_back(data.viewModel); - _availableLvls.insert(data.model->name(), data); - } - } - - _menu->setAvailableLvls(_availableWorlds); -} - IWorld *ClientApp::getLastWorld() { for (const auto &data : qAsConst(_availableLvls)) { if (data.viewModel && data.viewModel->unlocked()) { @@ -115,23 +96,6 @@ void ClientApp::start(const QString &lvl) { _engine->start(); } -QList ClientApp::availablePlugins() const { - QDir dir(QCoreApplication::applicationDirPath() + "/modules"); - auto list = dir.entryInfoList(QStringList() << "*.so" << "*.dll", QDir::Files); -#ifdef Q_OS_ANDROID - dir.setPath(QCoreApplication::applicationDirPath()); - list += dir.entryInfoList(registeredLvls(), QDir::Files); -#endif - - return list; -} - -QList ClientApp::registeredLvls() const { - return { - "*TestLvl.*" - }; -} - bool ClientApp::init(QQmlApplicationEngine *engine) { qputenv("QT_QUICK_CONTROLS_MATERIAL_THEME", initTheme()); @@ -155,7 +119,6 @@ bool ClientApp::init(QQmlApplicationEngine *engine) { initCrawlResources(); initLang(); - initLvls(); engine->addImportPath(":/CrawlModule/"); @@ -177,3 +140,12 @@ bool ClientApp::init(QQmlApplicationEngine *engine) { return true; } + +void ClientApp::addLvl(IWorld *levelWordl) { + WordlData data; + + data.model = levelWordl; + data.viewModel = new WorldViewData(data.model); + _availableLvls.insert(data.model->name(), data); + _menu->addWorldViewModel(data.viewModel); +} diff --git a/src/Core/Crawl/clientapp.h b/src/Core/Crawl/clientapp.h index cdc80e0..f6df3c1 100644 --- a/src/Core/Crawl/clientapp.h +++ b/src/Core/Crawl/clientapp.h @@ -12,6 +12,7 @@ #include #include #include "global.h" +#include "ilevel.h" class Engine; class IWorld; @@ -49,30 +50,36 @@ public: */ bool init(QQmlApplicationEngine* engine); + template + + /** + * @brief registerLevel This method register new levels in game. + */ + void registerLevel() { + + static_assert(std::is_base_of_v, + "Plrease use the child classes of the ILevel interface for tegistering new levels in the crawl game."); + + addLvl(LevelType().world()); + } + private: QByteArray initTheme(); void initLang(); - void initLvls(); IWorld* getLastWorld(); + /** + * @brief addLvl This method should be add level to game. + * @param levelWordl This is world instance + */ + void addLvl(IWorld* levelWordl); + /** * @brief start This method star new game in @a lvl * @param lvl This is lvl name */ void start(const QString& lvl); - /** - * @brief availablePlugins This method read all available plugins. - * @return list of the available plugins. - */ - QList availablePlugins() const; - - /** - * @brief registeredLvls This method should be return names of the lvl plugins. This method prepare data for loading plugins on android platform. - * @return list of the plugins names. - */ - QList registeredLvls() const; - QHash _availableLvls; MainMenuModel *_menu = nullptr; Engine *_engine = nullptr; diff --git a/src/Core/Crawl/ilevel.cpp b/src/Core/Crawl/ilevel.cpp new file mode 100644 index 0000000..33bb3c3 --- /dev/null +++ b/src/Core/Crawl/ilevel.cpp @@ -0,0 +1,8 @@ +//# +//# Copyright (C) 2021-2021 QuasarApp. +//# Distributed under the GPLv3 software license, see the accompanying +//# Everyone is permitted to copy and distribute verbatim copies +//# of this license document, but changing it is not allowed. +//# + +#include "ilevel.h" diff --git a/src/Core/Crawl/ilevel.h b/src/Core/Crawl/ilevel.h new file mode 100644 index 0000000..f9b1dc5 --- /dev/null +++ b/src/Core/Crawl/ilevel.h @@ -0,0 +1,30 @@ +//# +//# Copyright (C) 2021-2021 QuasarApp. +//# Distributed under the GPLv3 software license, see the accompanying +//# Everyone is permitted to copy and distribute verbatim copies +//# of this license document, but changing it is not allowed. +//# + +#ifndef LEVEL_H +#define LEVEL_H + +class IWorld; + +/** + * @brief The ILevel class This interface make the world instance object. + * All levels libraries should be override this interface. + */ +class ILevel +{ +public: + ILevel() = default; + virtual ~ILevel() = default; + + /** + * @brief world This method should be return pointer to the level world. + * @return pointer to the level world. + */ + virtual IWorld* world() = 0; +}; + +#endif // LEVEL_H diff --git a/src/Core/private/mainmenumodel.cpp b/src/Core/private/mainmenumodel.cpp index cb8333b..5b01103 100644 --- a/src/Core/private/mainmenumodel.cpp +++ b/src/Core/private/mainmenumodel.cpp @@ -27,6 +27,10 @@ QObject *MainMenuModel::availableLvlsModel() const { return _availableLvlsModel; } +void MainMenuModel::addWorldViewModel(QObject * data) { + _availableLvlsModel->addSource(data); +} + void MainMenuModel::setAvailableLvls(const QList &newData) { _availableLvlsModel->setSource(newData); } diff --git a/src/Core/private/mainmenumodel.h b/src/Core/private/mainmenumodel.h index 5f0f75f..6f7a27d 100644 --- a/src/Core/private/mainmenumodel.h +++ b/src/Core/private/mainmenumodel.h @@ -32,6 +32,7 @@ public: MainMenuModel(QObject *ptr = nullptr); QObject* userSettingsModel() const; QObject* availableLvlsModel() const; + void addWorldViewModel(QObject *); void setAvailableLvls(const QList &newData); Q_INVOKABLE void newGame(const QString& lvl); diff --git a/src/CrawlTestLvl/CMakeLists.txt b/src/CrawlTestLvl/CMakeLists.txt index cde3dc5..bc6350f 100644 --- a/src/CrawlTestLvl/CMakeLists.txt +++ b/src/CrawlTestLvl/CMakeLists.txt @@ -15,13 +15,12 @@ file(GLOB SOURCE_CPP "private/*.cpp" "*.qrc" "private/*.qrc" + "CrawlTestLvlAssets/*.qrc" ) set(PUBLIC_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") set(PRIVATE_INCUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/private") -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ../Client/modules) - add_library(${CURRENT_PROJECT} ${SOURCE_CPP}) target_link_libraries(${CURRENT_PROJECT} PUBLIC ${PROJECT_NAME}Core) diff --git a/src/CrawlTestLvl/CrawlTestLvlAssets b/src/CrawlTestLvl/CrawlTestLvlAssets index 5ebf63b..c213ef5 160000 --- a/src/CrawlTestLvl/CrawlTestLvlAssets +++ b/src/CrawlTestLvl/CrawlTestLvlAssets @@ -1 +1 @@ -Subproject commit 5ebf63b94d5f1ed15edddfb0a69080340e8a6e11 +Subproject commit c213ef504c8dd5b4c658504fbb506342bc9cf307 diff --git a/src/CrawlTestLvl/Empty.qrc b/src/CrawlTestLvl/Empty.qrc index 24eef69..f0ac648 100644 --- a/src/CrawlTestLvl/Empty.qrc +++ b/src/CrawlTestLvl/Empty.qrc @@ -1,11 +1,4 @@ - - res/meshes/cube.mesh - - - res/hdr/testHDR.jpg - res/hdr/testHDR.hdr - TestControl.qml diff --git a/src/CrawlTestLvl/private/box.cpp b/src/CrawlTestLvl/private/box.cpp index 61d1cd0..cfc5a9a 100644 --- a/src/CrawlTestLvl/private/box.cpp +++ b/src/CrawlTestLvl/private/box.cpp @@ -11,7 +11,7 @@ Box::Box(): IWorldItem("Box") { - setMash("qrc:/mesh/res/meshes/cube.mesh"); + setMash("qrc:/mesh/meshes/cube.mesh"); setSize({2,2,2}); setColor(QColor::fromRgb(rand()).name()); diff --git a/src/CrawlTestLvl/private/plate.cpp b/src/CrawlTestLvl/private/plate.cpp index c75a917..95dc81c 100644 --- a/src/CrawlTestLvl/private/plate.cpp +++ b/src/CrawlTestLvl/private/plate.cpp @@ -9,7 +9,7 @@ Plate::Plate(): IGround("plate") { - setMash("qrc:/mesh/res/meshes/cube.mesh"); + setMash("qrc:/mesh/meshes/cube.mesh"); setSize({100,100,0}); setZ(0); } diff --git a/src/CrawlTestLvl/private/testsnake.cpp b/src/CrawlTestLvl/private/testsnake.cpp index d11abb2..55159fa 100644 --- a/src/CrawlTestLvl/private/testsnake.cpp +++ b/src/CrawlTestLvl/private/testsnake.cpp @@ -12,7 +12,7 @@ TestSnake::TestSnake(): Snake("Snake") { setBreakingForce(50); setAngularVelocity(100); setColor("#90faaa"); - setMash("qrc:/mesh/res/meshes/cube.mesh"); + setMash("qrc:/mesh/meshes/cube.mesh"); setSize({2,1,1}); registerBodyitem(); diff --git a/src/CrawlTestLvl/private/testsnakeitem.cpp b/src/CrawlTestLvl/private/testsnakeitem.cpp index 37613bb..0c66b64 100644 --- a/src/CrawlTestLvl/private/testsnakeitem.cpp +++ b/src/CrawlTestLvl/private/testsnakeitem.cpp @@ -9,7 +9,7 @@ #include "testsnakeitem.h" TestSnakeItem::TestSnakeItem() { - setMash("qrc:/mesh/res/meshes/cube.mesh"); + setMash("qrc:/mesh/meshes/cube.mesh"); setColor("#20aa9a"); setSize({1,1,1}); diff --git a/src/CrawlTestLvl/private/world.cpp b/src/CrawlTestLvl/private/world.cpp index aa89954..29f0a58 100644 --- a/src/CrawlTestLvl/private/world.cpp +++ b/src/CrawlTestLvl/private/world.cpp @@ -24,7 +24,7 @@ WorldRule *World::initWorldRules() { } QString World::initHdrBackGround() const { - return "qrc:/hdr/res/hdr/testHDR.hdr"; + return "qrc:/hdr/hdr/testHDR.hdr"; } QString World::description() const { @@ -32,7 +32,7 @@ QString World::description() const { } QString World::imagePreview() const { - return "qrc:/hdr/res/hdr/testHDR.jpg"; + return "qrc:/hdr/hdr/testHDR.jpg"; } QString World::name() const { diff --git a/src/CrawlTestLvl/empty.cpp b/src/CrawlTestLvl/testlvl.cpp similarity index 67% rename from src/CrawlTestLvl/empty.cpp rename to src/CrawlTestLvl/testlvl.cpp index 4fb13cf..b4afb85 100644 --- a/src/CrawlTestLvl/empty.cpp +++ b/src/CrawlTestLvl/testlvl.cpp @@ -5,12 +5,14 @@ //# of this license document, but changing it is not allowed. //# -#include "Crawl/iworld.h" +#include "testlvl.h" #include "world.h" -inline void initResources() { Q_INIT_RESOURCE(Empty); } +TestLvl::TestLvl() { -extern "C" IWorld* worldInstance() { - initResources(); +} + +IWorld *TestLvl::world() { + initTestLvlResources(); return new World(); } diff --git a/src/CrawlTestLvl/testlvl.h b/src/CrawlTestLvl/testlvl.h new file mode 100644 index 0000000..80dd6af --- /dev/null +++ b/src/CrawlTestLvl/testlvl.h @@ -0,0 +1,30 @@ +//# +//# Copyright (C) 2021-2021 QuasarApp. +//# Distributed under the GPLv3 software license, see the accompanying +//# Everyone is permitted to copy and distribute verbatim copies +//# of this license document, but changing it is not allowed. +//# + + +#ifndef TESTLVL_H +#define TESTLVL_H + +#include +#include + +inline void initTestLvlResources() { Q_INIT_RESOURCE(Empty); + Q_INIT_RESOURCE(testLvl);} +/** + * @brief The TestLvl class This is test lvlv wraper of the crawl + */ +class TestLvl: public ILevel +{ +public: + TestLvl(); + + // ILevel interface +public: + IWorld *world() override; +}; + +#endif // TESTLVL_H diff --git a/tests/tstMain.cpp b/tests/tstMain.cpp index b38d014..fca3ef9 100644 --- a/tests/tstMain.cpp +++ b/tests/tstMain.cpp @@ -6,7 +6,6 @@ //# #include -#include "pluginloadertest.h" #include "clasterstest.h" // Use This macros for initialize your own test classes. @@ -33,7 +32,6 @@ private slots: // BEGIN TESTS CASES - TestCase(exampleTest, PluginLoaderTest) TestCase(clastersTest, ClastersTest) // END TEST CASES diff --git a/tests/units/pluginloadertest.cpp b/tests/units/pluginloadertest.cpp deleted file mode 100644 index 5326e38..0000000 --- a/tests/units/pluginloadertest.cpp +++ /dev/null @@ -1,22 +0,0 @@ -//# -//# Copyright (C) 2020-2021 QuasarApp. -//# Distributed under the GPLv3 software license, see the accompanying -//# Everyone is permitted to copy and distribute verbatim copies -//# of this license document, but changing it is not allowed. -//# - - -#include "pluginloadertest.h" - - -PluginLoaderTest::PluginLoaderTest() { - -} - -PluginLoaderTest::~PluginLoaderTest() { - -} - -void PluginLoaderTest::test() { - QVERIFY(true); -} diff --git a/tests/units/pluginloadertest.h b/tests/units/pluginloadertest.h deleted file mode 100644 index 9f2d18a..0000000 --- a/tests/units/pluginloadertest.h +++ /dev/null @@ -1,27 +0,0 @@ -//# -//# Copyright (C) 2020-2021 QuasarApp. -//# Distributed under the GPLv3 software license, see the accompanying -//# Everyone is permitted to copy and distribute verbatim copies -//# of this license document, but changing it is not allowed. -//# - - - -#ifndef EXAMPLE_TEST_H -#define EXAMPLE_TEST_H -#include "test.h" -#include "testutils.h" - -#include - -class PluginLoaderTest: public Test, protected TestUtils -{ -public: - PluginLoaderTest(); - ~PluginLoaderTest(); - - void test(); - -}; - -#endif // EXAMPLE_TEST_H