Qt之塔防游戏 c++ (三)

本文介绍了如何在Qt中进一步优化塔防游戏,包括实现多样化的防御塔选择、防御塔升级和移除功能,以及添加多关卡供玩家选择。通过创建新的UI元素和调整代码,详细阐述了具体实现步骤,为游戏增加了更多趣味性和挑战性。

在上两篇文章中,我们实现了一个简单的塔防游戏,但是游戏功能还比较单一。接下来,我们对该塔防游戏进行优化,让它有更多的功能。

在本篇文章中我们要完成如下功能:
1:实现多样化选择防御塔
2:对防御塔进行升级和移除
3:实现多关卡的绘制,供玩家选择
4:细微处的完善

我们开始吧!

实现多样化选择防御塔
要实现选择防御塔,我们要先构造一个选择框,即完成selectButton类。

先添加selectButton类文件
selectButton.h中的实现:

#ifndef SELECTBUTTON_H
#define SELECTBUTTON_H

#include <QPainter>
#include <QString>
#include <QPoint>
#include <QSize>

#include "mainwindow.h"

class MainWindow;

class selectButton
{
   
   
public:
    selectButton(QPoint pos,MainWindow * game);
    ~selectButton();
    
    void draw(QPainter * painter)const;//绘画选择框
    void getRemoved();//选择框被点击了以后,就要被移除
    bool containPos(QPoint pos);//判断鼠标的点击点,是否在选择框的内部
    QPoint getPos();//得到选择框的左上店
private:
    MainWindow * m_game;//指向mainwindow的指针
    QPoint m_pos;//selectButton图片的左上角
    QString m_selectBoxImagePath[3];//用来储存选择框内的防御塔的图片,我设置的三个防御塔可以选择,就储存三张图片
    
    static const QSize m_fixedSize;
};
#endif // SELECTBUTTON_H

同时,在TowerPosition.h中进行相应的添加:

//类外
#include "selectbutton.h"

class selectButton;
//类内
public:
    bool hasButton();//判断该位置有没有button
    void setHasButton(bool hasButton=true);//设置是否有button
    void setButton(selectButton * button);//设置button
    selectButton * getButton();//得到该位置的button
    
    bool hasTower1();//判断是否有第一种塔
    void setHasTower1(bool hasTower1=true);//判断是否有第一种塔
    
    bool hasTower2();
    void setHasTower2(bool hasTower2=true);
    
    bool HasTower3();
    void setHasTower3(bool hasTower3=true);
private:
    bool m_hasButton;
    bool m_hasTower1;
    bool m_hasTower2;
    bool m_hasTower3;

    selectButton * m_button;//私有化button

TowerPosition.cpp中对其进行实现:

//构造函数中添加:
    m_hasTower1(false),
    m_hasTower2(false),
    m_hasTower3(false),
    m_hasButton(false)

//其他函数
bool TowerPosition::hasButton()
{
   
   
    return m_hasButton;
}

void TowerPosition::setHasButton(bool hasButton)
{
   
   
    m_hasButton=hasButton;
}

void TowerPosition::setButton(selectButton *button)
{
   
   
    m_button=button;
}

selectButton * TowerPosition::getButton()
{
   
   
    return m_button;
}

void TowerPosition::setHasTower1(bool hasTower1)
{
   
   
    this->m_hasTower1=hasTower1;
    setHasTower(hasTower1);
}


bool TowerPosition::hasTower1()
{
   
   
    return m_hasTower1;
}

void TowerPosition::setHasTower2(bool hasTower2)
{
   
   
    this->m_hasTower2=hasTower2;
    setHasTower(hasTower2);
}

bool TowerPosition::hasTower2()
{
   
   
    return m_hasTower2;
}

void TowerPosition::setHasTower3(bool hasTower3)
{
   
   
    m_hasTower3=hasTower3;
    setHasTower(hasTower3);
}

bool TowerPosition::hasTower3()
{
   
   
    return m_hasTower3;
}

然后到mainwindow.h中,添加有关button的代码:

//类外
#include "selectbutton.h"
class selectButton;

//类内
publicbool canBuyTower();//判断是否可以买第一种塔,这个我们原来已经写过了
    bool canBuyTower2();//判断是否可以买第二种塔
    bool canBuyTower3();//判断是否可以买第三种塔
    void removeButton(selectButton * button);//在mainwindow中对button进行移除
private:
    QList<selectButton * > m_selectButtonList;//用来储存selectButton的list

mainwindow.cpp中对上面的代码进行实现:

#include "selectButton"

bool MainWindow::canBuyTower2()
{
   
   
    if(m_playerGlod>=400)
    {
   
   
        return true;
    }
    return false;
}

bool MainWindow::canBuyTower3()
{
   
   
    if(m_playerGlod>=500)
    {
   
   
        return true;
    }
    return false;
}

void MainWindow::removeButton(selectButton *button)
{
   
   
    m_selectButtonList.removeOne(button);
}

ok,我们已经把button和其他的类做了一个连接,现在我们返回selectButton.cpp中,对selectButton类进行实现:

#include "selectbutton.h"

const QSize selectButton::m_fixedSize(105,35);

selectButton::selectButton(QPoint pos,MainWindow * game):
    m_game(game),
    m_pos(pos)
{
   
   
    //三张图片的路径信息 
    m_selectBoxImagePath[0]=":/images/tower1.jpg";
    m_selectBoxImagePath[1]=":/images/tower2.png";
    m_selectBoxImagePath[2]=":/images/tower3.png";
}

selectButton::~selectButton()
{
   
   
    m_game=NULL;
}

void selectButton::draw(QPainter *painter) const
{
   
   
    painter->save();
    painter->drawPixmap(m_pos.x(),m_pos.y(),m_selectBoxImagePath[0]);
    painter->drawPixmap(m_pos.x()+35,m_pos.y(),m_selectBoxImagePath[1]);
    painter->drawPixmap(m_pos.x()+70,m_pos.y(),m_selectBoxImagePath[2]);
    painter->restore();
}

void selectButton::getRemoved()
{
   
   
    m_game->removeButton(this);
}

bool selectButton::containPos(QPoint pos)
{
   
   
    bool xInhere=pos.x()>m_pos.x() && pos.x()<m_pos.x()+m_fixedSize.width();
    bool yInhere=pos.y()>m_pos.y() && pos.y()<m_pos.y()+m_fixedSize.height();
    return xInhere && yInhere;
}

QPoint selectButton::getPos()
{
   
   
    return this->m_pos;
}

现在对mainwindow.cpp中的mousePressEvent()进行改造使其能够完成防御塔的选择,在此之前,为了实现不同防御塔的不同图片,我们需要回到tower.h中,把tower的构造函数修改成:

Tower(QPoint pos,MainWindow * game,QString path,int damage);

同时在tower.cpp中,构造函数的实现也需要相应的修改,我只截取出修改的部分:

Tower::Tower(QPoint pos,MainWindow * game,QString path,int damage):
    m_attacking(false)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值