mirror of
https://github.com/QuasarApp/Snake.git
synced 2025-05-12 09:29:45 +00:00
update core library
This commit is contained in:
parent
eb5d8cd796
commit
8979ba73ce
@ -39,10 +39,6 @@
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>MainMenu</name>
|
<name>MainMenu</name>
|
||||||
<message>
|
|
||||||
<source>Play game</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>My Settings</source>
|
<source>My Settings</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -51,6 +47,10 @@
|
|||||||
<source>Exit</source>
|
<source>Exit</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select level</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>PreviewControl</name>
|
<name>PreviewControl</name>
|
||||||
|
@ -39,10 +39,6 @@
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>MainMenu</name>
|
<name>MainMenu</name>
|
||||||
<message>
|
|
||||||
<source>Play game</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>My Settings</source>
|
<source>My Settings</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -51,6 +47,10 @@
|
|||||||
<source>Exit</source>
|
<source>Exit</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select level</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>PreviewControl</name>
|
<name>PreviewControl</name>
|
||||||
|
@ -39,10 +39,6 @@
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>MainMenu</name>
|
<name>MainMenu</name>
|
||||||
<message>
|
|
||||||
<source>Play game</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>My Settings</source>
|
<source>My Settings</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -51,6 +47,10 @@
|
|||||||
<source>Exit</source>
|
<source>Exit</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select level</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>PreviewControl</name>
|
<name>PreviewControl</name>
|
||||||
|
@ -39,10 +39,6 @@
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>MainMenu</name>
|
<name>MainMenu</name>
|
||||||
<message>
|
|
||||||
<source>Play game</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>My Settings</source>
|
<source>My Settings</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -51,6 +47,10 @@
|
|||||||
<source>Exit</source>
|
<source>Exit</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select level</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>PreviewControl</name>
|
<name>PreviewControl</name>
|
||||||
|
@ -39,10 +39,6 @@
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>MainMenu</name>
|
<name>MainMenu</name>
|
||||||
<message>
|
|
||||||
<source>Play game</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>My Settings</source>
|
<source>My Settings</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -51,6 +47,10 @@
|
|||||||
<source>Exit</source>
|
<source>Exit</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select level</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>PreviewControl</name>
|
<name>PreviewControl</name>
|
||||||
|
@ -39,10 +39,6 @@
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>MainMenu</name>
|
<name>MainMenu</name>
|
||||||
<message>
|
|
||||||
<source>Play game</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>My Settings</source>
|
<source>My Settings</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -51,6 +47,10 @@
|
|||||||
<source>Exit</source>
|
<source>Exit</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select level</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>PreviewControl</name>
|
<name>PreviewControl</name>
|
||||||
|
@ -39,10 +39,6 @@
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>MainMenu</name>
|
<name>MainMenu</name>
|
||||||
<message>
|
|
||||||
<source>Play game</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>My Settings</source>
|
<source>My Settings</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -51,6 +47,10 @@
|
|||||||
<source>Exit</source>
|
<source>Exit</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select level</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>PreviewControl</name>
|
<name>PreviewControl</name>
|
||||||
|
@ -39,10 +39,6 @@
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>MainMenu</name>
|
<name>MainMenu</name>
|
||||||
<message>
|
|
||||||
<source>Play game</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>My Settings</source>
|
<source>My Settings</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -51,6 +47,10 @@
|
|||||||
<source>Exit</source>
|
<source>Exit</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select level</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>PreviewControl</name>
|
<name>PreviewControl</name>
|
||||||
|
@ -39,10 +39,6 @@
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>MainMenu</name>
|
<name>MainMenu</name>
|
||||||
<message>
|
|
||||||
<source>Play game</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>My Settings</source>
|
<source>My Settings</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -51,6 +47,10 @@
|
|||||||
<source>Exit</source>
|
<source>Exit</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select level</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>PreviewControl</name>
|
<name>PreviewControl</name>
|
||||||
|
@ -39,10 +39,6 @@
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>MainMenu</name>
|
<name>MainMenu</name>
|
||||||
<message>
|
|
||||||
<source>Play game</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>My Settings</source>
|
<source>My Settings</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -51,6 +47,10 @@
|
|||||||
<source>Exit</source>
|
<source>Exit</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select level</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>PreviewControl</name>
|
<name>PreviewControl</name>
|
||||||
|
@ -24,7 +24,6 @@
|
|||||||
<file>CrawlCoreAssets/particles/smokeSprite.png</file>
|
<file>CrawlCoreAssets/particles/smokeSprite.png</file>
|
||||||
<file>CrawlModule/particles/Fire.qml</file>
|
<file>CrawlModule/particles/Fire.qml</file>
|
||||||
<file>CrawlModule/particles/Wint.qml</file>
|
<file>CrawlModule/particles/Wint.qml</file>
|
||||||
<file>CrawlModule/PreviewScane.qml</file>
|
|
||||||
<file>CrawlModule/PreviewControl.qml</file>
|
<file>CrawlModule/PreviewControl.qml</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "pluginloader.h"
|
#include "pluginloader.h"
|
||||||
#include <viewsolutions.h>
|
#include <viewsolutions.h>
|
||||||
#include "worldstatus.h"
|
#include "worldstatus.h"
|
||||||
|
#include "user.h"
|
||||||
|
|
||||||
namespace CRAWL {
|
namespace CRAWL {
|
||||||
|
|
||||||
@ -36,18 +37,27 @@ QByteArray ClientApp::initTheme() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ILevel *ClientApp::getLastLevel() {
|
||||||
|
for (const auto &data : qAsConst(_availableLvls)) {
|
||||||
|
if (data.model && data.model->world() && _engine->currentUser() &&
|
||||||
|
_engine->currentUser()->isUnlocked(data.model->world()->itemId())) {
|
||||||
|
return data.model;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
ClientApp::ClientApp() {
|
ClientApp::ClientApp() {
|
||||||
_engine = new Engine();
|
_engine = new Engine();
|
||||||
_menu = new MainMenuModel();
|
_menu = new MainMenuModel();
|
||||||
_store = new Store();
|
|
||||||
|
|
||||||
connect(_menu, &MainMenuModel::sigNewGame, this, &ClientApp::start);
|
connect(_menu, &MainMenuModel::sigLevelChanged, this, &ClientApp::changeLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
ClientApp::~ClientApp() {
|
ClientApp::~ClientApp() {
|
||||||
delete _menu;
|
delete _menu;
|
||||||
delete _engine;
|
delete _engine;
|
||||||
delete _store;
|
|
||||||
|
|
||||||
for (auto it = _availableLvls.begin(); it != _availableLvls.end(); ++it) {
|
for (auto it = _availableLvls.begin(); it != _availableLvls.end(); ++it) {
|
||||||
delete it.value().viewModel;
|
delete it.value().viewModel;
|
||||||
@ -57,26 +67,17 @@ ClientApp::~ClientApp() {
|
|||||||
_availableLvls.clear();
|
_availableLvls.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
IWorld *ClientApp::getLastWorld() {
|
|
||||||
for (const auto &data : qAsConst(_availableLvls)) {
|
|
||||||
if (data.viewModel && data.viewModel->unlocked()) {
|
|
||||||
return data.model;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClientApp::initStore(Store *store) {
|
void ClientApp::initStore(Store *store) {
|
||||||
QMultiHash<int, const IItem *> storeItems;
|
QMultiHash<int, const IItem *> storeItems;
|
||||||
for (const auto &data : qAsConst(_availableLvls)) {
|
for (const auto &data : qAsConst(_availableLvls)) {
|
||||||
storeItems.unite(data.model->childItemsRecursive());
|
if (data.model && data.model->world())
|
||||||
|
storeItems.unite(data.model->world()->childItemsRecursive());
|
||||||
}
|
}
|
||||||
|
|
||||||
store->init(storeItems);
|
store->init(storeItems);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientApp::start(const QString &lvl) {
|
void ClientApp::changeLevel(int lvl) {
|
||||||
WordlData data = _availableLvls.value(lvl);
|
WordlData data = _availableLvls.value(lvl);
|
||||||
|
|
||||||
if (!data.model) {
|
if (!data.model) {
|
||||||
@ -91,8 +92,7 @@ void ClientApp::start(const QString &lvl) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_engine->setWorld(data.model);
|
_engine->setLevel(data.model);
|
||||||
_engine->start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClientApp::init(QQmlApplicationEngine *engine) {
|
bool ClientApp::init(QQmlApplicationEngine *engine) {
|
||||||
@ -133,19 +133,19 @@ bool ClientApp::init(QQmlApplicationEngine *engine) {
|
|||||||
if (engine->rootObjects().isEmpty())
|
if (engine->rootObjects().isEmpty())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
_engine->setWorld(getLastWorld());
|
_engine->setLevel(getLastLevel());
|
||||||
_engine->setQmlEngine(engine);
|
_engine->setQmlEngine(engine);
|
||||||
initStore(_store);
|
initStore(_engine->store());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientApp::addLvl(IWorld *levelWordl) {
|
void ClientApp::addLvl(ILevel *levelWordl) {
|
||||||
WordlData data;
|
WordlData data;
|
||||||
|
|
||||||
data.model = levelWordl;
|
data.model = levelWordl;
|
||||||
data.viewModel = new WorldViewData(data.model);
|
data.viewModel = new WorldViewData(data.model->world());
|
||||||
_availableLvls.insert(data.model->itemName(), data);
|
_availableLvls.insert(data.model->world()->itemId(), data);
|
||||||
_menu->addWorldViewModel(data.viewModel);
|
_menu->addWorldViewModel(data.viewModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,7 +27,6 @@ class MainMenuModel;
|
|||||||
class IControl;
|
class IControl;
|
||||||
class Store;
|
class Store;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The WordlData struct simple structure that contains information about world.
|
* @brief The WordlData struct simple structure that contains information about world.
|
||||||
*/
|
*/
|
||||||
@ -68,25 +67,25 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
QByteArray initTheme();
|
QByteArray initTheme();
|
||||||
IWorld* getLastWorld();
|
ILevel *getLastLevel();
|
||||||
|
|
||||||
void initStore(Store* store);
|
void initStore(Store* store);
|
||||||
/**
|
/**
|
||||||
* @brief addLvl This method should be add level to game.
|
* @brief addLvl This method should be add level to game.
|
||||||
* @param levelWordl This is world instance
|
* @param levelWordl This is world instance
|
||||||
*/
|
*/
|
||||||
void addLvl(IWorld* levelWordl);
|
void addLvl(ILevel* levelWordl);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief start This method star new game in @a lvl
|
* @brief changeLevel This method star new game in @a lvl
|
||||||
* @param lvl This is lvl name
|
* @param lvl This is lvl name
|
||||||
*/
|
*/
|
||||||
void start(const QString& lvl);
|
void changeLevel(int lvl);
|
||||||
|
|
||||||
QHash<QString, WordlData> _availableLvls;
|
QHash<int, WordlData> _availableLvls;
|
||||||
MainMenuModel *_menu = nullptr;
|
MainMenuModel *_menu = nullptr;
|
||||||
Engine *_engine = nullptr;
|
Engine *_engine = nullptr;
|
||||||
Store *_store = nullptr;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#include "iitem.h"
|
#include "iitem.h"
|
||||||
#include "ilevel.h"
|
#include "ilevel.h"
|
||||||
#include "iworld.h"
|
#include "ipreviewscaneworld.h"
|
||||||
|
|
||||||
namespace CRAWL {
|
namespace CRAWL {
|
||||||
|
|
||||||
@ -20,7 +20,7 @@ IWorld *ILevel::world() {
|
|||||||
return _world;
|
return _world;
|
||||||
}
|
}
|
||||||
|
|
||||||
IWorld *ILevel::previewScane() {
|
IPreviewScaneWorld *ILevel::previewScane() {
|
||||||
return _previewScane;
|
return _previewScane;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ void ILevel::setWorld(IWorld *newWorld) {
|
|||||||
_world = newWorld;
|
_world = newWorld;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ILevel::setPreviewScane(IWorld *newPreviewScane) {
|
void ILevel::setPreviewScane(IPreviewScaneWorld *newPreviewScane) {
|
||||||
_previewScane = newPreviewScane;
|
_previewScane = newPreviewScane;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ namespace CRAWL {
|
|||||||
|
|
||||||
class IWorld;
|
class IWorld;
|
||||||
class IItem;
|
class IItem;
|
||||||
|
class IPreviewScaneWorld;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The ILevel class This interface make the world instance object.
|
* @brief The ILevel class This interface make the world instance object.
|
||||||
@ -39,7 +40,7 @@ public:
|
|||||||
* @return pointer to the model of the preview scane.
|
* @return pointer to the model of the preview scane.
|
||||||
* @see ILevel::setPreviewScane
|
* @see ILevel::setPreviewScane
|
||||||
*/
|
*/
|
||||||
IWorld* previewScane();
|
IPreviewScaneWorld* previewScane();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief reset This method unload all loaded data from level.
|
* @brief reset This method unload all loaded data from level.
|
||||||
@ -61,12 +62,12 @@ protected:
|
|||||||
* @note The @a newPreviewScane item will be distroued with the parent object.
|
* @note The @a newPreviewScane item will be distroued with the parent object.
|
||||||
* @see ILevel::previewScane
|
* @see ILevel::previewScane
|
||||||
*/
|
*/
|
||||||
void setPreviewScane(IWorld *newPreviewScane);
|
void setPreviewScane(IPreviewScaneWorld *newPreviewScane);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
IWorld* _world = nullptr;
|
IWorld* _world = nullptr;
|
||||||
IWorld* _previewScane = nullptr;
|
IPreviewScaneWorld* _previewScane = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -89,6 +89,10 @@ void IPreviewScaneWorld::handleSelect(int item, bool isSelected) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const StartData &IPreviewScaneWorld::configuration() const {
|
||||||
|
return _configuration;
|
||||||
|
}
|
||||||
|
|
||||||
void IPreviewScaneWorld::initControl(IControl *control) {
|
void IPreviewScaneWorld::initControl(IControl *control) {
|
||||||
auto controlObject = dynamic_cast<PreviewControl*>(control);
|
auto controlObject = dynamic_cast<PreviewControl*>(control);
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ namespace CRAWL {
|
|||||||
*/
|
*/
|
||||||
class CRAWL_EXPORT IPreviewScaneWorld: public IWorld
|
class CRAWL_EXPORT IPreviewScaneWorld: public IWorld
|
||||||
{
|
{
|
||||||
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* @brief IPreviewScaneWorld This is main constructo of the preview world model.
|
* @brief IPreviewScaneWorld This is main constructo of the preview world model.
|
||||||
@ -38,6 +39,8 @@ public:
|
|||||||
bool start(const StartData &config) override;
|
bool start(const StartData &config) override;
|
||||||
bool stop() override;
|
bool stop() override;
|
||||||
|
|
||||||
|
const StartData &configuration() const;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
/**
|
/**
|
||||||
* @brief sigPrepareIsFinished This signal emited when user finished prepare to game.
|
* @brief sigPrepareIsFinished This signal emited when user finished prepare to game.
|
||||||
|
@ -67,6 +67,10 @@ void IWorld::render(unsigned int tbfMsec) {
|
|||||||
_ItemsMutex.unlock();
|
_ItemsMutex.unlock();
|
||||||
|
|
||||||
for (int id: toRemove) {
|
for (int id: toRemove) {
|
||||||
|
if (id == static_cast<IWorldItem *>(player())->guiId()) {
|
||||||
|
playerIsDead(static_cast<PlayableObject*>(player()));
|
||||||
|
}
|
||||||
|
|
||||||
removeItem(id);
|
removeItem(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,6 +101,7 @@ bool IWorld::start(const StartData& config) {
|
|||||||
setTargetFps(60);
|
setTargetFps(60);
|
||||||
setRunning(true);
|
setRunning(true);
|
||||||
_eventServer->start();
|
_eventServer->start();
|
||||||
|
setVisible(true);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -134,6 +139,7 @@ IWorldItem *IWorld::generate(const QString &objectType) const {
|
|||||||
|
|
||||||
bool IWorld::stop() {
|
bool IWorld::stop() {
|
||||||
setRunning(false);
|
setRunning(false);
|
||||||
|
setVisible(false);
|
||||||
_eventServer->stop();
|
_eventServer->stop();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -149,7 +155,7 @@ IWorldItem *IWorld::getItem(int id) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void IWorld::clearItems() {
|
void IWorld::clearItems() {
|
||||||
stop();
|
IWorld::stop();
|
||||||
|
|
||||||
while (_items.cbegin() != _items.cend()) {
|
while (_items.cbegin() != _items.cend()) {
|
||||||
removeItem(*_items.cbegin());
|
removeItem(*_items.cbegin());
|
||||||
@ -307,6 +313,19 @@ const WorldRule *IWorld::worldRules() {
|
|||||||
return _worldRules;
|
return _worldRules;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IWorld::setVisible(bool visible) {
|
||||||
|
if (_visible == visible) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_visible = visible;
|
||||||
|
emit visibleChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void IWorld::playerIsDead(PlayableObject *) const {
|
||||||
|
emit sigGameFinished();
|
||||||
|
}
|
||||||
|
|
||||||
bool IWorld::running() const {
|
bool IWorld::running() const {
|
||||||
return _running;
|
return _running;
|
||||||
}
|
}
|
||||||
@ -390,7 +409,7 @@ void IWorld::setCameraReleativePosition(const QVector3D &newCameraReleativePosit
|
|||||||
}
|
}
|
||||||
|
|
||||||
void IWorld::handleStop() {
|
void IWorld::handleStop() {
|
||||||
runAsBackGround();
|
stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
const QVector3D &IWorld::cameraReleativePosition() const {
|
const QVector3D &IWorld::cameraReleativePosition() const {
|
||||||
@ -467,4 +486,9 @@ void IWorld::setMenu(QObject *newMenu) {
|
|||||||
emit menuChanged();
|
emit menuChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IWorld::visible() const
|
||||||
|
{
|
||||||
|
return _visible;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -71,8 +71,9 @@ class CRAWL_EXPORT IWorld : public QObject, public IRender, public IItem
|
|||||||
* @see IWorld::getMenu
|
* @see IWorld::getMenu
|
||||||
* @see IWorld::userInterface
|
* @see IWorld::userInterface
|
||||||
*/
|
*/
|
||||||
Q_PROPERTY(QObject * menu READ menu WRITE setMenu NOTIFY menuChanged)
|
Q_PROPERTY(QObject * menu READ getMenu WRITE setMenu NOTIFY menuChanged)
|
||||||
Q_PROPERTY(QString hdr READ hdr NOTIFY hdrChanged)
|
Q_PROPERTY(QString hdr READ hdr NOTIFY hdrChanged)
|
||||||
|
Q_PROPERTY(bool visible READ visible NOTIFY visibleChanged)
|
||||||
|
|
||||||
Q_PROPERTY(int worldStatus READ wordlStatus WRITE setWorldStatus NOTIFY worldStatusChanged)
|
Q_PROPERTY(int worldStatus READ wordlStatus WRITE setWorldStatus NOTIFY worldStatusChanged)
|
||||||
|
|
||||||
@ -248,12 +249,17 @@ public:
|
|||||||
*/
|
*/
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief visible This metohd retunr current value of the visible object.
|
||||||
|
* @return true if view is visible else false.
|
||||||
|
*/
|
||||||
|
bool visible() const;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
/**
|
/**
|
||||||
* @brief sigGameFinished This signal emit when game are finished
|
* @brief sigGameFinished This signal emit when game are finished
|
||||||
* @brief result This is player statistics after finished level,
|
|
||||||
*/
|
*/
|
||||||
void sigGameFinished(GameResult result);
|
void sigGameFinished() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief sigOBjctsListChanged This signal emited when lvel status are changed.
|
* @brief sigOBjctsListChanged This signal emited when lvel status are changed.
|
||||||
@ -304,6 +310,11 @@ signals:
|
|||||||
*/
|
*/
|
||||||
void menuChanged();
|
void menuChanged();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief visibleChanged This signal emited when visible of the view changed.
|
||||||
|
*/
|
||||||
|
void visibleChanged();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -420,6 +431,16 @@ protected:
|
|||||||
*/
|
*/
|
||||||
const WorldRule *worldRules();
|
const WorldRule *worldRules();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief setVisible This method sets visible propertye for the qml view.
|
||||||
|
* @param visible This is new value of a property
|
||||||
|
*/
|
||||||
|
void setVisible(bool visible);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief playerIsDead This method will be invoked when player object get signal dead.
|
||||||
|
*/
|
||||||
|
virtual void playerIsDead(PlayableObject*) const;
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
virtual void onIntersects(const IWorldItem * trigger, QList<const IWorldItem *> list);
|
virtual void onIntersects(const IWorldItem * trigger, QList<const IWorldItem *> list);
|
||||||
@ -524,6 +545,7 @@ private:
|
|||||||
|
|
||||||
int _targetFps = 60;
|
int _targetFps = 60;
|
||||||
bool _running = false;
|
bool _running = false;
|
||||||
|
bool _visible = true;
|
||||||
|
|
||||||
// testing
|
// testing
|
||||||
friend ClastersTest;
|
friend ClastersTest;
|
||||||
|
@ -18,11 +18,19 @@ ApplicationWindow {
|
|||||||
height: 720;
|
height: 720;
|
||||||
title: qsTr("Crawl");
|
title: qsTr("Crawl");
|
||||||
|
|
||||||
|
property var model: engine
|
||||||
|
|
||||||
Metrix {id: metrix}
|
Metrix {id: metrix}
|
||||||
|
|
||||||
Scene {
|
Scene {
|
||||||
id: scane;
|
id: scane;
|
||||||
model: engine;
|
model: (model)? model.world : null;
|
||||||
|
anchors.fill: parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
Scene {
|
||||||
|
id: nest;
|
||||||
|
model: (model)? model.world : null;
|
||||||
anchors.fill: parent;
|
anchors.fill: parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ Item {
|
|||||||
|
|
||||||
MainMenuButton {
|
MainMenuButton {
|
||||||
id: play
|
id: play
|
||||||
text: qsTr("Play game")
|
text: qsTr("Select level")
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
selectLvl.open()
|
selectLvl.open()
|
||||||
|
@ -1,135 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
import QtQuick3D
|
|
||||||
import QtQuick.Controls.Material
|
|
||||||
import QtQuick.Controls
|
|
||||||
import QtQuick.Layouts
|
|
||||||
import QtQuick3D.Particles3D
|
|
||||||
|
|
||||||
|
|
||||||
View3D {
|
|
||||||
id: scene;
|
|
||||||
|
|
||||||
property var model: null;
|
|
||||||
renderMode: View3D.Offscreen
|
|
||||||
|
|
||||||
PerspectiveCamera {
|
|
||||||
id: camera
|
|
||||||
position: Qt.vector3d(0,0, 100)
|
|
||||||
}
|
|
||||||
|
|
||||||
SceneEnvironment {
|
|
||||||
id: defautlBackground
|
|
||||||
backgroundMode: SceneEnvironment.Color
|
|
||||||
clearColor: "#777777"
|
|
||||||
}
|
|
||||||
|
|
||||||
environment: /*(privateRoot.world)? background:*/ defautlBackground
|
|
||||||
|
|
||||||
ParticleSystem3D {
|
|
||||||
id: privateRoot
|
|
||||||
property var arrayObjects: []
|
|
||||||
property var world: (model)? model.world: null
|
|
||||||
|
|
||||||
property var gameMenuModel: (model)? model.menu: null
|
|
||||||
property var player: (world)? world.player: null
|
|
||||||
property var releativeCameraPosition: (world)? world.cameraReleativePosition: null
|
|
||||||
|
|
||||||
function add (cppObjId) {
|
|
||||||
if (!model) {
|
|
||||||
console.log("create object fail")
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const objModel = model.getGameObject(cppObjId);
|
|
||||||
|
|
||||||
if (!objModel) {
|
|
||||||
console.log("object model not found");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var viewTemplate = objModel.viewTemplate;
|
|
||||||
|
|
||||||
var temp = Qt.createComponent(viewTemplate)
|
|
||||||
if (temp.status === Component.Ready) {
|
|
||||||
var obj = temp.createObject(privateRoot)
|
|
||||||
obj.model = objModel;
|
|
||||||
arrayObjects.push(obj)
|
|
||||||
} else {
|
|
||||||
console.log("wrong viewTemplate in model " + temp.errorString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function remove(id) {
|
|
||||||
if (typeof id !== "number" || id < 0) {
|
|
||||||
console.log("id not found");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = 0; i < arrayObjects.length; ++i) {
|
|
||||||
if (id === arrayObjects[i].guiId) {
|
|
||||||
arrayObjects[i].destroy();
|
|
||||||
arrayObjects.splice(i,1);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: privateRoot.world;
|
|
||||||
function onSigOBjctsListChanged(diff) {
|
|
||||||
if (!diff) {
|
|
||||||
console.log("diff not found");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let tempDifRem = [];
|
|
||||||
tempDifRem = diff.getRemoveIds();
|
|
||||||
let tempDifAdd = [];
|
|
||||||
tempDifAdd = diff.getAddedIds();
|
|
||||||
|
|
||||||
for (let i = 0; i < tempDifAdd.length; ++i) {
|
|
||||||
privateRoot.add(tempDifAdd[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let j = 0; j < tempDifRem.length; ++j) {
|
|
||||||
privateRoot.remove(tempDifRem[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: privateRoot;
|
|
||||||
|
|
||||||
function onGameMenuModelChanged() {
|
|
||||||
if (!privateRoot.gameMenuModel) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const comp = Qt.createComponent(privateRoot.gameMenuModel.view);
|
|
||||||
if (comp.status === Component.Ready) {
|
|
||||||
if (privateRoot.gameMenu) {
|
|
||||||
privateRoot.gameMenu.destroy()
|
|
||||||
}
|
|
||||||
|
|
||||||
privateRoot.gameMenu = comp.createObject(scene);
|
|
||||||
if (privateRoot.gameMenu === null) {
|
|
||||||
// Error Handling
|
|
||||||
console.log("Error creating object");
|
|
||||||
}
|
|
||||||
|
|
||||||
privateRoot.gameMenu.model = privateRoot.gameMenuModel;
|
|
||||||
|
|
||||||
} else if (comp.status === Component.Error) {
|
|
||||||
// Error Handling
|
|
||||||
console.log("Error loading component: " + privateRoot.gameMenuModel.view, comp.errorString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function onShowMenuChanged() {
|
|
||||||
if (privateRoot.gameMenu) {
|
|
||||||
privateRoot.gameMenu.visible = !showMenu
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -11,10 +11,12 @@ import engine.worldstatus
|
|||||||
View3D {
|
View3D {
|
||||||
id: scene;
|
id: scene;
|
||||||
|
|
||||||
property var model: null;
|
property var worldModel: null;
|
||||||
property alias showMenu: privateRoot.showMenu
|
property alias showMenu: privateRoot.showMenu
|
||||||
renderMode: View3D.Offscreen
|
renderMode: View3D.Offscreen
|
||||||
|
|
||||||
|
visible: worldModel && worldModel.visible
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
text: scane.renderStats.fps
|
text: scane.renderStats.fps
|
||||||
x: 200
|
x: 200
|
||||||
@ -44,18 +46,16 @@ View3D {
|
|||||||
ParticleSystem3D {
|
ParticleSystem3D {
|
||||||
id: privateRoot
|
id: privateRoot
|
||||||
property var arrayObjects: []
|
property var arrayObjects: []
|
||||||
property var world: (model)? model.world: null
|
|
||||||
|
|
||||||
property var gameMenuModel: (world)? world.menu: null
|
property var gameMenuModel: (worldModel)? worldModel.menu: null
|
||||||
property var player: (world)? world.player: null
|
property var player: (worldModel)? worldModel.player: null
|
||||||
property var releativeCameraPosition: (world)? world.cameraReleativePosition: null
|
property var releativeCameraPosition: (worldModel)? worldModel.cameraReleativePosition: null
|
||||||
property var progress: (model)? model.prepareLvlProgress: null
|
|
||||||
|
|
||||||
property var gameMenu: null
|
property var gameMenu: null
|
||||||
property bool showMenu: (world)? WorldStatus.Game !== world.worldStatus : false;
|
property bool showMenu: (worldModel)? WorldStatus.Game !== worldModel.worldStatus : false;
|
||||||
|
|
||||||
function add (cppObjId) {
|
function add (cppObjId) {
|
||||||
if (!model) {
|
if (!worldModel) {
|
||||||
console.log("create object fail")
|
console.log("create object fail")
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -95,7 +95,7 @@ View3D {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: privateRoot.world;
|
target: worldModel;
|
||||||
function onSigOBjctsListChanged(diff) {
|
function onSigOBjctsListChanged(diff) {
|
||||||
if (!diff) {
|
if (!diff) {
|
||||||
console.log("diff not found");
|
console.log("diff not found");
|
||||||
|
@ -9,9 +9,11 @@
|
|||||||
|
|
||||||
#include <QQmlComponent>
|
#include <QQmlComponent>
|
||||||
#include <Crawl/guiobject.h>
|
#include <Crawl/guiobject.h>
|
||||||
|
#include <Crawl/ipreviewscaneworld.h>
|
||||||
#include "Crawl/iworld.h"
|
#include "Crawl/iworld.h"
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
#include <quasarapp.h>
|
#include <quasarapp.h>
|
||||||
|
#include <storeviewmodel.h>
|
||||||
#include "Crawl/icontrol.h"
|
#include "Crawl/icontrol.h"
|
||||||
#include "QDateTime"
|
#include "QDateTime"
|
||||||
#include "QtConcurrent"
|
#include "QtConcurrent"
|
||||||
@ -20,10 +22,14 @@
|
|||||||
namespace CRAWL {
|
namespace CRAWL {
|
||||||
|
|
||||||
Engine::Engine(QObject *parent): QObject(parent) {
|
Engine::Engine(QObject *parent): QObject(parent) {
|
||||||
|
_store = new Store();
|
||||||
|
_storeView = new StoreViewModel;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Engine::~Engine() {
|
Engine::~Engine() {
|
||||||
stopRenderLoop();
|
stopRenderLoop();
|
||||||
|
delete _storeView;
|
||||||
}
|
}
|
||||||
|
|
||||||
QObject *Engine::scane() {
|
QObject *Engine::scane() {
|
||||||
@ -48,15 +54,19 @@ void Engine::setLevel(ILevel *world) {
|
|||||||
_currentLevel = world;
|
_currentLevel = world;
|
||||||
emit worldChanged();
|
emit worldChanged();
|
||||||
|
|
||||||
if (_currentLevel && _currentLevel->world() && !_currentLevel->world()->)) {
|
if (!_currentLevel) {
|
||||||
|
|
||||||
if (_currentLevel->world()) {
|
QuasarAppUtils::Params::log("Failed to init world. The World object is null! ",
|
||||||
QuasarAppUtils::Params::log("Failed to init world. World name: " + _currentLevel->world()->itemName(),
|
QuasarAppUtils::Error);
|
||||||
QuasarAppUtils::Error);
|
|
||||||
} else {
|
_currentLevel = nullptr;
|
||||||
QuasarAppUtils::Params::log("Failed to init world. The World object is null! ",
|
return;
|
||||||
QuasarAppUtils::Error);
|
}
|
||||||
}
|
|
||||||
|
if (_currentLevel->world()) {
|
||||||
|
QuasarAppUtils::Params::log("Failed to init world. World name: " +
|
||||||
|
_currentLevel->world()->itemName(),
|
||||||
|
QuasarAppUtils::Error);
|
||||||
|
|
||||||
_currentLevel = nullptr;
|
_currentLevel = nullptr;
|
||||||
return;
|
return;
|
||||||
@ -64,6 +74,12 @@ void Engine::setLevel(ILevel *world) {
|
|||||||
|
|
||||||
startRenderLoop();
|
startRenderLoop();
|
||||||
_currentLevel->world()->runAsBackGround();
|
_currentLevel->world()->runAsBackGround();
|
||||||
|
|
||||||
|
connect(_currentLevel->previewScane(), &IPreviewScaneWorld::sigPrepareIsFinished,
|
||||||
|
this, &Engine::start);
|
||||||
|
|
||||||
|
connect(_currentLevel->world(), &IPreviewScaneWorld::sigGameFinished,
|
||||||
|
this, &Engine::stop);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::setScane(QObject *newScane) {
|
void Engine::setScane(QObject *newScane) {
|
||||||
@ -81,28 +97,41 @@ QObject *Engine::player() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
QObject *Engine::world() const {
|
QObject *Engine::world() const {
|
||||||
|
if (!_currentLevel)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
return _currentLevel->world();
|
return _currentLevel->world();
|
||||||
}
|
}
|
||||||
|
|
||||||
int Engine::prepareLvlProgress() const {
|
void Engine::start(const StartData& config) const {
|
||||||
return _prepareLvlProgress;
|
if (!_currentLevel)
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
if (!_currentLevel->previewScane()->stop()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_currentLevel->world()->start(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Engine::start() const {
|
void Engine::stop() const {
|
||||||
if (!_currentLevel)
|
if (!_currentLevel)
|
||||||
return false;
|
return;
|
||||||
|
|
||||||
if (!_currentLevel->isInit())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return _currentWorld->start();
|
if (!_currentLevel->world()->stop()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_currentLevel->previewScane()->start(_currentLevel->previewScane()->configuration());
|
||||||
}
|
}
|
||||||
|
|
||||||
QObject *Engine::getGameObject(int id) const {
|
QObject *Engine::getGameObject(int id) const {
|
||||||
if (!_currentWorld)
|
if (!_currentLevel)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
return _currentWorld->getItem(id);
|
return _currentLevel->world()->getItem(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::startRenderLoop() {
|
void Engine::startRenderLoop() {
|
||||||
@ -122,17 +151,9 @@ bool Engine::isRendering() const {
|
|||||||
return _renderLoopFuture.isRunning();
|
return _renderLoopFuture.isRunning();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::setPrepareLvlProgress(int newPrepareLvlProgress) {
|
|
||||||
if (_prepareLvlProgress == newPrepareLvlProgress) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
_prepareLvlProgress = newPrepareLvlProgress;
|
|
||||||
emit prepareLvlProgressChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Engine::renderLoop() {
|
void Engine::renderLoop() {
|
||||||
|
|
||||||
if (!_currentWorld)
|
if (!_currentLevel)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
while (_renderLoop) {
|
while (_renderLoop) {
|
||||||
@ -144,11 +165,33 @@ void Engine::renderLoop() {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
_currentWorld->render(currentTime - _oldTimeRender);
|
_currentLevel->world()->render(currentTime - _oldTimeRender);
|
||||||
_oldTimeRender = currentTime;
|
_oldTimeRender = currentTime;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Store *Engine::store() const {
|
||||||
|
return _store;
|
||||||
|
}
|
||||||
|
|
||||||
|
QObject *Engine::nest() const {
|
||||||
|
if (!_currentLevel)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
return _currentLevel->previewScane();
|
||||||
|
}
|
||||||
|
|
||||||
|
User *Engine::currentUser() const {
|
||||||
|
return _currentUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
QObject *Engine::storeView() const {
|
||||||
|
return _storeView;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Engine::initStore(const QMultiHash<int, const IItem *> &availabelItems) {
|
||||||
|
_store->init(availabelItems);
|
||||||
|
_storeView->init(_store, _currentUser);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,9 @@ namespace CRAWL {
|
|||||||
|
|
||||||
class IWorld;
|
class IWorld;
|
||||||
class Store;
|
class Store;
|
||||||
|
class StartData;
|
||||||
|
class User;
|
||||||
|
class StoreViewModel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The Engine class
|
* @brief The Engine class
|
||||||
@ -27,9 +30,10 @@ class Engine : public QObject {
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(QObject* player READ player NOTIFY playerChanged)
|
Q_PROPERTY(QObject* player READ player NOTIFY playerChanged)
|
||||||
Q_PROPERTY(QObject* world READ world NOTIFY worldChanged)
|
Q_PROPERTY(QObject* world READ world NOTIFY worldChanged)
|
||||||
|
Q_PROPERTY(QObject* nest READ nest NOTIFY worldChanged)
|
||||||
|
Q_PROPERTY(QObject* storeView READ storeView NOTIFY storeViewChanged)
|
||||||
|
|
||||||
Q_PROPERTY(QObject* scane READ scane WRITE setScane NOTIFY scaneChanged)
|
Q_PROPERTY(QObject* scane READ scane WRITE setScane NOTIFY scaneChanged)
|
||||||
Q_PROPERTY(int _prepareLvlProgress READ prepareLvlProgress WRITE setPrepareLvlProgress NOTIFY prepareLvlProgressChanged)
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Engine(QObject * parent = nullptr);
|
Engine(QObject * parent = nullptr);
|
||||||
@ -77,18 +81,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
QObject* world() const;
|
QObject* world() const;
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief prepareLvlProgress This method return rurrent progress of the loading lvl.
|
|
||||||
* @return current progress of loading new level on the world. progress range is 0 - 100
|
|
||||||
*/
|
|
||||||
int prepareLvlProgress() const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief start This method run current lvl
|
|
||||||
* @return true if lvl started successful.
|
|
||||||
*/
|
|
||||||
bool start() const;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief getGameObject This method using in qml for getting main model of the gui objects.
|
* @brief getGameObject This method using in qml for getting main model of the gui objects.
|
||||||
* @param id This is id of the gui object.
|
* @param id This is id of the gui object.
|
||||||
@ -112,27 +104,68 @@ public:
|
|||||||
*/
|
*/
|
||||||
bool isRendering() const;
|
bool isRendering() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief currentUser This method return pointer too current user.
|
||||||
|
* @return pointer too current user.
|
||||||
|
*/
|
||||||
|
User *currentUser() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief storeView This method return pointer to store view model
|
||||||
|
* @return pointer to store view model
|
||||||
|
*/
|
||||||
|
QObject *storeView() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief initStore This method is wrapper of the Store::init method.
|
||||||
|
* @param availabelItems This is list of available items.
|
||||||
|
*/
|
||||||
|
void initStore(const QMultiHash<int, const IItem *> &availabelItems);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief store This pointer return pointer to store.
|
||||||
|
* @return pointer to store.
|
||||||
|
*/
|
||||||
|
Store *store() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief nest This method return pointer to the nest model.
|
||||||
|
* @return pointer to the nest model.
|
||||||
|
*/
|
||||||
|
QObject *nest() const ;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void scaneChanged();
|
void scaneChanged();
|
||||||
void playerChanged();
|
void playerChanged();
|
||||||
void worldChanged();
|
void worldChanged();
|
||||||
|
void storeViewChanged();
|
||||||
|
|
||||||
void prepareLvlProgressChanged();
|
private slots:
|
||||||
|
/**
|
||||||
|
* @brief start This method run current lvl ( move prepared data from the nest to game world)
|
||||||
|
* @param config This is confuguration that created new game world.
|
||||||
|
* @return true if lvl started successful.
|
||||||
|
*/
|
||||||
|
void start(const StartData &config) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief stop This slots invoked when world finished own session.
|
||||||
|
*/
|
||||||
|
void stop() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void setPrepareLvlProgress(int newPrepareLvlProgress);
|
|
||||||
void renderLoop();
|
void renderLoop();
|
||||||
|
|
||||||
|
|
||||||
QObject *_scane = nullptr;
|
QObject *_scane = nullptr;
|
||||||
QQmlEngine *_engine = nullptr;
|
QQmlEngine *_engine = nullptr;
|
||||||
// IWorld* _currentWorld = nullptr;
|
|
||||||
ILevel* _currentLevel = nullptr;
|
ILevel* _currentLevel = nullptr;
|
||||||
|
|
||||||
int _prepareLvlProgress;
|
|
||||||
|
|
||||||
quint64 _oldTimeRender = 0;
|
quint64 _oldTimeRender = 0;
|
||||||
|
|
||||||
|
User *_currentUser = nullptr;
|
||||||
|
StoreViewModel *_storeView = nullptr;
|
||||||
|
Store *_store = nullptr;
|
||||||
|
|
||||||
QFuture<void> _renderLoopFuture;
|
QFuture<void> _renderLoopFuture;
|
||||||
bool _renderLoop = false;
|
bool _renderLoop = false;
|
||||||
};
|
};
|
||||||
|
@ -37,8 +37,8 @@ void MainMenuModel::setAvailableLvls(const QList<QObject*> &newData) {
|
|||||||
_availableLvlsModel->setSource(newData);
|
_availableLvlsModel->setSource(newData);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainMenuModel::newGame(const QString &lvl) {
|
void MainMenuModel::changeLevel(int lvl) {
|
||||||
emit sigNewGame(lvl);
|
emit sigLevelChanged(lvl);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -36,12 +36,12 @@ public:
|
|||||||
QObject* availableLvlsModel() const;
|
QObject* availableLvlsModel() const;
|
||||||
void addWorldViewModel(QObject *);
|
void addWorldViewModel(QObject *);
|
||||||
void setAvailableLvls(const QList<QObject *> &newData);
|
void setAvailableLvls(const QList<QObject *> &newData);
|
||||||
Q_INVOKABLE void newGame(const QString& lvl);
|
Q_INVOKABLE void changeLevel(int lvl);
|
||||||
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void userSettingsModelChanged(QObject* userSettingsModel);
|
void userSettingsModelChanged(QObject* userSettingsModel);
|
||||||
void sigNewGame(const QString& lvl);
|
void sigLevelChanged(int lvl);
|
||||||
void availableLvlsModelChanged();
|
void availableLvlsModelChanged();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -43,4 +43,12 @@ bool Store::init(const QMultiHash<int, const IItem *> &availabelItems) {
|
|||||||
const IItem *Store::getItemById(int id) const {
|
const IItem *Store::getItemById(int id) const {
|
||||||
return _store.value(id, nullptr);
|
return _store.value(id, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Store::size() const {
|
||||||
|
return _store.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<int> Store::keysList() const {
|
||||||
|
return QList<int>{_store.keyBegin(), _store.keyEnd()};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,18 @@ public:
|
|||||||
*/
|
*/
|
||||||
const IItem* getItemById(int id) const;
|
const IItem* getItemById(int id) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief size This method return count of the available items in store.
|
||||||
|
* @return count of the available items.
|
||||||
|
*/
|
||||||
|
int size() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief keysList This method return a list of available keys
|
||||||
|
* @return a list of available keys
|
||||||
|
*/
|
||||||
|
QList<int> keysList() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QMultiHash<int, const IItem*> _store;
|
QMultiHash<int, const IItem*> _store;
|
||||||
};
|
};
|
||||||
|
93
src/Core/private/storeviewmodel.cpp
Normal file
93
src/Core/private/storeviewmodel.cpp
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
#include "storeviewmodel.h"
|
||||||
|
#include "store.h"
|
||||||
|
#include "user.h"
|
||||||
|
|
||||||
|
#include <Crawl/iitem.h>
|
||||||
|
|
||||||
|
namespace CRAWL {
|
||||||
|
|
||||||
|
StoreViewModel::StoreViewModel() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
QModelIndex StoreViewModel::index(int row, int column, const QModelIndex &parent) const {
|
||||||
|
return QAbstractListModel::index(row, column, parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
int StoreViewModel::rowCount(const QModelIndex &) const {
|
||||||
|
return _keys.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
int StoreViewModel::columnCount(const QModelIndex &) const {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant StoreViewModel::data(const QModelIndex &index, int role) const {
|
||||||
|
if (!_store)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
if (index.row() >= rowCount()) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
int id = _keys.at(index.row());
|
||||||
|
|
||||||
|
const IItem* item = _store->getItemById(id);
|
||||||
|
|
||||||
|
if (!item)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
switch (role) {
|
||||||
|
case ItemId: return id;
|
||||||
|
case ItemName: return item->itemName();
|
||||||
|
case ItemImage: return item->image();
|
||||||
|
case ItemDescription: return item->description();
|
||||||
|
case ItemWasBuy: return _currentUser && _currentUser->isUnlocked(id);
|
||||||
|
default:
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QHash<int, QByteArray> StoreViewModel::roleNames() const {
|
||||||
|
QHash<int, QByteArray> roles;
|
||||||
|
|
||||||
|
roles[ItemId] = "itemId";
|
||||||
|
roles[ItemName] = "itemName";
|
||||||
|
roles[ItemDescription] = "itemDescription";
|
||||||
|
roles[ItemImage] = "itemImage";
|
||||||
|
roles[ItemWasBuy] = "itemWasBuy";
|
||||||
|
|
||||||
|
return roles;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StoreViewModel::init(const Store * store, const User* user) {
|
||||||
|
setUser(user);
|
||||||
|
|
||||||
|
int diff = store->size() - _keys.size();
|
||||||
|
|
||||||
|
if (diff > 0) {
|
||||||
|
beginInsertRows({}, _keys.size(), store->size() - 1);
|
||||||
|
|
||||||
|
_store = store;
|
||||||
|
_keys = store->keysList();
|
||||||
|
|
||||||
|
endInsertRows();
|
||||||
|
|
||||||
|
} else if (diff == 0) {
|
||||||
|
emit dataChanged(index(0,0), index(rowCount() - 1, columnCount() - 1));
|
||||||
|
|
||||||
|
} else {
|
||||||
|
beginRemoveRows({}, store->size(), _keys.size() - 1);
|
||||||
|
|
||||||
|
_store = store;
|
||||||
|
_keys = store->keysList();
|
||||||
|
|
||||||
|
endRemoveRows();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void StoreViewModel::setUser(const User *user) {
|
||||||
|
_currentUser = user;
|
||||||
|
emit dataChanged(index(0,0), index(rowCount() - 1, columnCount() - 1), {ItemWasBuy});
|
||||||
|
}
|
||||||
|
}
|
62
src/Core/private/storeviewmodel.h
Normal file
62
src/Core/private/storeviewmodel.h
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
//#
|
||||||
|
//# 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 STOREVIEWMODEL_H
|
||||||
|
#define STOREVIEWMODEL_H
|
||||||
|
|
||||||
|
#include <QAbstractListModel>
|
||||||
|
|
||||||
|
namespace CRAWL {
|
||||||
|
|
||||||
|
class Store;
|
||||||
|
class User;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The StoreViewModel class This is view model of the store. The object of this class should be initialized it he Store class.
|
||||||
|
*/
|
||||||
|
class StoreViewModel: public QAbstractListModel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
StoreViewModel();
|
||||||
|
|
||||||
|
QModelIndex index(int row, int column, const QModelIndex &parent = {}) const override;
|
||||||
|
int rowCount(const QModelIndex &parent = {}) const override;
|
||||||
|
int columnCount(const QModelIndex &parent = {}) const override;
|
||||||
|
QVariant data(const QModelIndex &index, int role) const override;
|
||||||
|
QHash<int, QByteArray> roleNames() const override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief init This method initialize data of the view model.
|
||||||
|
* @param _store This is poiter to store that contains all inforamtion about store items.
|
||||||
|
* @param user This is new pointer to current user.
|
||||||
|
* @see StoreViewModel::setUser
|
||||||
|
*/
|
||||||
|
void init(const Store * store, const User* user);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief setUser This method update user pointer
|
||||||
|
* @param user This is new pointer to current user.
|
||||||
|
*/
|
||||||
|
void setUser(const User* user);
|
||||||
|
private:
|
||||||
|
|
||||||
|
enum StoreRoles {
|
||||||
|
ItemId,
|
||||||
|
ItemName,
|
||||||
|
ItemImage,
|
||||||
|
ItemDescription,
|
||||||
|
ItemWasBuy
|
||||||
|
};
|
||||||
|
|
||||||
|
const Store *_store = nullptr;
|
||||||
|
QList<int> _keys;
|
||||||
|
const User* _currentUser = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif // STOREVIEWMODEL_H
|
@ -9,10 +9,9 @@
|
|||||||
#include "abslvlworld.h"
|
#include "abslvlworld.h"
|
||||||
|
|
||||||
AbstractLevel::AbstractLevel() {
|
AbstractLevel::AbstractLevel() {
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
CRAWL::IWorld *AbstractLevel::world() {
|
|
||||||
initAbstractLvlResources();
|
initAbstractLvlResources();
|
||||||
return new AbstractLvl::AbsLvlWorld();
|
|
||||||
|
setWorld(new AbstractLvl::AbsLvlWorld());
|
||||||
|
setPreviewScane(new AbstractLvl::AbsLvlWorld());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,10 +19,6 @@ inline void initAbstractLvlResources() { Q_INIT_RESOURCE(abstractLevel);
|
|||||||
class CRAWL_ABSTRACT_LEVEL_EXPORT AbstractLevel: public CRAWL::ILevel {
|
class CRAWL_ABSTRACT_LEVEL_EXPORT AbstractLevel: public CRAWL::ILevel {
|
||||||
public:
|
public:
|
||||||
AbstractLevel();
|
AbstractLevel();
|
||||||
|
|
||||||
// ILevel interface
|
|
||||||
public:
|
|
||||||
CRAWL::IWorld *world() override;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // ABSTRACTLEVEL_H
|
#endif // ABSTRACTLEVEL_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user