/
Leonidvgol
/
Arkanoid
Обзор
Документация
Войти
/
Leonidvgol
/
Arkanoid
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
mainwindow.cpp
239 строк
10 KB
Leonid_Golovyrin
Изменено подключение BOX2D и вынесены папки levels, hearts
21 мар 2025, 18:31
21 мар 2025, 18:31
3694e9b
Код
Авторство
О чём код?
#include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), levelList(nullptr), scene(nullptr), view(nullptr), levelSelectionScreen(nullptr), nextGameScreen(nullptr), endGameScreen(nullptr) { setWindowTitle("ARKANOID"); resize(805, 605); stackedWidget = new QStackedWidget(this); // Создаем stackedWidget для переключения экранов setCentralWidget(stackedWidget); // Устанавливаем stackedWidget как центральный виджет levelSelectionScreen = new QWidget(this); // Экран выбора уровня QVBoxLayout *layout = new QVBoxLayout(levelSelectionScreen); QLabel *label = new QLabel("Select a level:", levelSelectionScreen); label->setAlignment(Qt::AlignCenter); layout->addWidget(label); levelList = new QListWidget(levelSelectionScreen); playButton = new QPushButton("Play", levelSelectionScreen); exitButton = new QPushButton("Exit Game", levelSelectionScreen); layout->addWidget(levelList); layout->addWidget(playButton); layout->addWidget(exitButton); loadLevels(); // Загружаем уровни connect(playButton, &QPushButton::clicked, this, &MainWindow::onLevelChosen); // Подключаем кнопки connect(levelList, &QListWidget::itemDoubleClicked, this, &MainWindow::onItemDoubleClicked); connect(exitButton, &QPushButton::clicked, this, &MainWindow::exitGame); stackedWidget->addWidget(levelSelectionScreen); // Добавляем экран выбора уровня nextGameScreen = new QWidget(this); // Экран завершения игры QVBoxLayout *nextGameLayout = new QVBoxLayout(nextGameScreen); QLabel *nextGameLabel = new QLabel(nextGameScreen); nextGameLabel->setAlignment(Qt::AlignCenter); nextGameLayout->addWidget(nextGameLabel); nextLevelButton = new QPushButton("The next level", nextGameScreen); levelSelectionButton = new QPushButton("Level Selection", nextGameScreen); exitButton = new QPushButton("Exit", nextGameScreen); nextGameLayout->addWidget(nextLevelButton); nextGameLayout->addWidget(levelSelectionButton); nextGameLayout->addWidget(exitButton); stackedWidget->addWidget(nextGameScreen); // Добавляем экран выбора следующего уровня connect(nextLevelButton, &QPushButton::clicked, this, &MainWindow::goToNextLevel); // Подключаем кнопки экрана завершения игры connect(levelSelectionButton, &QPushButton::clicked, this, &MainWindow::goToLevelSelection); connect(exitButton, &QPushButton::clicked, this, &MainWindow::exitGame); endGameScreen = new QWidget(this); // Экран завершения игры QVBoxLayout *endGameLayout = new QVBoxLayout(endGameScreen); QLabel *endGameLabel = new QLabel(endGameScreen); endGameLabel->setAlignment(Qt::AlignCenter); endGameLayout->addWidget(endGameLabel); restartLevelButton = new QPushButton("Restart the level", endGameScreen); levelSelectionButton = new QPushButton("Level Selection", endGameScreen); exitButton = new QPushButton("Exit", endGameScreen); endGameLayout->addWidget(restartLevelButton); endGameLayout->addWidget(levelSelectionButton); endGameLayout->addWidget(exitButton); stackedWidget->addWidget(endGameScreen); // Добавляем экран выбора следующего уровня connect(restartLevelButton, &QPushButton::clicked, this, &MainWindow::restartLevel); // Подключаем кнопки экрана завершения игры connect(levelSelectionButton, &QPushButton::clicked, this, &MainWindow::goToLevelSelection); connect(exitButton, &QPushButton::clicked, this, &MainWindow::exitGame); winGameScreen = new QWidget(this); // Экран победы QVBoxLayout *winGameLayout = new QVBoxLayout(winGameScreen); QLabel *winGameLabel = new QLabel(winGameScreen); winGameLabel->setAlignment(Qt::AlignCenter); winGameLayout->addWidget(winGameLabel); levelSelectionButton = new QPushButton("Level Selection", winGameScreen); exitButton = new QPushButton("Exit", winGameScreen); winGameLayout->addWidget(levelSelectionButton); winGameLayout->addWidget(exitButton); stackedWidget->addWidget(winGameScreen); // Добавляем экран выбора следующего уровня connect(levelSelectionButton, &QPushButton::clicked, this, &MainWindow::goToLevelSelection);// Подключаем кнопки экрана завершения игры connect(exitButton, &QPushButton::clicked, this, &MainWindow::exitGame); stackedWidget->setCurrentWidget(levelSelectionScreen); // Изначально показываем экран выбора уровня } MainWindow::~MainWindow() { delete scene; } void MainWindow::handleGameOver() { QLabel *endGameLabel = endGameScreen->findChild<QLabel *>(); if (endGameLabel) { endGameLabel->setText("Game Over! You lost. Try again."); } stackedWidget->setCurrentWidget(endGameScreen); } void MainWindow::handleLevelComplete() { QString nextLevelPath = projectPath + "/levels/Level" + QString::number(currentLevel + 1) + ".json"; if (!QFile::exists(nextLevelPath)) { emit winGame(); } else { QLabel *nextGameLabel = nextGameScreen->findChild<QLabel *>(); if (nextGameLabel) { nextGameLabel->setText("Congratulations! You completed the level."); } stackedWidget->setCurrentWidget(nextGameScreen); } } void MainWindow::handleWin() { QLabel *winGameLabel = winGameScreen->findChild<QLabel *>(); if (winGameLabel) { winGameLabel->setText("You WIN!"); } stackedWidget->setCurrentWidget(winGameScreen); } void MainWindow::goToNextLevel() { QString nextLevelPath = projectPath + "/levels/Level" + QString::number(currentLevel + 1) + ".json"; if (QFile::exists(nextLevelPath)) { setLevelSelected(nextLevelPath); } } void MainWindow::restartLevel() { QString restartLevelPath = projectPath + "/levels/Level" + QString::number(currentLevel) + ".json"; setLevelSelected(restartLevelPath); } void MainWindow::goToLevelSelection() { showLevelSelectionScreen(); } void MainWindow::showLevelSelectionScreen() { stackedWidget->setCurrentWidget(levelSelectionScreen); } void MainWindow::setLevelSelected(const QString &levelPath) { QRegularExpression regex("Level(\\d+)\\.json", QRegularExpression::CaseInsensitiveOption); QRegularExpressionMatch match = regex.match(levelPath); if (match.hasMatch()) { currentLevel = match.captured(1).toInt(); qDebug() << "Текущий уровень: " << currentLevel; } else { qDebug() << "Ошибка: не удалось определить номер уровня!"; return; } if (scene) { delete scene; } scene = new WorldScene(); scene->readJsonFile(levelPath); connect(scene, &WorldScene::gameOver, this, &MainWindow::handleGameOver); // Подключаем сигналы завершения игры и уровня connect(scene, &WorldScene::levelComplete, this, &MainWindow::handleLevelComplete); connect(this, &MainWindow::winGame, this, &MainWindow::handleWin); if (view) { delete view; // Удаляем старый view, если он существует } view = new QGraphicsView(scene, this); view->setRenderHint(QPainter::Antialiasing); // Добавляем view в stackedWidget stackedWidget->addWidget(view); // Переключаемся на экран игры stackedWidget->setCurrentWidget(view); } void MainWindow::loadLevels() { QString levelsDirPath = projectPath + "/levels"; QDir levelDir(levelsDirPath); if (!levelDir.exists()) { QMessageBox::warning(this, "Ошибка", "Каталог уровней не найден!"); return; } QStringList levelFiles = levelDir.entryList(QStringList() << "Level*.json", QDir::Files, QDir::Name); if (levelFiles.isEmpty()) { QMessageBox::information(this, "Информация", "Уровни не найдены."); return; } foreach (const QString &fileName, levelFiles) { QListWidgetItem *item = new QListWidgetItem(fileName, levelList); item->setData(Qt::UserRole, levelDir.filePath(fileName)); // Сохраняем полный путь } } void MainWindow::onLevelChosen() { QListWidgetItem *selectedItem = levelList->currentItem(); if (selectedItem) { QString levelPath = selectedItem->data(Qt::UserRole).toString(); setLevelSelected(levelPath); } } void MainWindow::onItemDoubleClicked(QListWidgetItem *item) { if (item) { QString levelPath = item->data(Qt::UserRole).toString(); setLevelSelected(levelPath); } } void MainWindow::showGameScreen() { stackedWidget->setCurrentWidget(view);// Переключаемся на экран игры } void MainWindow::resizeEvent(QResizeEvent *event) { QMainWindow::resizeEvent(event); // Масштабируем сцену при изменении размеров окна if (view) { view->fitInView(scene->sceneRect(), Qt::KeepAspectRatio); } } void MainWindow::exitGame() { close(); }