在上两篇文章中,我们实现了一个简单的塔防游戏,但是游戏功能还比较单一。接下来,我们对该塔防游戏进行优化,让它有更多的功能。
在本篇文章中我们要完成如下功能:
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();//判断该位置有没有buttonvoid setHasButton(bool hasButton=true);//设置是否有buttonvoid setButton(selectButton * button);//设置buttonselectButton * getButton();//得到该位置的buttonbool 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)
{veOne(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
本文发布于:2024-02-02 06:42:50,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170682736942060.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |