在上两篇文章中,我们实现了一个简单的塔防游戏,但是游戏功能还比较单一。接下来,我们对该塔防游戏进行优化,让它有更多的功能。
在本篇文章中我们要完成如下功能:
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;
//类内
public:
bool 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)

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

被折叠的 条评论
为什么被折叠?



