From 2ea0c58652fb9223562431e026297af3c1d189f3 Mon Sep 17 00:00:00 2001 From: TheUltimateOptimist <digitalConfidence@web.de> Date: Mon, 27 Jan 2025 23:40:19 +0100 Subject: [PATCH] basic leveleditor --- CMakeLists.txt | 3 +++ README.md | 3 +++ leveleditor/CMakeLists.txt | 16 ++++++++++++++++ leveleditor/src/MainWindow.cpp | 26 ++++++++++++++++++++++++++ leveleditor/src/MainWindow.hpp | 6 ++++++ leveleditor/src/Tile.cpp | 8 ++++++++ leveleditor/src/Tile.hpp | 13 +++++++++++++ leveleditor/src/TileProvider.cpp | 18 ++++++++++++++++++ leveleditor/src/TileProvider.hpp | 12 ++++++++++++ leveleditor/src/main.cpp | 12 ++++++++++++ 10 files changed, 117 insertions(+) create mode 100644 leveleditor/CMakeLists.txt create mode 100644 leveleditor/src/MainWindow.cpp create mode 100644 leveleditor/src/MainWindow.hpp create mode 100644 leveleditor/src/Tile.cpp create mode 100644 leveleditor/src/Tile.hpp create mode 100644 leveleditor/src/TileProvider.cpp create mode 100644 leveleditor/src/TileProvider.hpp create mode 100644 leveleditor/src/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a9b703..85d2f7e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -108,6 +108,9 @@ else() ) endif() +# leveleditor +add_subdirectory(leveleditor) + # writelevel add_executable(writelevel ${PROJECT_SOURCE_DIR}/writelevel.cpp) target_include_directories(writelevel diff --git a/README.md b/README.md index 8e5bcd0..9213cba 100644 --- a/README.md +++ b/README.md @@ -57,3 +57,6 @@ CMake kann mit verschiedenen Optionen konfiguriert werden: cmake .. -DCMAKE_BUILD_TYPE=Release # Release-Build cmake .. -DCMAKE_BUILD_TYPE=Debug # Debug-Build ``` + +## Prerequisites for Leveleditor +- QT 6: ```sudo apt install qt6-base-dev``` \ No newline at end of file diff --git a/leveleditor/CMakeLists.txt b/leveleditor/CMakeLists.txt new file mode 100644 index 0000000..248c3ea --- /dev/null +++ b/leveleditor/CMakeLists.txt @@ -0,0 +1,16 @@ +# Find Qt +find_package(Qt6 REQUIRED COMPONENTS Widgets) + +file(GLOB_RECURSE LEVELEDITOR_SOURCES + "${PROJECT_SOURCE_DIR}/leveleditor/src/*.cpp" + "${PROJECT_SOURCE_DIR}/leveleditor/src/*.hpp" +) + +# Add executable +add_executable(editor ${LEVELEDITOR_SOURCES}) + +# Link Qt libraries +target_link_libraries(editor PRIVATE Qt6::Widgets) + + + diff --git a/leveleditor/src/MainWindow.cpp b/leveleditor/src/MainWindow.cpp new file mode 100644 index 0000000..a8a07b6 --- /dev/null +++ b/leveleditor/src/MainWindow.cpp @@ -0,0 +1,26 @@ +#include <QGraphicsScene> +#include <QVBoxLayout> +#include <QGraphicsView> +#include "TileProvider.hpp" +#include "MainWindow.hpp" + +MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { + // Create the main widget and layout + QWidget *centralWidget = new QWidget(this); + QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget); + setWindowTitle("Level Editor"); + + QGraphicsScene* scene = new QGraphicsScene(this); + scene->setSceneRect(0, 0, 400, 400); // Set the scene dimensions + TileProvider tileprovider = TileProvider::from_spritesheet("spritesheet.h5"); + QPixmap pixmap = tileprovider.get_tile(0); + QGraphicsPixmapItem* pixmapitem = scene->addPixmap(pixmap); + + // Create a view to display the scene + QGraphicsView* view = new QGraphicsView(scene, this); + view->setFixedSize(300, 300); + view->scale(10, 10); + mainLayout->addWidget(view); + + setCentralWidget(centralWidget); +} \ No newline at end of file diff --git a/leveleditor/src/MainWindow.hpp b/leveleditor/src/MainWindow.hpp new file mode 100644 index 0000000..ef962da --- /dev/null +++ b/leveleditor/src/MainWindow.hpp @@ -0,0 +1,6 @@ +#include <QMainWindow> + +class MainWindow : public QMainWindow { +public: + MainWindow(QWidget *parent = nullptr); +}; \ No newline at end of file diff --git a/leveleditor/src/Tile.cpp b/leveleditor/src/Tile.cpp new file mode 100644 index 0000000..8489d68 --- /dev/null +++ b/leveleditor/src/Tile.cpp @@ -0,0 +1,8 @@ +#include "Tile.hpp" +#include <iostream> + +Tile::Tile(const QPixmap &pixmap, uint8_t id) : QGraphicsPixmapItem(pixmap) {} + +void Tile::mousePressEvent(QGraphicsSceneMouseEvent *event) { + std::cout << "clicked" << std::endl; +} diff --git a/leveleditor/src/Tile.hpp b/leveleditor/src/Tile.hpp new file mode 100644 index 0000000..726e0e6 --- /dev/null +++ b/leveleditor/src/Tile.hpp @@ -0,0 +1,13 @@ +#include <QApplication> +#include <QGraphicsPixmapItem> +#include <QGraphicsSceneMouseEvent> + +class Tile : public QGraphicsPixmapItem { +public: + explicit Tile(const QPixmap& pixmap, uint8_t id); + +protected: + // Override mousePressEvent to handle mouse clicks + void mousePressEvent(QGraphicsSceneMouseEvent* event) override; + +}; \ No newline at end of file diff --git a/leveleditor/src/TileProvider.cpp b/leveleditor/src/TileProvider.cpp new file mode 100644 index 0000000..07b8671 --- /dev/null +++ b/leveleditor/src/TileProvider.cpp @@ -0,0 +1,18 @@ +#include "TileProvider.hpp" + +TileProvider::TileProvider(std::vector<std::vector<uint32_t>> sprites) : sprites(sprites){} + +QPixmap TileProvider::get_tile(uint8_t id) { + QImage image(16, 16, QImage::Format::Format_ARGB32); + for (int y = 0; y < 16; y++) { + for (int x = 0; x < 16; x++) { + image.setPixel(x, y, 0xFF228B22); + } + } + return QPixmap::fromImage(image); +} + +TileProvider TileProvider::from_spritesheet(const std::string path) +{ + return TileProvider({}); +} diff --git a/leveleditor/src/TileProvider.hpp b/leveleditor/src/TileProvider.hpp new file mode 100644 index 0000000..c3fee5b --- /dev/null +++ b/leveleditor/src/TileProvider.hpp @@ -0,0 +1,12 @@ +#include <QPixmap> +#include <vector> + +class TileProvider { +public: + TileProvider(std::vector<std::vector<uint32_t>> sprites); + QPixmap get_tile(uint8_t id); + TileProvider static from_spritesheet(const std::string path); + +private: + std::vector<std::vector<uint32_t>> sprites; +}; \ No newline at end of file diff --git a/leveleditor/src/main.cpp b/leveleditor/src/main.cpp new file mode 100644 index 0000000..fdad82e --- /dev/null +++ b/leveleditor/src/main.cpp @@ -0,0 +1,12 @@ +#include <QApplication> +#include "MainWindow.hpp" + +int main(int argc, char *argv[]) { + QApplication app(argc, argv); + + MainWindow window; + window.resize(320, 320); // Adjust size as needed + window.show(); + + return app.exec(); +} \ No newline at end of file -- GitLab