Snake/src/Core/private/engine.cpp

177 lines
3.3 KiB
C++
Raw Normal View History

//#
//# 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.
//#
2021-06-06 15:53:49 +03:00
#include "engine.h"
#include <QQmlComponent>
2021-06-16 16:10:14 +03:00
#include <Crawl/guiobject.h>
#include "Crawl/iworld.h"
2021-06-21 10:57:31 +03:00
#include <QThread>
2021-06-11 18:09:03 +03:00
#include <quasarapp.h>
2021-06-16 16:10:14 +03:00
#include "Crawl/icontrol.h"
2021-06-21 10:57:31 +03:00
#include "QDateTime"
#include "QtConcurrent"
2021-06-06 15:53:49 +03:00
2021-07-05 17:39:26 +03:00
namespace CRAWL {
2021-06-10 18:07:04 +03:00
Engine::Engine(QObject *parent): QObject(parent) {
2021-06-06 15:53:49 +03:00
}
2021-06-21 10:57:31 +03:00
Engine::~Engine() {
stopRenderLoop();
}
2021-06-06 15:53:49 +03:00
QObject *Engine::scane() {
return _scane;
}
2021-06-07 17:37:03 +03:00
void Engine::setQmlEngine(QQmlEngine *newEngine) {
2021-06-06 15:53:49 +03:00
if (_engine == newEngine)
return;
_engine = newEngine;
}
2021-06-07 17:37:03 +03:00
2021-06-08 18:00:42 +03:00
void Engine::setWorld(IWorld *world) {
if (_currentWorld == world)
return ;
2021-06-08 21:56:36 +03:00
if (_currentWorld) {
2021-06-28 18:16:27 +03:00
_currentWorld->reset();
2021-06-08 21:56:36 +03:00
}
2021-06-08 18:00:42 +03:00
_currentWorld = world;
2021-06-14 18:15:59 +03:00
emit worldChanged();
2021-06-08 21:56:36 +03:00
2021-06-30 12:15:57 +03:00
if (!prepareNewWorld()) {
QuasarAppUtils::Params::log("Failed to init world. World name: " + _currentWorld->name(),
QuasarAppUtils::Error);
_currentWorld = nullptr;
return;
}
2021-06-07 17:37:03 +03:00
startRenderLoop();
2021-06-30 12:15:57 +03:00
_currentWorld->runAsBackGround();
2021-06-08 18:00:42 +03:00
}
void Engine::setScane(QObject *newScane) {
if (_scane == newScane)
return;
_scane = newScane;
emit scaneChanged();
2021-06-07 17:37:03 +03:00
}
2021-06-09 16:38:55 +03:00
QObject *Engine::player() const {
if (_currentWorld)
return _currentWorld->_player;
return nullptr;
}
QObject *Engine::world() const {
return _currentWorld;
}
2021-06-12 18:20:29 +03:00
QObject *Engine::menu() const {
return _menu;
}
void Engine::setMenu(QObject *newMenu) {
if (_menu == newMenu) {
2021-06-12 18:20:29 +03:00
return;
}
2021-06-12 18:20:29 +03:00
_menu = newMenu;
emit menuChanged();
}
2021-06-13 20:16:36 +03:00
int Engine::prepareLvlProgress() const {
return _prepareLvlProgress;
}
2021-06-14 18:15:59 +03:00
2021-06-15 16:04:18 +03:00
bool Engine::start() const {
if (!_currentWorld)
return false;
if (!_currentWorld->isInit())
return false;
return _currentWorld->start();
}
2021-06-16 18:57:50 +03:00
QObject *Engine::getGameObject(int id) const {
if (!_currentWorld)
return nullptr;
return _currentWorld->getItem(id);
}
2021-06-21 10:57:31 +03:00
void Engine::startRenderLoop() {
if (isRendering())
return;
_renderLoop = true;
_renderLoopFuture = QtConcurrent::run(this, &Engine::renderLoop);
}
void Engine::stopRenderLoop() {
_renderLoop = false;
_renderLoopFuture.waitForFinished();
}
bool Engine::isRendering() const {
return _renderLoopFuture.isRunning();
}
2021-06-14 18:15:59 +03:00
void Engine::setPrepareLvlProgress(int newPrepareLvlProgress) {
if (_prepareLvlProgress == newPrepareLvlProgress) {
2021-06-14 18:15:59 +03:00
return;
}
2021-06-14 18:15:59 +03:00
_prepareLvlProgress = newPrepareLvlProgress;
emit prepareLvlProgressChanged();
}
2021-06-21 10:57:31 +03:00
2021-06-30 12:15:57 +03:00
bool Engine::prepareNewWorld() {
if (!_currentWorld->prepare()) {
2021-06-30 12:15:57 +03:00
return false;
}
if (!_currentWorld->userInterface()->init()) {
2021-06-30 12:15:57 +03:00
return false;
}
setMenu(_currentWorld->userInterface());
2021-06-30 12:15:57 +03:00
return true;
}
2021-06-21 10:57:31 +03:00
void Engine::renderLoop() {
if (!_currentWorld)
return;
while (_renderLoop) {
quint64 currentTime = QDateTime::currentMSecsSinceEpoch();
if (!_oldTimeRender) {
_oldTimeRender = currentTime;
continue;
}
_currentWorld->render(currentTime - _oldTimeRender);
_oldTimeRender = currentTime;
}
}
2021-07-05 17:39:26 +03:00
}