From 842f298b3d7609864c6d9c71e70449f11cf0ffec Mon Sep 17 00:00:00 2001 From: EndrII Date: Wed, 11 Aug 2021 00:21:22 +0300 Subject: [PATCH] begin refactoring init level system --- src/Core/Crawl.qrc | 1 + src/Core/Crawl/defaultcontrol.h | 5 +- src/Core/Crawl/iitem.h | 1 + src/Core/Crawl/ilevel.cpp | 27 ++++++ src/Core/Crawl/ilevel.h | 38 +++++++- src/Core/Crawl/ipreviewscaneworld.cpp | 47 +++++++++ src/Core/Crawl/ipreviewscaneworld.h | 43 ++++++++ src/Core/Crawl/iworld.cpp | 14 +-- src/Core/Crawl/iworld.h | 11 ++- src/Core/Crawl/iworlditem.cpp | 17 +++- src/Core/Crawl/iworlditem.h | 3 +- src/Core/Crawl/player.cpp | 20 ++++ src/Core/Crawl/player.h | 31 ++++++ src/Core/Crawl/snake.h | 5 +- src/Core/Crawl/startdata.cpp | 38 ++++++++ src/Core/Crawl/startdata.h | 61 ++++++++++++ src/Core/CrawlModule/PreviewScane.qml | 135 ++++++++++++++++++++++++++ 17 files changed, 474 insertions(+), 23 deletions(-) create mode 100644 src/Core/Crawl/ipreviewscaneworld.cpp create mode 100644 src/Core/Crawl/ipreviewscaneworld.h create mode 100644 src/Core/Crawl/startdata.cpp create mode 100644 src/Core/Crawl/startdata.h create mode 100644 src/Core/CrawlModule/PreviewScane.qml diff --git a/src/Core/Crawl.qrc b/src/Core/Crawl.qrc index b3644af..b8766fd 100644 --- a/src/Core/Crawl.qrc +++ b/src/Core/Crawl.qrc @@ -24,5 +24,6 @@ CrawlCoreAssets/particles/smokeSprite.png CrawlModule/particles/Fire.qml CrawlModule/particles/Wint.qml + CrawlModule/PreviewScane.qml diff --git a/src/Core/Crawl/defaultcontrol.h b/src/Core/Crawl/defaultcontrol.h index 249176d..fc65cc7 100644 --- a/src/Core/Crawl/defaultcontrol.h +++ b/src/Core/Crawl/defaultcontrol.h @@ -8,8 +8,7 @@ #ifndef DEFAULTCONTROL_H #define DEFAULTCONTROL_H -#include "icontrol.h" -#include "global.h" +#include "player.h" namespace CRAWL { @@ -17,7 +16,7 @@ namespace CRAWL { /** * @brief The DefaultControl class This class contains default implementation of the game menu. */ -class CRAWL_EXPORT DefaultControl : public IControl { +class CRAWL_EXPORT DefaultControl : public Player { Q_OBJECT public: DefaultControl(); diff --git a/src/Core/Crawl/iitem.h b/src/Core/Crawl/iitem.h index 5e2936d..1bf3ade 100644 --- a/src/Core/Crawl/iitem.h +++ b/src/Core/Crawl/iitem.h @@ -22,6 +22,7 @@ class CRAWL_EXPORT IItem { public: IItem(); + virtual ~IItem() = default; /** * @brief itemTextId All items contains own ids, override this method for create base for generate new item id. diff --git a/src/Core/Crawl/ilevel.cpp b/src/Core/Crawl/ilevel.cpp index 33bb3c3..e08d667 100644 --- a/src/Core/Crawl/ilevel.cpp +++ b/src/Core/Crawl/ilevel.cpp @@ -5,4 +5,31 @@ //# of this license document, but changing it is not allowed. //# +#include "iitem.h" #include "ilevel.h" +#include "iworld.h" + +namespace CRAWL { + +ILevel::~ILevel() { + delete _world; + delete _previewScane; +} + +IWorld *ILevel::world() { + return _world; +} + +IWorld *ILevel::previewScane() { + return _previewScane; +} + +void ILevel::setWorld(IWorld *newWorld) { + _world = newWorld; +} + +void ILevel::setPreviewScane(IWorld *newPreviewScane) { + _previewScane = newPreviewScane; +} + +} diff --git a/src/Core/Crawl/ilevel.h b/src/Core/Crawl/ilevel.h index 5cad4c6..bddf661 100644 --- a/src/Core/Crawl/ilevel.h +++ b/src/Core/Crawl/ilevel.h @@ -5,6 +5,8 @@ //# of this license document, but changing it is not allowed. //# +#include + #ifndef LEVEL_H #define LEVEL_H @@ -12,22 +14,54 @@ namespace CRAWL { class IWorld; +class IItem; /** * @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; + virtual ~ILevel(); /** * @brief world This method should be return pointer to the level world. * @return pointer to the level world. + * @see ILevel::setWorld */ - virtual IWorld* world() = 0; + IWorld* world(); + + /** + * @brief previewScane this method should be create a model of the snake preview scane. + * @return pointer to the model of the preview scane. + * @see ILevel::setPreviewScane + */ + IWorld* previewScane(); + +protected: + /** + * @brief setWorld This method sets new world pointer. + * @param newWorld This is new world model object. + * @note The @a newWorld item will be distroued with the parent object. + * @see ILevel::world + */ + void setWorld(IWorld *newWorld); + + /** + * @brief setPreviewScane This method sets new object for the preview scane. + * @param newPreviewScane This is new value of the preview scane. + * @note The @a newPreviewScane item will be distroued with the parent object. + * @see ILevel::previewScane + */ + void setPreviewScane(IWorld *newPreviewScane); + +private: + + IWorld* _world = nullptr; + IWorld* _previewScane = nullptr; }; } diff --git a/src/Core/Crawl/ipreviewscaneworld.cpp b/src/Core/Crawl/ipreviewscaneworld.cpp new file mode 100644 index 0000000..947b995 --- /dev/null +++ b/src/Core/Crawl/ipreviewscaneworld.cpp @@ -0,0 +1,47 @@ +//# +//# 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 "ipreviewscaneworld.h" +namespace CRAWL { + +IPreviewScaneWorld::IPreviewScaneWorld() { + +} + +QString IPreviewScaneWorld::itemTextId() const { + return "preview"; +} + +QString IPreviewScaneWorld::itemName() const { + return itemTextId(); +} + +QString IPreviewScaneWorld::description() const { + return ""; +} + +QString IPreviewScaneWorld::image() const { + return ""; +} + +int IPreviewScaneWorld::cost() const { + return 0; +} + +int IPreviewScaneWorld::requiredTier() const { + return 0; +} + +bool IPreviewScaneWorld::start(const StartData& config) { + _configuration = config; +} + +bool IPreviewScaneWorld::stop() { + +} + +} diff --git a/src/Core/Crawl/ipreviewscaneworld.h b/src/Core/Crawl/ipreviewscaneworld.h new file mode 100644 index 0000000..a38b7ed --- /dev/null +++ b/src/Core/Crawl/ipreviewscaneworld.h @@ -0,0 +1,43 @@ +//# +//# 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 IPREVIEWSCANEWORLD_H +#define IPREVIEWSCANEWORLD_H + +#include "iworld.h" + +namespace CRAWL { + +/** + * @brief The IPreviewScaneWorld class is interface of the all preview scanes models. + */ +class CRAWL_EXPORT IPreviewScaneWorld: public IWorld +{ +public: + IPreviewScaneWorld(); + + // IItem interface +public: + QString itemTextId() const override final; + QString itemName() const override final; + QString description() const override final; + QString image() const override final; + int cost() const override final; + int requiredTier() const override final; + + bool start(const StartData &config) override; + bool stop() override; + +signals: + void sigPrepareIsFinished(const StartData& config); + +private: + StartData _configuration; +}; + +} +#endif // IPREVIEWSCANEWORLD_H diff --git a/src/Core/Crawl/iworld.cpp b/src/Core/Crawl/iworld.cpp index 528d7e7..337fd80 100644 --- a/src/Core/Crawl/iworld.cpp +++ b/src/Core/Crawl/iworld.cpp @@ -20,6 +20,7 @@ #include "chrono" #include "diff.h" #include "eventserver.h" +#include "player.h" namespace CRAWL { @@ -40,9 +41,11 @@ IWorld::~IWorld() { delete _eventServer; } -void IWorld::init() {prepare();} +void IWorld::init() { + prepare(); +} -IControl *IWorld::initUserInterface() const { +Player *IWorld::initUserInterface() const { return new DefaultControl; } @@ -83,12 +86,13 @@ void IWorld::initPlayerControl(IControl *control) { } } -bool IWorld::start() { +bool IWorld::start(const StartData& config) { _player->setposition({0,0,0}); setWorldStatus(WorldStatus::Game); _backgroundAI->stopAI(); _player->setControl(_userInterface); + setPlayer(initPlayer()); worldChanged(_worldRules->cbegin()); @@ -151,8 +155,6 @@ bool IWorld::prepare() { _worldRules = initWorldRules(); setHdr(initHdrBackGround()); - setPlayer(initPlayer()); - _player->initOnWorld(this, _player); _userInterface = initUserInterface(); _backgroundAI = initBackGroundAI(); @@ -283,7 +285,7 @@ void IWorld::addAtomicItem(IWorldItem* obj) { _items.insert(obj->guiId(), obj); _itemsGroup.insert(obj->className(), obj->guiId()); - obj->initOnWorld(this, _player); + obj->initOnWorld(this); } bool IWorld::removeAtomicItem(int id) { diff --git a/src/Core/Crawl/iworld.h b/src/Core/Crawl/iworld.h index 6f712ab..32de6b7 100644 --- a/src/Core/Crawl/iworld.h +++ b/src/Core/Crawl/iworld.h @@ -11,6 +11,7 @@ #include "gameresult.h" #include "iitem.h" #include "playableobject.h" +#include "startdata.h" #include #include @@ -42,6 +43,7 @@ class IControl; class IAI; class IWorldLight; class EventServer; +class Player; /** * @brief WorldObjects This is map list of the avalable objects and its count on a lvl-long point. @@ -110,7 +112,7 @@ public: * @note The base implementation return default user interface. * @return pointer to userInterface. */ - virtual IControl* initUserInterface() const; + virtual Player *initUserInterface() const; /** * @brief initHdrBackGround The implementation of this method must be return valid path to the hdr image map. @@ -127,17 +129,18 @@ public: /** * @brief initPlayerControl This method should be configure all connections of @a control object. - * @brief control This is control object + * @param control This is control object * @note override this method if you have own IControl object. */ virtual void initPlayerControl(IControl* control); /** * @brief start This method will be invoked when user click start button. + * @param config This is initialize level arguments. * @note The Default implementation reset all positions for all objects. * @return true if game started successful. */ - virtual bool start(); + virtual bool start(const StartData &config); /** * @brief stop This methos will be invoked when user click to return to main menu button. @@ -487,8 +490,8 @@ private: WorldRule::const_iterator _currendWorldLevel; PlayableObject *_player = nullptr; - IControl *_userInterface = nullptr; IAI *_backgroundAI = nullptr; + Player *_userInterface = nullptr; int _worldStatus = 0; QHash> _registeredTypes; diff --git a/src/Core/Crawl/iworlditem.cpp b/src/Core/Crawl/iworlditem.cpp index dd18590..94195b3 100644 --- a/src/Core/Crawl/iworlditem.cpp +++ b/src/Core/Crawl/iworlditem.cpp @@ -30,10 +30,17 @@ const IWorldItem *IWorldItem::getItem(int id) const { } const IWorldItem *IWorldItem::getPlayer() const { - return _playerObject; + if (!_world) + return nullptr; + return static_cast(_world->player()); } void IWorldItem::render(unsigned int) { + auto _playerObject = getPlayer(); + + if (!_playerObject) + return; + if (_playerObject->position().distanceToPoint(position()) > _world->cameraReleativePosition().z() * 3) { respawn(); @@ -42,9 +49,8 @@ void IWorldItem::render(unsigned int) { void IWorldItem::init() {} -void IWorldItem::initOnWorld(const IWorld *world, const IWorldItem * player) { +void IWorldItem::initOnWorld(const IWorld *world) { _world = world; - _playerObject = player; } int IWorldItem::supportedEvents() const { @@ -60,6 +66,11 @@ void IWorldItem::destroy() { } void IWorldItem::respawn() { + auto _playerObject = getPlayer(); + + if (!_playerObject) + return; + float dX = _world->cameraReleativePosition().z() * 2 + (rand() % static_cast(_world->cameraReleativePosition().z())); diff --git a/src/Core/Crawl/iworlditem.h b/src/Core/Crawl/iworlditem.h index 8e60047..6df04b9 100644 --- a/src/Core/Crawl/iworlditem.h +++ b/src/Core/Crawl/iworlditem.h @@ -135,10 +135,9 @@ protected: void dropSupportOfEvent(int depricatedEvent); private: - void initOnWorld(const IWorld* world, const IWorldItem *player); + void initOnWorld(const IWorld* world); const IWorld* _world = nullptr; - const IWorldItem *_playerObject = nullptr; bool _fDecorative = true; bool _fDistroy = false; diff --git a/src/Core/Crawl/player.cpp b/src/Core/Crawl/player.cpp index f3c5baa..0bb6bdf 100644 --- a/src/Core/Crawl/player.cpp +++ b/src/Core/Crawl/player.cpp @@ -6,9 +6,29 @@ //# #include "player.h" +#include + namespace CRAWL { Player::Player() { } + +void Player::addXp(int newXp) { + if (_userData) + _userData->setXp(_userData->getXp() + newXp); +} + +void Player::addMoney(int money) { + if (_userData) + _userData->setMoney(_userData->getMoney() + money); +} + +User *Player::userData() const { + return _userData; +} + +void Player::setUserData(User *newUserData) { + _userData = newUserData; +} } diff --git a/src/Core/Crawl/player.h b/src/Core/Crawl/player.h index 4a33df0..5808846 100644 --- a/src/Core/Crawl/player.h +++ b/src/Core/Crawl/player.h @@ -11,8 +11,11 @@ #include "icontrol.h" + namespace CRAWL { +class User; + /** * @brief The Player class is main class of users. */ @@ -21,6 +24,34 @@ class CRAWL_EXPORT Player: public IControl Q_OBJECT public: Player(); + + /** + * @brief addXp This method add new xp to palyer. + * @param newXp this is value of experience + */ + void addXp(int newXp); + + /** + * @brief addMoney This method add money to user. + * @param money added amount of money + */ + void addMoney(int money); + + /** + * @brief userData This method sets user that control this object. + * @return current control user. + */ + User *userData() const; + + /** + * @brief setUserData This method sets user that control this object. + * @param newUserData This is new pointer of the new user. + */ + void setUserData(User *newUserData); + +private: + + User *_userData = nullptr; }; } #endif // PLAYER_H diff --git a/src/Core/Crawl/snake.h b/src/Core/Crawl/snake.h index 4fc5423..669c425 100644 --- a/src/Core/Crawl/snake.h +++ b/src/Core/Crawl/snake.h @@ -8,6 +8,7 @@ #ifndef CRAWL_SNAKE_H #define CRAWL_SNAKE_H +#include "iitem.h" #include "playableobject.h" #include "Extensions/autogenerateclaster.h" @@ -18,7 +19,7 @@ class SnakeItem; /** * @brief The Snake class This class implement render mehod for snake object. */ -class CRAWL_EXPORT Snake : public PlayableObject, public AutoGenerateClaster +class CRAWL_EXPORT Snake : public PlayableObject, public AutoGenerateClaster, public IItem { Q_OBJECT public: @@ -34,7 +35,6 @@ public: void remove(int id) override; void init() override; - // IPlayer interface /** * @brief lengthBetwinItems This method return length betwin snake items; @@ -132,7 +132,6 @@ private: float _speed; int _hp = 100; - }; } diff --git a/src/Core/Crawl/startdata.cpp b/src/Core/Crawl/startdata.cpp new file mode 100644 index 0000000..98761b7 --- /dev/null +++ b/src/Core/Crawl/startdata.cpp @@ -0,0 +1,38 @@ +//# +//# 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 "startdata.h" + +namespace CRAWL { + +StartData::StartData() { + +} + +StartData::StartData(User *player, int snake) { + setPlayer(player); + setSnakeType(snake); +} + + +User *StartData::player() const{ + return _player; +} + +void StartData::setPlayer(User *newPlayer) { + _player = newPlayer; +} + +int StartData::snakeType() const { + return _snakeType; +} + +void StartData::setSnakeType(int newSnake) { + _snakeType = newSnake; +} + +} diff --git a/src/Core/Crawl/startdata.h b/src/Core/Crawl/startdata.h new file mode 100644 index 0000000..8cd7758 --- /dev/null +++ b/src/Core/Crawl/startdata.h @@ -0,0 +1,61 @@ +//# +//# 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 STARTDATA_H +#define STARTDATA_H + +namespace CRAWL { + +class User; +class PlayableObject; + +/** + * @brief The StartData class This class contains arguments for starting new game session. + */ +class StartData +{ +public: + StartData(); + + StartData(User * player, int snake); + + /** + * @brief player This method return pointer to user that will be control player snake. + * @return pointer to user that will be control player snake. + * @see StartData::setPlayer + */ + User *player() const; + + /** + * @brief setPlayer This method sets + * @param newPlayer This is new object of the user. + * @see StartData::player + */ + void setPlayer(User *newPlayer); + + /** + * @brief snakeType This method return select for game snake object type. + * @return select for game snake object. + * @see StartData::setSnakeType + */ + int snakeType() const; + + /** + * @brief setSnakeType This method sets new selected for game object type, + * @param newSnake This is new selected for game object + * @see StartData::snakeType + */ + void setSnakeType(int newSnake); + +private: + User *_player = nullptr; + int _snakeType; +}; + +} + +#endif // STARTDATA_H diff --git a/src/Core/CrawlModule/PreviewScane.qml b/src/Core/CrawlModule/PreviewScane.qml new file mode 100644 index 0000000..e7ed5a1 --- /dev/null +++ b/src/Core/CrawlModule/PreviewScane.qml @@ -0,0 +1,135 @@ +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 + } + } + } + } +}