首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当健康值为0时如何退出Qt中的“游戏”

当健康值为0时如何退出Qt中的“游戏”
EN

Stack Overflow用户
提问于 2016-02-08 18:37:13
回答 1查看 1.2K关注 0票数 1

我对Qt非常陌生,但我开始尝试制作2D游戏。我有一个非常粗糙和简单的游戏开始,但我有一个问题。每当健康降到0,游戏就不会结束。我只想知道如何结束游戏,在做一个“游戏超过”屏幕之前,在哪里放置这个退出命令。我的代码如下所示,根据我所掌握的情况,我假设QApplication::Game.cpp ()进入了该文件。为此,可以从Health.cpp和Health.h获取健康整数,并将其放入Game.cpp中。任何帮助都是非常感谢的。这是代码,我觉得答案在于,如果需要更多的信息,询问。

Game.h

代码语言:javascript
运行
复制
#ifndef GAME_H
#define GAME_H

#include <QGraphicsView>
#include <QWidget>
#include <QGraphicsScene>
#include "Player.h"
#include "Score.h"
#include "Health.h"
#include "Level.h"
#include "Main.h"

class Game: public QGraphicsView{
public:
    Game(QWidget * parent=0);

    QGraphicsScene * scene;
    Player * player;
    Score * score;
    Health * health;
    Level * level;
    Main * close;
    int end();
};

#endif // GAME_H

Game.cpp

代码语言:javascript
运行
复制
#include "Game.h" 
#include <QTimer>
#include <QGraphicsTextItem>
#include <QFont>
#include "Enemy.h"
#include <QMediaPlayer>
#include <QBrush>
#include <QImage>
#include <QApplication>

Game::Game(QWidget *parent){
    // create the scene
    scene = new QGraphicsScene();
    scene->setSceneRect(0,0,800,600); // make the scene 800x600        instead of infinity by infinity (default)
    setBackgroundBrush(QBrush(QImage(":/images/bg.png")));

    // make the newly created scene the scene to visualize (since Game is a QGraphicsView Widget,
    // it can be used to visualize scenes)
    setScene(scene);
    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    setFixedSize(800,600);

    // create the player
    player = new Player();
    player->setPos(400,500); // TODO generalize to always be in the     middle bottom of screen
    // make the player focusable and set it to be the current focus
    player->setFlag(QGraphicsItem::ItemIsFocusable);
    player->setFocus();
    // add the player to the scene
    scene->addItem(player);

    // create the score/health
    score = new Score();
    scene->addItem(score);
    health = new Health();
    health->setPos(health->x(),health->y()+25);
    scene->addItem(health);
    level = new Level();
    scene->addItem(level);Bull
    level->setPos(level->x(),level->y()+50);

    // spawn enemies
    QTimer * timer = new QTimer();
    QObject::connect(timer,SIGNAL(timeout()),player,SLOT(spawn()));
    timer->start(2000);

    // play background music
    QMediaPlayer * music = new QMediaPlayer();
    music->setMedia(QUrl("qrc:/sounds/bgsound.mp3"));
    music->play();

    show();
}

int Game::end(){
    if (health == 0){
        QApplication::quit();
    }
    return 0;
}

Health.h

代码语言:javascript
运行
复制
#ifndef HEALTH_H
#define HEALTH_H

#include <QGraphicsTextItem>

class Health: public QGraphicsTextItem{
public:
    Health(QGraphicsItem * parent=0);
    void decrease();
    int getHealth();
private:
    int health;
};

#endif // HEALTH_H

Health.cpp

代码语言:javascript
运行
复制
#include "Health.h"
#include <QFont>
#include <QApplication>

Health::Health(QGraphicsItem *parent): QGraphicsTextItem(parent){
    // initialize the score to 0
    health = 3;

    // draw the text
    setPlainText(QString("Health: ") + QString::number(health)); //   Health: 3
    setDefaultTextColor(Qt::red);
    setFont(QFont("times",16));
}

void Health::decrease(){
    health--;
    setPlainText(QString("Health: ") + QString::number(health)); //     Health: 2
}

int Health::getHealth(){
    return health;
}

main.cpp

代码语言:javascript
运行
复制
#include <QApplication>
#include "Game.h"
#include "Main.h"

Game * game;

int main(int argc, char *argv[]){
    QApplication a(argc, argv);

    game = new Game();
    game->show();

    return a.exec();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-08 19:03:10

您的end()函数从未被调用过。

实现您想要的目标的最好方法是使用Qt信号/插槽机构。将事件(信号)连接到动作(时隙)很容易:

  • Q_OBJECT宏添加到HealthGame类,并确保编译环境对两个头文件进行moc's
  • Health中声明一个名为dead()signal
  • Health::decrease()发出信号
  • Game::end()成为slot,成为void
  • Health::dead()连接到Game::end()

然后,一旦Game::end()达到零,Health就会被调用。

代码语言:javascript
运行
复制
class Health: public QGraphicsTextItem 
{
    Q_OBJECT
public:
    Health(QGraphicsItem * parent=0);
    void decrease();
    int getHealth();
signals:
    void dead();
private:
    int health;
};

...

class Game: public QGraphicsView{
    Q_OBJECT
public:
    ...

public slots:
    void end();
};

...

void Health::decrease(){
    health--;
    setPlainText(QString("Health: ") + QString::number(health));
    if ( health == 0 )
        emit dead();
}

...

Game::Game(QWidget *parent){

    ...

    connect( health, SIGNAL(dead()), this, SLOT(end()) );

}

...

void Game::end(){
    // no need to test health anymore, as signal is emited when health is zero
    // do some extra stuff before exiting
    QApplication::quit();
}

如果end()只调用QApplication::quit(),则可以删除它并将信号直接连接到QApplication::quit(),如下所示:

代码语言:javascript
运行
复制
connect( health, SIGNAL(dead()), qApp, SLOT(quit()) );

还请注意,您正在Game::end()中测试Game::end(),但是health是一个指针,从代码来看,它永远不会是0 (您可能打算编写if ( health->getHealth() == 0 ) )。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35276849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档