|
|
|
|
#include "gamewidget.h"
|
|
|
|
|
#include "ui_gamewidget.h"
|
|
|
|
|
#include"gamecontrol.h"
|
|
|
|
|
#include"mydialog.h"
|
|
|
|
|
#include "Collision.h"
|
|
|
|
|
#include <QtMath>
|
|
|
|
|
|
|
|
|
|
GameWidget* GameWidget::widget = nullptr;
|
|
|
|
|
|
|
|
|
|
GameWidget::GameWidget(QWidget *parent)
|
|
|
|
|
: QWidget(parent)
|
|
|
|
|
, ui(new Ui::GameWidget)
|
|
|
|
|
{
|
|
|
|
|
ui->setupUi(this);
|
|
|
|
|
widget =this;
|
|
|
|
|
setWindowTitle("Chiikawaおっきい討伐");
|
|
|
|
|
setWindowIcon(QIcon(":/icons/img/windowicon.png"));
|
|
|
|
|
setFixedSize(900, 700);
|
|
|
|
|
|
|
|
|
|
mGameView.setParent(this);
|
|
|
|
|
mGameView.setSceneRect(QRect(0,0,900,700));
|
|
|
|
|
|
|
|
|
|
this->Init_Start();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GameWidget::~GameWidget()
|
|
|
|
|
{
|
|
|
|
|
delete ui;
|
|
|
|
|
//qDebug()<<"widget released";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::Init_Start()
|
|
|
|
|
{
|
|
|
|
|
mStartScene.setSceneRect(QRect(0,0,900,700));
|
|
|
|
|
//设置背景图
|
|
|
|
|
mStartScene.addPixmap(QPixmap(":/backgrouds/img/StartBackground.png"));
|
|
|
|
|
|
|
|
|
|
//按钮音效
|
|
|
|
|
ButtonAudioplayer = new QMediaPlayer(this);
|
|
|
|
|
//QUrl ButtonAudioplayeraudioUrl = QUrl::fromLocalFile("qrc:/sfx/sounds/effcet_ui_button.ogg");
|
|
|
|
|
ButtonAudioplayer->setMedia(QUrl("qrc:/sfx/sounds/effcet_ui_button.ogg"));
|
|
|
|
|
|
|
|
|
|
//开始按钮
|
|
|
|
|
startBtn = new myButton(this);
|
|
|
|
|
startBtn->setAutoRaise(true);
|
|
|
|
|
startBtn->setFixedSize(182,52);
|
|
|
|
|
startBtn->setIcon(QIcon(":/ui/img/ui/startBtn.png"));
|
|
|
|
|
startBtn->setIconSize(QSize(182,52));
|
|
|
|
|
startBtn->move(100,140);
|
|
|
|
|
|
|
|
|
|
//记录按钮
|
|
|
|
|
detailBtn = new myButton(this);
|
|
|
|
|
detailBtn->setAutoRaise(true);
|
|
|
|
|
detailBtn->setFixedSize(182,52);
|
|
|
|
|
detailBtn->setIcon(QIcon(":/ui/img/ui/detailBtn.png"));
|
|
|
|
|
detailBtn->setIconSize(QSize(182,52));
|
|
|
|
|
detailBtn->move(100,200);
|
|
|
|
|
connect(detailBtn,&QToolButton::clicked,[this](){
|
|
|
|
|
//ButtonAudioplayer->setMedia(QUrl("qrc:/sfx/sounds/effcet_ui_button.ogg"));
|
|
|
|
|
QUrl ButtonAudioplayeraudioUrl = QUrl("qrc:/sfx/sounds/effcet_ui_button.ogg");
|
|
|
|
|
ButtonAudioplayer->setMedia(QMediaContent(ButtonAudioplayeraudioUrl));
|
|
|
|
|
ButtonAudioplayer->play();
|
|
|
|
|
myDialog details(this);
|
|
|
|
|
details.exec();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
//退出按钮
|
|
|
|
|
exitBtn = new myButton(this);
|
|
|
|
|
exitBtn->setAutoRaise(true);
|
|
|
|
|
exitBtn->setFixedSize(182,52);
|
|
|
|
|
exitBtn->setIcon(QIcon(":/ui/img/ui/exitBtn.png"));
|
|
|
|
|
exitBtn->setIconSize(QSize(182,52));
|
|
|
|
|
exitBtn->move(100,300);
|
|
|
|
|
|
|
|
|
|
connect(exitBtn,&QToolButton::clicked,[this](){
|
|
|
|
|
close();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
//返回主页按钮
|
|
|
|
|
backBtn = new myButton(this);
|
|
|
|
|
backBtn->setAutoRaise(true);
|
|
|
|
|
backBtn->setFixedSize(182,52);
|
|
|
|
|
backBtn->setIcon(QIcon(":/ui/img/ui/backBtn.png"));
|
|
|
|
|
backBtn->setIconSize(QSize(182,52));
|
|
|
|
|
backBtn->move(600,200);
|
|
|
|
|
backBtn->hide();
|
|
|
|
|
|
|
|
|
|
connect(backBtn,&QToolButton::clicked,[this](){
|
|
|
|
|
pauseBTN->hide();
|
|
|
|
|
ButtonAudioplayer->setMedia(QUrl("qrc:/sfx/sounds/effcet_ui_button.ogg"));
|
|
|
|
|
ButtonAudioplayer->play();
|
|
|
|
|
WinBGMplayer->stop();
|
|
|
|
|
GameOver();
|
|
|
|
|
mGameView.setScene(&mStartScene);
|
|
|
|
|
startBtn->show();
|
|
|
|
|
detailBtn->show();
|
|
|
|
|
restartBtn->hide();
|
|
|
|
|
exitBtn->move(100,300);
|
|
|
|
|
backBtn->hide();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//重新开始按钮
|
|
|
|
|
restartBtn = new myButton(this);
|
|
|
|
|
restartBtn->setAutoRaise(true);
|
|
|
|
|
restartBtn->setFixedSize(182,52);
|
|
|
|
|
restartBtn->setIcon(QIcon(":/ui/img/ui/onceMoreBtn.png"));
|
|
|
|
|
restartBtn->setIconSize(QSize(182,52));
|
|
|
|
|
restartBtn->hide();
|
|
|
|
|
|
|
|
|
|
connect(restartBtn,&QToolButton::clicked,[this](){
|
|
|
|
|
ButtonAudioplayer->setMedia(QUrl("qrc:/sfx/sounds/effcet_ui_button.ogg"));
|
|
|
|
|
ButtonAudioplayer->play();
|
|
|
|
|
WinBGMplayer->stop();
|
|
|
|
|
restartGame();
|
|
|
|
|
continueBtn->hide();
|
|
|
|
|
restartBtn->hide();
|
|
|
|
|
backBtn->hide();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
//点击按钮后加载游戏场景
|
|
|
|
|
connect(startBtn,&QToolButton::clicked,[this](){
|
|
|
|
|
//加载游戏场景
|
|
|
|
|
ButtonAudioplayer->setMedia(QUrl("qrc:/sfx/sounds/effcet_ui_button.ogg"));
|
|
|
|
|
ButtonAudioplayer->setVolume(100);
|
|
|
|
|
ButtonAudioplayer->play();
|
|
|
|
|
if(beginTimes == 0)
|
|
|
|
|
{
|
|
|
|
|
Init_Game();
|
|
|
|
|
startBtn->hide();
|
|
|
|
|
detailBtn->hide();
|
|
|
|
|
exitBtn->hide();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
restartGame();
|
|
|
|
|
}
|
|
|
|
|
beginTimes++;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mGameView.setScene(&mStartScene);
|
|
|
|
|
mGameView.show();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::Init_Game()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//设置图片
|
|
|
|
|
mGameScene.setSceneRect(QRect(0,0,900,700));
|
|
|
|
|
mGameScene.addPixmap(QPixmap(":/backgrouds/img/GameBackground.png"));
|
|
|
|
|
|
|
|
|
|
mPlayer.setScale(0.15);
|
|
|
|
|
mPlayer.setPos(200,200);
|
|
|
|
|
mPlayer.setZValue(1);
|
|
|
|
|
mGameScene.addItem(&mPlayer);
|
|
|
|
|
|
|
|
|
|
//设置光标
|
|
|
|
|
QCursor cursor(QPixmap(":/icons/img/cursor.png"));
|
|
|
|
|
QApplication::setOverrideCursor(cursor);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//游戏背景音乐
|
|
|
|
|
BGMplayer = new QMediaPlayer(this);
|
|
|
|
|
BGMplayer->setMedia(QUrl("qrc:/bgm/sounds/gameBGM.MP3"));
|
|
|
|
|
BGMplayer->setVolume(100);
|
|
|
|
|
BGMplayer->play();
|
|
|
|
|
|
|
|
|
|
BGMTimer = new QTimer(this);
|
|
|
|
|
BGMTimer->start(32000);
|
|
|
|
|
connect(BGMTimer, &QTimer::timeout, [this]() {
|
|
|
|
|
BGMplayer->setMedia(QUrl("qrc:/bgm/sounds/gameBGM.MP3"));
|
|
|
|
|
BGMplayer->play(); // 重新播放
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//胜利音乐配置
|
|
|
|
|
WinBGMplayer = new QMediaPlayer(this);
|
|
|
|
|
// WinBGMOutput = new QAudioOutput(this);
|
|
|
|
|
// WinBGMplayer->setAudioOutput(WinBGMOutput);
|
|
|
|
|
WinBGMplayer->setMedia(QUrl("qrc:/bgm/sounds/winBGM.mp3"));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//升级音效
|
|
|
|
|
// LevelUPAudioplayer = new QMediaPlayer(this);
|
|
|
|
|
// LevelUPAudioOutput = new QAudioOutput(this);
|
|
|
|
|
// LevelUPAudioplayer->setAudioOutput(LevelUPAudioOutput);
|
|
|
|
|
// LevelUPAudioplayer->setSource(QUrl("qrc:/sfx/sounds/effcet_sfx_levelup.ogg"));
|
|
|
|
|
LevelUPAudioplayer = new QMediaPlayer(this);
|
|
|
|
|
QUrl LevelUPAudioplayeraudioUrl = QUrl("qrc:/sfx/sounds/effcet_sfx_levelup.ogg");
|
|
|
|
|
LevelUPAudioplayer->setVolume(20);
|
|
|
|
|
LevelUPAudioplayer->setMedia(QMediaContent(LevelUPAudioplayeraudioUrl));
|
|
|
|
|
|
|
|
|
|
//开启定时器
|
|
|
|
|
setTimer();
|
|
|
|
|
startTimer();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mGameView.setScene(&mGameScene);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//设置暂停按钮
|
|
|
|
|
pauseBTN = new myButton(this);
|
|
|
|
|
pauseBTN->move(874,0);
|
|
|
|
|
pauseBTN->setFixedSize(26,26);
|
|
|
|
|
pauseBTN->setIcon(QIcon(":/icons/img/pausebtn.png"));
|
|
|
|
|
pauseBTN->setIconSize(QSize(26,26));
|
|
|
|
|
//pauseBTN->setAutoRaise(true);
|
|
|
|
|
pauseBTN->show();
|
|
|
|
|
connect(pauseBTN,&QToolButton::clicked,[this](){
|
|
|
|
|
ButtonAudioplayer->setMedia(QUrl("qrc:/sfx/sounds/effcet_ui_button.ogg"));
|
|
|
|
|
ButtonAudioplayer->play();
|
|
|
|
|
|
|
|
|
|
if(isChoosing)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else if(!isStopped)
|
|
|
|
|
{
|
|
|
|
|
stopTimer();
|
|
|
|
|
continueBtn->move(600,260);
|
|
|
|
|
restartBtn->move(600,140);
|
|
|
|
|
backBtn->move(600,200);
|
|
|
|
|
grayBackground = new GameObject();
|
|
|
|
|
grayBackground->setPixmap(QPixmap(":/backgrouds/img/grayBackground.png"));
|
|
|
|
|
grayBackground->setZValue(1.5);
|
|
|
|
|
mGameScene.addItem(grayBackground);
|
|
|
|
|
continueBtn->show();
|
|
|
|
|
restartBtn->show();
|
|
|
|
|
backBtn->show();
|
|
|
|
|
this->isStopped = !this->isStopped;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
startTimer();
|
|
|
|
|
mGameScene.removeItem(grayBackground);
|
|
|
|
|
if(grayBackground != nullptr) delete grayBackground;
|
|
|
|
|
continueBtn->hide();
|
|
|
|
|
restartBtn->hide();
|
|
|
|
|
backBtn->hide();
|
|
|
|
|
this->isStopped = !this->isStopped;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//继续游戏按钮
|
|
|
|
|
continueBtn = new myButton(this);
|
|
|
|
|
continueBtn->setAutoRaise(true);
|
|
|
|
|
continueBtn->setFixedSize(182,52);
|
|
|
|
|
continueBtn->setIcon(QIcon(":/ui/img/ui/continueBtn.png"));
|
|
|
|
|
continueBtn->setIconSize(QSize(182,52));
|
|
|
|
|
continueBtn->hide();
|
|
|
|
|
|
|
|
|
|
connect(continueBtn,&QToolButton::clicked,pauseBTN,&QToolButton::click);
|
|
|
|
|
|
|
|
|
|
QFont font("宋体",11,75);
|
|
|
|
|
|
|
|
|
|
//设置属性栏
|
|
|
|
|
setProperties();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//升级获得物品
|
|
|
|
|
connect(&mPlayer,&Player::LevelUp,[this](){
|
|
|
|
|
|
|
|
|
|
stopTimer();
|
|
|
|
|
//BGMplayer->play();
|
|
|
|
|
|
|
|
|
|
int x=1,y=1,z=1;
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
x = QRandomGenerator::global()->bounded(0,GameDefine::TotalItemNum);
|
|
|
|
|
y = QRandomGenerator::global()->bounded(0,GameDefine::TotalItemNum);
|
|
|
|
|
z = QRandomGenerator::global()->bounded(0,GameDefine::TotalItemNum);
|
|
|
|
|
}while(x==y || x== z || y==z);
|
|
|
|
|
opt1 = x;
|
|
|
|
|
opt2 = y;
|
|
|
|
|
opt3 = z;
|
|
|
|
|
if(optBtn1 != nullptr) delete optBtn1;
|
|
|
|
|
if(optBtn2 != nullptr) delete optBtn2;
|
|
|
|
|
if(optBtn3 != nullptr) delete optBtn3;
|
|
|
|
|
optBtn1 = new mySelectiveButton(x,this);
|
|
|
|
|
optBtn2 = new mySelectiveButton(y,this);
|
|
|
|
|
optBtn3 = new mySelectiveButton(z,this);
|
|
|
|
|
optBtn1->move(250,120);
|
|
|
|
|
optBtn2->move(400,120);
|
|
|
|
|
optBtn3->move(550,120);
|
|
|
|
|
|
|
|
|
|
connect(optBtn1,&QToolButton::clicked,[this](){
|
|
|
|
|
|
|
|
|
|
//获得道具...
|
|
|
|
|
mPlayer.getItem(opt1);
|
|
|
|
|
emit this->isSelected();//发送选择完毕信号 刷新数值显示
|
|
|
|
|
});
|
|
|
|
|
connect(optBtn2,&QToolButton::clicked,[this](){
|
|
|
|
|
|
|
|
|
|
//获得道具...
|
|
|
|
|
mPlayer.getItem(opt2);
|
|
|
|
|
emit this->isSelected();
|
|
|
|
|
});
|
|
|
|
|
connect(optBtn3,&QToolButton::clicked,[this](){
|
|
|
|
|
|
|
|
|
|
//获得道具...
|
|
|
|
|
mPlayer.getItem(opt3);
|
|
|
|
|
emit this->isSelected();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
optBtn1->show();
|
|
|
|
|
optBtn2->show();
|
|
|
|
|
optBtn3->show();
|
|
|
|
|
|
|
|
|
|
//选择道具后继续游戏
|
|
|
|
|
connect(this,&GameWidget::isSelected,[this](){
|
|
|
|
|
ButtonAudioplayer->setMedia(QUrl("qrc:/sfx/sounds/effcet_ui_button.ogg"));
|
|
|
|
|
ButtonAudioplayer->play();
|
|
|
|
|
optBtn1->hide();
|
|
|
|
|
optBtn2->hide();
|
|
|
|
|
optBtn3->hide();
|
|
|
|
|
startTimer();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//连接游戏结束
|
|
|
|
|
connect(&mPlayer,&Player::isDead,[this](){
|
|
|
|
|
this->GameOver();
|
|
|
|
|
HPlabel->hide();
|
|
|
|
|
HPRecoverylabel->hide();
|
|
|
|
|
HPPlunderlabel->hide();
|
|
|
|
|
AttackRatiolabel->hide();
|
|
|
|
|
AttackPointlabel->hide();
|
|
|
|
|
AttackSpeedlabel->hide();
|
|
|
|
|
Defencelabel->hide();
|
|
|
|
|
SpeedRatiolabel->hide();
|
|
|
|
|
EXPRatiolabel->hide();
|
|
|
|
|
pauseBTN->hide();
|
|
|
|
|
HPBar->hide();
|
|
|
|
|
experienceBar->hide();
|
|
|
|
|
LevelLabel->hide();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::restartGame()
|
|
|
|
|
{
|
|
|
|
|
mGameView.setScene(&mGameScene);
|
|
|
|
|
if(isStopped)
|
|
|
|
|
{
|
|
|
|
|
mGameScene.removeItem(grayBackground);
|
|
|
|
|
if(grayBackground != nullptr) delete grayBackground;
|
|
|
|
|
backBtn->hide();
|
|
|
|
|
continueBtn->hide();
|
|
|
|
|
isStopped = 0;
|
|
|
|
|
}
|
|
|
|
|
startBtn->hide();
|
|
|
|
|
detailBtn->hide();
|
|
|
|
|
exitBtn->hide();
|
|
|
|
|
|
|
|
|
|
//重置光标
|
|
|
|
|
QCursor cursor(QPixmap(":/icons/img/cursor.png"));
|
|
|
|
|
QApplication::setOverrideCursor(cursor);
|
|
|
|
|
|
|
|
|
|
//重置角色
|
|
|
|
|
mPlayer.resetPlayer();
|
|
|
|
|
mPlayer.setPos(200,200);
|
|
|
|
|
|
|
|
|
|
//显示信息
|
|
|
|
|
pauseBTN->show();
|
|
|
|
|
LevelLabel->show();
|
|
|
|
|
LevelLabel->setText(" Lv:1");
|
|
|
|
|
resetHPBar();
|
|
|
|
|
HPBar->show();
|
|
|
|
|
experienceBar->show();
|
|
|
|
|
experienceBar->setValue(0);
|
|
|
|
|
experienceBar->setFormat(" EXP:0/100");
|
|
|
|
|
|
|
|
|
|
//时间重置
|
|
|
|
|
gameClock->show();
|
|
|
|
|
gameClock->display(GameDefine::GameTime);
|
|
|
|
|
resetProperties();
|
|
|
|
|
startTimer();
|
|
|
|
|
BGMplayer->setMedia(QUrl("qrc:/bgm/sounds/gameBGM.MP3"));
|
|
|
|
|
BGMplayer->play();
|
|
|
|
|
BGMTimer->start(32000);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//清除怪物与子弹
|
|
|
|
|
int enemyNum = mEnemyList.size();
|
|
|
|
|
for(int i = enemyNum-1; i >= 0; i--)
|
|
|
|
|
{
|
|
|
|
|
//qDebug()<<"delete enemy";
|
|
|
|
|
mGameScene.removeItem(mEnemyList[i]);
|
|
|
|
|
if(mEnemyList[i] != nullptr) mEnemyList[i]->deleteLater();
|
|
|
|
|
mEnemyList.removeOne(mEnemyList[i]);
|
|
|
|
|
}
|
|
|
|
|
int enemyBulletNum = mEnemyBulletList.size();
|
|
|
|
|
for(int i = enemyBulletNum-1; i >= 0; i--)
|
|
|
|
|
{
|
|
|
|
|
mGameScene.removeItem(mEnemyBulletList[i]);
|
|
|
|
|
if(mEnemyBulletList[i] != nullptr) mEnemyBulletList[i]->deleteLater();
|
|
|
|
|
mEnemyBulletList.removeOne(mEnemyBulletList[i]);
|
|
|
|
|
}
|
|
|
|
|
int playerBulletNum = mBulletList.size();
|
|
|
|
|
for(int i = playerBulletNum-1; i >= 0; i--)
|
|
|
|
|
{
|
|
|
|
|
mGameScene.removeItem(mBulletList[i]);
|
|
|
|
|
if(mBulletList[i] != nullptr) mBulletList[i]->deleteLater();
|
|
|
|
|
mBulletList.removeOne(mBulletList[i]);
|
|
|
|
|
}
|
|
|
|
|
int expBallNum = mExpBallList.size();
|
|
|
|
|
for(int i = expBallNum-1; i >= 0; i--)
|
|
|
|
|
{
|
|
|
|
|
mGameScene.removeItem(mExpBallList[i]);
|
|
|
|
|
if(mExpBallList[i] != nullptr) mExpBallList[i]->deleteLater();
|
|
|
|
|
mExpBallList.removeOne(mExpBallList[i]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::setTimer()
|
|
|
|
|
{
|
|
|
|
|
//设置定时器
|
|
|
|
|
playerMoveTimer = new QTimer(this);
|
|
|
|
|
playerShootTimer = new QTimer(this);
|
|
|
|
|
bulletMoveTimer = new QTimer(this);
|
|
|
|
|
playerUpdateTimer = new QTimer(this);
|
|
|
|
|
//enemySummonTimer = new QTimer(this);
|
|
|
|
|
enemyMoveTimer = new QTimer(this);
|
|
|
|
|
connect(playerMoveTimer,&QTimer::timeout,[this](){
|
|
|
|
|
playerMove();//玩家移动
|
|
|
|
|
getExp();//检测获取经验
|
|
|
|
|
player_enemyCollision();
|
|
|
|
|
});
|
|
|
|
|
connect(playerShootTimer,&QTimer::timeout,[this](){
|
|
|
|
|
mPlayer.playerShoot(playerBulletDir);
|
|
|
|
|
//qDebug() << "Starting playerShootTimer with interval:" << mPlayer.getAttackInterval();
|
|
|
|
|
});
|
|
|
|
|
connect(bulletMoveTimer,&QTimer::timeout,[this](){
|
|
|
|
|
for(auto bullet : mBulletList){
|
|
|
|
|
bullet->Bullet::BulletMove();
|
|
|
|
|
}
|
|
|
|
|
for(auto enemyBullet : mEnemyBulletList){
|
|
|
|
|
enemyBullet->Bullet::BulletMove();
|
|
|
|
|
}
|
|
|
|
|
//检测碰撞
|
|
|
|
|
bullet_enemyCollision();
|
|
|
|
|
bullet_playerCollision();
|
|
|
|
|
//出界检测
|
|
|
|
|
releaseOutBullet();
|
|
|
|
|
releaseOutEnemyBullet();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
connect(playerUpdateTimer,&QTimer::timeout,&mPlayer,&Player::picUpdate);
|
|
|
|
|
// connect(enemySummonTimer,&QTimer::timeout,[this](){
|
|
|
|
|
// // enemyInsSummon();
|
|
|
|
|
// // enemyChimeraSummon();
|
|
|
|
|
|
|
|
|
|
// });
|
|
|
|
|
connect(enemyMoveTimer,&QTimer::timeout,[this](){
|
|
|
|
|
//testEnemy->enemyMove();
|
|
|
|
|
for(auto enemy : mEnemyList){
|
|
|
|
|
enemy->enemyMove();
|
|
|
|
|
enemy->setMirrorPixmap();//怪物移动与面朝方向
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
//设置倒计时
|
|
|
|
|
|
|
|
|
|
standardTimer = new QTimer(this);
|
|
|
|
|
gameClock = new QLCDNumber(this);
|
|
|
|
|
gameClock->setFixedSize(80,40);
|
|
|
|
|
gameClock->move(410,35);
|
|
|
|
|
gameClock->display(GameDefine::GameTime);
|
|
|
|
|
gameClock->setStyleSheet("QLCDNumber{padding: 1px;"
|
|
|
|
|
"color: rgb(255,0,0);"
|
|
|
|
|
"border-style: solid;"
|
|
|
|
|
"border: 2px solid black;"
|
|
|
|
|
"border-radius: 8px;"
|
|
|
|
|
"width:50px;"
|
|
|
|
|
"background-color: rgb(255,255,255);}");
|
|
|
|
|
|
|
|
|
|
gameClock->setSegmentStyle(QLCDNumber::Flat);
|
|
|
|
|
|
|
|
|
|
gameClock->show();
|
|
|
|
|
|
|
|
|
|
connect(standardTimer,&QTimer::timeout,[this](){
|
|
|
|
|
int val = this->gameClock->intValue();
|
|
|
|
|
GameControl::Instance()->EnemySummonControl(val);
|
|
|
|
|
if(val <= 0)
|
|
|
|
|
{
|
|
|
|
|
stopTimer();
|
|
|
|
|
GameWin();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
this->gameClock->display(val-1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::startTimer()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
isRunning = 1;
|
|
|
|
|
//开启定时器
|
|
|
|
|
|
|
|
|
|
playerMoveTimer->start(GameDefine::GameViewUpdateTime);
|
|
|
|
|
bulletMoveTimer->start(GameDefine::GameViewUpdateTime);
|
|
|
|
|
|
|
|
|
|
enemyMoveTimer->start(GameDefine::GameViewUpdateTime);
|
|
|
|
|
|
|
|
|
|
//enemySummonTimer->start(3000);
|
|
|
|
|
playerUpdateTimer->start(30);
|
|
|
|
|
|
|
|
|
|
standardTimer->start(1000);
|
|
|
|
|
|
|
|
|
|
//开启音乐
|
|
|
|
|
//BGMplayer->play();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::stopTimer()
|
|
|
|
|
{
|
|
|
|
|
isRunning = 0;
|
|
|
|
|
//暂停定时器
|
|
|
|
|
playerMoveTimer->stop();
|
|
|
|
|
bulletMoveTimer->stop();
|
|
|
|
|
//enemySummonTimer->stop();
|
|
|
|
|
enemyMoveTimer->stop();
|
|
|
|
|
playerShootTimer->stop();
|
|
|
|
|
playerUpdateTimer->stop();
|
|
|
|
|
|
|
|
|
|
standardTimer->stop();
|
|
|
|
|
|
|
|
|
|
//暂停音乐
|
|
|
|
|
//BGMplayer->pause();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::GameWin()
|
|
|
|
|
{
|
|
|
|
|
stopTimer();
|
|
|
|
|
WinBGMplayer->setMedia(QUrl("qrc:/bgm/sounds/winBGM.mp3"));
|
|
|
|
|
WinBGMplayer->play();
|
|
|
|
|
|
|
|
|
|
BGMTimer->stop();
|
|
|
|
|
BGMplayer->stop();
|
|
|
|
|
|
|
|
|
|
pauseBTN->hide();
|
|
|
|
|
HPBar->hide();
|
|
|
|
|
experienceBar->hide();
|
|
|
|
|
LevelLabel->hide();
|
|
|
|
|
|
|
|
|
|
HPlabel->hide();
|
|
|
|
|
HPRecoverylabel->hide();
|
|
|
|
|
HPPlunderlabel->hide();
|
|
|
|
|
AttackRatiolabel->hide();
|
|
|
|
|
AttackPointlabel->hide();
|
|
|
|
|
AttackSpeedlabel->hide();
|
|
|
|
|
Defencelabel->hide();
|
|
|
|
|
SpeedRatiolabel->hide();
|
|
|
|
|
EXPRatiolabel->hide();
|
|
|
|
|
//配置结束场景
|
|
|
|
|
gameClock->hide();
|
|
|
|
|
mWinScene.setSceneRect(QRect(0,0,900,700));
|
|
|
|
|
mWinScene.addPixmap(QPixmap(":/backgrouds/img/gamewinBackground.png"));
|
|
|
|
|
winText = new GameObject();
|
|
|
|
|
winText->setPixmap(QPixmap(":/ui/img/ui/winText.png"));
|
|
|
|
|
winText->setScale(0.4);
|
|
|
|
|
mWinScene.addItem(winText);
|
|
|
|
|
continueBtn->hide();
|
|
|
|
|
restartBtn->show();
|
|
|
|
|
restartBtn->move(100,100);
|
|
|
|
|
backBtn->show();
|
|
|
|
|
backBtn->move(100,160);
|
|
|
|
|
exitBtn->show();
|
|
|
|
|
exitBtn->move(100,220);
|
|
|
|
|
|
|
|
|
|
//重置光标
|
|
|
|
|
QCursor cursor;
|
|
|
|
|
cursor.setShape(Qt::ArrowCursor);
|
|
|
|
|
QApplication::setOverrideCursor(cursor);
|
|
|
|
|
|
|
|
|
|
mGameView.setScene(&mWinScene);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::GameOver()
|
|
|
|
|
{
|
|
|
|
|
stopTimer();
|
|
|
|
|
BGMTimer->stop();
|
|
|
|
|
BGMplayer->pause();
|
|
|
|
|
|
|
|
|
|
HPlabel->hide();
|
|
|
|
|
HPRecoverylabel->hide();
|
|
|
|
|
HPPlunderlabel->hide();
|
|
|
|
|
AttackRatiolabel->hide();
|
|
|
|
|
AttackPointlabel->hide();
|
|
|
|
|
AttackSpeedlabel->hide();
|
|
|
|
|
Defencelabel->hide();
|
|
|
|
|
SpeedRatiolabel->hide();
|
|
|
|
|
EXPRatiolabel->hide();
|
|
|
|
|
HPBar->hide();
|
|
|
|
|
experienceBar->hide();
|
|
|
|
|
LevelLabel->hide();
|
|
|
|
|
//配置结束场景
|
|
|
|
|
gameClock->hide();
|
|
|
|
|
mOverScene.setSceneRect(QRect(0,0,900,700));
|
|
|
|
|
mOverScene.addPixmap(QPixmap(":/backgrouds/img/gameoverBackground.png"));
|
|
|
|
|
loseText = new GameObject();
|
|
|
|
|
loseText->setPixmap(QPixmap(":/ui/img/ui/loseText.png"));
|
|
|
|
|
loseText->setScale(0.4);
|
|
|
|
|
mOverScene.addItem(loseText);
|
|
|
|
|
continueBtn->hide();
|
|
|
|
|
restartBtn->show();
|
|
|
|
|
restartBtn->move(100,100);
|
|
|
|
|
backBtn->show();
|
|
|
|
|
backBtn->move(100,160);
|
|
|
|
|
exitBtn->show();
|
|
|
|
|
exitBtn->move(100,220);
|
|
|
|
|
|
|
|
|
|
//重置光标
|
|
|
|
|
QCursor cursor;
|
|
|
|
|
cursor.setShape(Qt::ArrowCursor);
|
|
|
|
|
QApplication::setOverrideCursor(cursor);
|
|
|
|
|
|
|
|
|
|
mGameView.setScene(&mOverScene);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::resetHPBar()
|
|
|
|
|
{
|
|
|
|
|
if(mPlayer.getHP() > 0)
|
|
|
|
|
{
|
|
|
|
|
HPBar->setMaximum(mPlayer.getMaxHP());
|
|
|
|
|
HPBar->setValue(mPlayer.getHP());
|
|
|
|
|
HPBar->setFormat(" HP:"+QString::number(mPlayer.getHP())+"/"+QString::number(mPlayer.getMaxHP()));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
emit mPlayer.isDead();
|
|
|
|
|
HPBar->setValue(0);
|
|
|
|
|
HPBar->setFormat(" HP:0/"+QString::number(mPlayer.getMaxHP()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::playerMove()
|
|
|
|
|
{
|
|
|
|
|
qreal speedX = mPlayer.getSpeed()*(1+mPlayer.getSpeedRatio()*2);
|
|
|
|
|
if(mKeyList.size() > 1) speedX /= sqrt(2);
|
|
|
|
|
for(int keyCode : mKeyList)
|
|
|
|
|
{
|
|
|
|
|
switch(keyCode)
|
|
|
|
|
{
|
|
|
|
|
case Qt::Key_W: mPlayer.moveBy(0,-2*speedX);break;
|
|
|
|
|
case Qt::Key_S: mPlayer.moveBy(0,2*speedX);break;
|
|
|
|
|
case Qt::Key_A:
|
|
|
|
|
{ mPlayer.moveBy(-2*speedX,0);
|
|
|
|
|
mPlayer.setFaceDir(0);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case Qt::Key_D:
|
|
|
|
|
{mPlayer.moveBy(2*speedX,0);
|
|
|
|
|
mPlayer.setFaceDir(1);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(mPlayer.pos().x()<0)
|
|
|
|
|
mPlayer.setX(0);
|
|
|
|
|
if(mPlayer.pos().y()<100)
|
|
|
|
|
mPlayer.setY(100);
|
|
|
|
|
if(mPlayer.pos().x()>900-mPlayer.scale()*mPlayer.pixmap().width())
|
|
|
|
|
mPlayer.setX(900-mPlayer.scale()*mPlayer.pixmap().width());
|
|
|
|
|
if(mPlayer.pos().y()>700-mPlayer.scale()*mPlayer.pixmap().height())
|
|
|
|
|
mPlayer.setY(700-mPlayer.scale()*mPlayer.pixmap().height());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void GameWidget::keyPressEvent(QKeyEvent *event)
|
|
|
|
|
{
|
|
|
|
|
//Q键暂停
|
|
|
|
|
if(event->key() == Qt::Key_Q)
|
|
|
|
|
{
|
|
|
|
|
pauseBTN->click();
|
|
|
|
|
// this->isStopped = !this->isStopped;
|
|
|
|
|
// if(this->isStopped) stopTimer();
|
|
|
|
|
// else startTimer();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch(event->key())
|
|
|
|
|
{
|
|
|
|
|
case Qt::Key_W:
|
|
|
|
|
case Qt::Key_S:
|
|
|
|
|
case Qt::Key_A:
|
|
|
|
|
case Qt::Key_D:
|
|
|
|
|
mKeyList.append(event->key());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// QKeyEvent *key=(QKeyEvent*) event;
|
|
|
|
|
// switch(key->key())
|
|
|
|
|
|
|
|
|
|
// {
|
|
|
|
|
// case Qt::Key_Up:
|
|
|
|
|
// case Qt::Key_Down:
|
|
|
|
|
// case Qt::Key_Left:
|
|
|
|
|
// case Qt::Key_Right:
|
|
|
|
|
// mBulletDirList.append(key->key());
|
|
|
|
|
// break;
|
|
|
|
|
// }
|
|
|
|
|
// //qDebug()<<key->key()<<"is pressed";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::keyReleaseEvent(QKeyEvent *event)
|
|
|
|
|
{
|
|
|
|
|
if(mKeyList.contains(event->key())){
|
|
|
|
|
mKeyList.removeAll(event->key());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// if(mBulletDirList.contains(event->key())){
|
|
|
|
|
// mBulletDirList.removeOne(event->key());
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::mousePressEvent(QMouseEvent *event)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
if(!isRunning) return;
|
|
|
|
|
isPressed = 1;
|
|
|
|
|
qDebug() << "Mouse pressed in GameWidget";
|
|
|
|
|
playerShootTimer->start(mPlayer.getAttackInterval());
|
|
|
|
|
QWidget::mousePressEvent(event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::mouseMoveEvent(QMouseEvent *event)
|
|
|
|
|
{
|
|
|
|
|
if(!isPressed) return;
|
|
|
|
|
|
|
|
|
|
setMouseTracking(true);
|
|
|
|
|
//qDebug()<<"move";
|
|
|
|
|
//event->accept();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QPointF moveDir = event->pos() - mPlayer.getCenterPos();
|
|
|
|
|
qreal _x = moveDir.x();
|
|
|
|
|
qreal _y = moveDir.y();
|
|
|
|
|
_x = QString::number(_x,'f',2).toDouble();
|
|
|
|
|
_y = QString::number(_y,'f',2).toDouble();
|
|
|
|
|
qreal _r = qSqrt(qPow(_x,2) + qPow(_y,2));
|
|
|
|
|
if(_r == 0) return;
|
|
|
|
|
//保留两位小数
|
|
|
|
|
_r = QString::number(_r,'f',2).toDouble();
|
|
|
|
|
qreal dx = _x/_r;
|
|
|
|
|
qreal dy = _y/_r;
|
|
|
|
|
dx = QString::number(dx,'f',2).toDouble();
|
|
|
|
|
dy = QString::number(dy,'f',2).toDouble();
|
|
|
|
|
playerBulletDir = QPointF(dx,dy);
|
|
|
|
|
|
|
|
|
|
QWidget::mouseMoveEvent(event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::mouseReleaseEvent(QMouseEvent *event)
|
|
|
|
|
{
|
|
|
|
|
if(!isRunning) return;
|
|
|
|
|
//qDebug()<<"goodbye";
|
|
|
|
|
isPressed = 0;
|
|
|
|
|
playerShootTimer->stop();
|
|
|
|
|
QWidget::mouseReleaseEvent(event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::enemySummon(int _HP, int _Attack, qreal _Speed, int _exp, int _No)
|
|
|
|
|
{
|
|
|
|
|
EnemyBase *Enemy = nullptr;
|
|
|
|
|
switch(_No)
|
|
|
|
|
{
|
|
|
|
|
case 1:
|
|
|
|
|
{
|
|
|
|
|
Enemy = new enemyInsect(GameWidget::widget->getPlayer(),_HP,_Attack,_Speed,_exp);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case 2:
|
|
|
|
|
{
|
|
|
|
|
Enemy = new enemyChimera(GameWidget::widget->getPlayer(),_HP,_Attack,_Speed,_exp);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case 3:
|
|
|
|
|
{
|
|
|
|
|
Enemy = new enemyBig(GameWidget::widget->getPlayer(),_HP,_Attack,_Speed,_exp);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case 4:
|
|
|
|
|
{
|
|
|
|
|
Enemy = new enemyBubble(GameWidget::widget->getPlayer(),_HP,_Attack,_Speed,_exp);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case 5:
|
|
|
|
|
{
|
|
|
|
|
Enemy = new enemyBoss(GameWidget::widget->getPlayer(),_HP,_Attack,_Speed,_exp);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//生成随机位置
|
|
|
|
|
QPointF tpos(0,0);
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
QPointF _pos(QRandomGenerator::global()->bounded(-50,950),QRandomGenerator::global()->bounded(100,750));
|
|
|
|
|
tpos = _pos + QPointF(Enemy->pixmap().width()*Enemy->scale()/2,Enemy->pixmap().height()*Enemy->scale()/2);
|
|
|
|
|
|
|
|
|
|
}while(abs((tpos - mPlayer.getCenterPos()).x()) < 200 && abs((tpos - mPlayer.getCenterPos()).y()) < 200);
|
|
|
|
|
//若与玩家过近 重新生成位置
|
|
|
|
|
|
|
|
|
|
if(_No == 5)
|
|
|
|
|
{
|
|
|
|
|
Enemy->setPos(0,100);
|
|
|
|
|
}
|
|
|
|
|
else Enemy->setPos(tpos);
|
|
|
|
|
Enemy->setZValue(0.9);
|
|
|
|
|
//auto x = QRandomGenerator::global()->bounded(0,10);
|
|
|
|
|
|
|
|
|
|
//绑定怪物死亡与经验球生成
|
|
|
|
|
connect(Enemy,&EnemyBase::isDead,[this,Enemy](){
|
|
|
|
|
auto expBall = new ExpBall(Enemy->getExpDropped(),Enemy->getCenterPos());
|
|
|
|
|
expBall->setZValue(0.8);
|
|
|
|
|
mGameScene.addItem(expBall);
|
|
|
|
|
mExpBallList.append(expBall);
|
|
|
|
|
});
|
|
|
|
|
getGameScene().addItem(Enemy);
|
|
|
|
|
mEnemyList.append(Enemy);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QGraphicsScene &GameWidget::getGameScene()
|
|
|
|
|
{
|
|
|
|
|
return mGameScene;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Player *GameWidget::getPlayer()
|
|
|
|
|
{
|
|
|
|
|
return &mPlayer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::setProperties()
|
|
|
|
|
{
|
|
|
|
|
QFont font("宋体",11,75);
|
|
|
|
|
//经验条配置
|
|
|
|
|
experienceBar = new QProgressBar(this);
|
|
|
|
|
experienceBar->setMaximum(100);
|
|
|
|
|
experienceBar->setValue(0);
|
|
|
|
|
experienceBar->move(60,100);
|
|
|
|
|
experienceBar->setFixedSize(200,20);
|
|
|
|
|
experienceBar->setFormat(" EXP:0/100");
|
|
|
|
|
experienceBar->setFont(font);
|
|
|
|
|
experienceBar->setOrientation(Qt::Horizontal);
|
|
|
|
|
|
|
|
|
|
experienceBar->setStyleSheet(
|
|
|
|
|
"QProgressBar{color:rgb(245,245,245);border-radius: 10px;"
|
|
|
|
|
"background: rgb(0, 0, 0);}"
|
|
|
|
|
"QProgressBar::chunk {border-radius: 10px;"
|
|
|
|
|
"background: rgb(0, 160, 230);}");
|
|
|
|
|
|
|
|
|
|
//通过setStyleSheet样式设计进度条样式
|
|
|
|
|
//QProgressBar:进度条背景 设置
|
|
|
|
|
//QProgressBar::chunk 进度条 设置
|
|
|
|
|
//color:字体颜色 ;border-radius:圆角 ;background: 进度条背景颜色 ;
|
|
|
|
|
|
|
|
|
|
experienceBar->show();
|
|
|
|
|
|
|
|
|
|
//绑定经验值与经验条
|
|
|
|
|
connect(&mPlayer,&Player::getExp,[this](){
|
|
|
|
|
if(mPlayer.getPlayerExp() < 100)
|
|
|
|
|
{
|
|
|
|
|
experienceBar->setValue(mPlayer.getPlayerExp());
|
|
|
|
|
experienceBar->setFormat(" EXP:"+QString::number(mPlayer.getPlayerExp())+"/100");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
mPlayer.LevelBeUp();
|
|
|
|
|
emit mPlayer.LevelUp();//发送升级信号
|
|
|
|
|
isChoosing = 1;
|
|
|
|
|
|
|
|
|
|
experienceBar->setValue(mPlayer.getPlayerExp());
|
|
|
|
|
experienceBar->setFormat(" EXP:"+QString::number(mPlayer.getPlayerExp())+"/100");
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
//配置等级信息
|
|
|
|
|
LevelLabel = new QLabel(this);
|
|
|
|
|
LevelLabel->move(60,40);
|
|
|
|
|
LevelLabel->setText(" Lv:1");
|
|
|
|
|
LevelLabel->setFixedSize(50,20);
|
|
|
|
|
LevelLabel->setStyleSheet("QLabel{border-radius: 6px;"
|
|
|
|
|
"background-color: rgb(60, 60, 60);"
|
|
|
|
|
"color: rgb(255, 255, 255);}");
|
|
|
|
|
|
|
|
|
|
LevelLabel->setFont(font);
|
|
|
|
|
connect(&mPlayer,&Player::LevelUp,[this](){
|
|
|
|
|
LevelLabel->setText(" Lv:"+QString::number(mPlayer.getPlayerLevel()));
|
|
|
|
|
//qDebug()<<mPlayer.getPlayerLevel();
|
|
|
|
|
//LevelUPAudioplayer->setSource(QUrl("qrc:/sfx/sounds/effcet_sfx_levelup.ogg"));
|
|
|
|
|
LevelUPAudioplayer->play();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
LevelLabel->show();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//血量条配置
|
|
|
|
|
HPBar = new QProgressBar(this);
|
|
|
|
|
HPBar->setMaximum(100);
|
|
|
|
|
HPBar->setMaximum(mPlayer.getMaxHP());
|
|
|
|
|
HPBar->setValue(mPlayer.getHP());
|
|
|
|
|
HPBar->move(60,70);
|
|
|
|
|
HPBar->setFixedSize(200,20);
|
|
|
|
|
HPBar->setFormat(" HP:"+QString::number(mPlayer.getHP())+"/"+QString::number(mPlayer.getMaxHP()));
|
|
|
|
|
HPBar->setFont(font);
|
|
|
|
|
HPBar->setOrientation(Qt::Horizontal);
|
|
|
|
|
|
|
|
|
|
HPBar->setStyleSheet(
|
|
|
|
|
"QProgressBar{color:rgb(245,245,245);border-radius: 10px;"
|
|
|
|
|
"background: rgb(0, 0, 0);}"
|
|
|
|
|
"QProgressBar::chunk {border-radius: 10px;"
|
|
|
|
|
"background: rgb(240, 40, 40);}");
|
|
|
|
|
|
|
|
|
|
HPBar->show();
|
|
|
|
|
|
|
|
|
|
//绑定生命值改变与血条变化
|
|
|
|
|
connect(&mPlayer,&Player::LevelUp,[this](){
|
|
|
|
|
resetHPBar();
|
|
|
|
|
});
|
|
|
|
|
connect(this,&GameWidget::isSelected,[this](){
|
|
|
|
|
resetHPBar();
|
|
|
|
|
mPlayer.HPRecoverControl();
|
|
|
|
|
});
|
|
|
|
|
connect(&mPlayer,&Player::isHurt,[this](){
|
|
|
|
|
resetHPBar();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//细节属性栏配置
|
|
|
|
|
mProperties.setPixmap(QPixmap(":/ui/img/ui/propertiesicons.png"));
|
|
|
|
|
mProperties.setPos(50,310);
|
|
|
|
|
mProperties.setScale(0.7);
|
|
|
|
|
mProperties.setZValue(2);
|
|
|
|
|
mGameScene.addItem(&mProperties);
|
|
|
|
|
|
|
|
|
|
HPlabel = new QLabel(this);
|
|
|
|
|
HPRecoverylabel= new QLabel(this);
|
|
|
|
|
HPPlunderlabel= new QLabel(this);
|
|
|
|
|
AttackRatiolabel= new QLabel(this);
|
|
|
|
|
AttackPointlabel= new QLabel(this);
|
|
|
|
|
AttackSpeedlabel= new QLabel(this);
|
|
|
|
|
Defencelabel= new QLabel(this);
|
|
|
|
|
SpeedRatiolabel= new QLabel(this);
|
|
|
|
|
EXPRatiolabel= new QLabel(this);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//样式表
|
|
|
|
|
QString qssPositive = "QLabel{border-radius: 6px;"
|
|
|
|
|
"background-color: rgb(60, 60, 60);"
|
|
|
|
|
"color: rgb(255, 255, 255);}";
|
|
|
|
|
|
|
|
|
|
QString qssNegative = "QLabel{border-radius: 6px;"
|
|
|
|
|
"background-color: rgb(60, 60, 60);"
|
|
|
|
|
"color: rgb(255, 0, 0);}";
|
|
|
|
|
|
|
|
|
|
HPlabel->move(158,325);
|
|
|
|
|
HPlabel->setText("5");
|
|
|
|
|
HPlabel->setFixedSize(30,24);
|
|
|
|
|
HPlabel->setStyleSheet(qssPositive);
|
|
|
|
|
HPlabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
|
|
|
|
|
HPlabel->show();
|
|
|
|
|
|
|
|
|
|
HPRecoverylabel->move(158,353);
|
|
|
|
|
HPRecoverylabel->setText("0");
|
|
|
|
|
HPRecoverylabel->setFixedSize(30,24);
|
|
|
|
|
HPRecoverylabel->setStyleSheet(qssPositive);
|
|
|
|
|
HPRecoverylabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
|
|
|
|
|
HPRecoverylabel->show();
|
|
|
|
|
|
|
|
|
|
HPPlunderlabel->move(158,381);
|
|
|
|
|
HPPlunderlabel->setText("0%");
|
|
|
|
|
HPPlunderlabel->setFixedSize(30,24);
|
|
|
|
|
HPPlunderlabel->setStyleSheet(qssPositive);
|
|
|
|
|
HPPlunderlabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
|
|
|
|
|
HPPlunderlabel->show();
|
|
|
|
|
|
|
|
|
|
AttackRatiolabel->move(158,409);
|
|
|
|
|
AttackRatiolabel->setText("0%");
|
|
|
|
|
AttackRatiolabel->setFixedSize(30,24);
|
|
|
|
|
AttackRatiolabel->setStyleSheet(qssPositive);
|
|
|
|
|
AttackRatiolabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
|
|
|
|
|
AttackRatiolabel->show();
|
|
|
|
|
|
|
|
|
|
AttackPointlabel->move(158,437);
|
|
|
|
|
AttackPointlabel->setText("1");
|
|
|
|
|
AttackPointlabel->setFixedSize(30,24);
|
|
|
|
|
AttackPointlabel->setStyleSheet(qssPositive);
|
|
|
|
|
AttackPointlabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
|
|
|
|
|
AttackPointlabel->show();
|
|
|
|
|
|
|
|
|
|
AttackSpeedlabel->move(158,467);
|
|
|
|
|
AttackSpeedlabel->setText("0%");
|
|
|
|
|
AttackSpeedlabel->setFixedSize(30,24);
|
|
|
|
|
AttackSpeedlabel->setStyleSheet(qssPositive);
|
|
|
|
|
AttackSpeedlabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
|
|
|
|
|
AttackSpeedlabel->show();
|
|
|
|
|
|
|
|
|
|
Defencelabel->move(158,497);
|
|
|
|
|
Defencelabel->setText("0");
|
|
|
|
|
Defencelabel->setFixedSize(30,24);
|
|
|
|
|
Defencelabel->setStyleSheet(qssPositive);
|
|
|
|
|
Defencelabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
|
|
|
|
|
Defencelabel->show();
|
|
|
|
|
|
|
|
|
|
SpeedRatiolabel->move(158,527);
|
|
|
|
|
SpeedRatiolabel->setText("0%");
|
|
|
|
|
SpeedRatiolabel->setFixedSize(30,24);
|
|
|
|
|
SpeedRatiolabel->setStyleSheet(qssPositive);
|
|
|
|
|
SpeedRatiolabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
|
|
|
|
|
SpeedRatiolabel->show();
|
|
|
|
|
|
|
|
|
|
EXPRatiolabel->move(158,557);
|
|
|
|
|
EXPRatiolabel->setText("0%");
|
|
|
|
|
EXPRatiolabel->setFixedSize(30,24);
|
|
|
|
|
EXPRatiolabel->setStyleSheet(qssPositive);
|
|
|
|
|
EXPRatiolabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
|
|
|
|
|
EXPRatiolabel->show();
|
|
|
|
|
|
|
|
|
|
connect(this,&GameWidget::isSelected,[this](){
|
|
|
|
|
isChoosing = 0;
|
|
|
|
|
resetProperties();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::resetProperties()
|
|
|
|
|
{
|
|
|
|
|
HPlabel->setText(QString::number(mPlayer.getMaxHP()));
|
|
|
|
|
HPRecoverylabel->setText(QString::number(mPlayer.getHPRecovery()));
|
|
|
|
|
HPPlunderlabel->setText(QString::number(mPlayer.getHPPlunder()*100)+"%");
|
|
|
|
|
AttackRatiolabel->setText(QString::number(mPlayer.getAttackRatio()*100)+"%");
|
|
|
|
|
AttackPointlabel->setText(QString::number(mPlayer.getAttackPoint()));
|
|
|
|
|
AttackSpeedlabel->setText(QString::number(mPlayer.getAttackSpeed())+"%");
|
|
|
|
|
Defencelabel->setText(QString::number(mPlayer.getDefence()));
|
|
|
|
|
SpeedRatiolabel->setText(QString::number(mPlayer.getSpeedRatio()*100)+"%");
|
|
|
|
|
EXPRatiolabel->setText(QString::number(mPlayer.getEXPRatio()*100)+"%");
|
|
|
|
|
HPlabel->show();
|
|
|
|
|
HPRecoverylabel->show();
|
|
|
|
|
HPPlunderlabel->show();
|
|
|
|
|
AttackRatiolabel->show();
|
|
|
|
|
AttackPointlabel->show();
|
|
|
|
|
AttackSpeedlabel->show();
|
|
|
|
|
Defencelabel->show();
|
|
|
|
|
SpeedRatiolabel->show();
|
|
|
|
|
EXPRatiolabel->show();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void GameWidget::player_enemyCollision()
|
|
|
|
|
{
|
|
|
|
|
// if(mPlayer.isInvincible) return;//判断无敌
|
|
|
|
|
// int enemyNum = mEnemyList.size();
|
|
|
|
|
// for(int i=0;i<enemyNum;i++)
|
|
|
|
|
// {
|
|
|
|
|
// if(mPlayer.collidesWithItem(mEnemyList[i]))
|
|
|
|
|
// {
|
|
|
|
|
// mPlayer.getHurt(mEnemyList[i]->getAttackPoint());
|
|
|
|
|
// emit mPlayer.isHurt();
|
|
|
|
|
// if(mPlayer.getHP() <= 0)//死亡
|
|
|
|
|
// {
|
|
|
|
|
// emit mPlayer.isDead();
|
|
|
|
|
// }
|
|
|
|
|
// mPlayer.isInvincible = 1;
|
|
|
|
|
// mPlayer.InvincibleTimer->start(GameDefine::InvincibleTime);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// // emit mEnemyList[i]->isDead(); //发出怪物死亡信号
|
|
|
|
|
// // mGameScene.removeItem(mEnemyList[i]);
|
|
|
|
|
// // if (mEnemyList[i] != nullptr) mEnemyList[i]->deleteLater();
|
|
|
|
|
// // mEnemyList.removeOne(mEnemyList[i]);
|
|
|
|
|
// // return;
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
EnemyCollision* collision = new EnemyCollision();
|
|
|
|
|
QThread* thread = new QThread();
|
|
|
|
|
|
|
|
|
|
collision->moveToThread(thread);
|
|
|
|
|
collision->setupCollision(&mPlayer, &mEnemyList);
|
|
|
|
|
|
|
|
|
|
connect(thread, &QThread::started, collision, &EnemyCollision::processCollisions);
|
|
|
|
|
connect(thread, &QThread::finished, thread, &QObject::deleteLater);
|
|
|
|
|
connect(thread, &QThread::finished, collision, &QObject::deleteLater);
|
|
|
|
|
connect(collision, &EnemyCollision::EnemyCollisionFinished, this, &GameWidget::handleCollision);
|
|
|
|
|
thread->start();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::bullet_enemyCollision()
|
|
|
|
|
{
|
|
|
|
|
//子弹与敌人碰撞
|
|
|
|
|
int bulletNum = mBulletList.size();
|
|
|
|
|
int enemyNum = mEnemyList.size();
|
|
|
|
|
for(int i=0;i< bulletNum;i++)//遍历所有子弹
|
|
|
|
|
{
|
|
|
|
|
for(int j=0;j<enemyNum;j++)//遍历所有敌人
|
|
|
|
|
{
|
|
|
|
|
if(mBulletList[i]->collidesWithItem(mEnemyList[j]))
|
|
|
|
|
{
|
|
|
|
|
mGameScene.removeItem(mBulletList[i]);
|
|
|
|
|
|
|
|
|
|
emit mEnemyList[j]->isHurt(); //发出怪物受伤信号
|
|
|
|
|
mEnemyList[j]->getHurt(mBulletList[i]->getAttackPoint());
|
|
|
|
|
if(mEnemyList[j]->getHP() <= 0 )
|
|
|
|
|
{
|
|
|
|
|
emit mEnemyList[j]->isDead();//发出怪物死亡信号
|
|
|
|
|
mGameScene.removeItem(mEnemyList[j]);
|
|
|
|
|
if (mEnemyList[j] != nullptr) mEnemyList[j]->deleteLater();
|
|
|
|
|
mEnemyList.removeOne(mEnemyList[j]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mPlayer.canPlunder();
|
|
|
|
|
resetHPBar();
|
|
|
|
|
if (mBulletList[i] != nullptr) mBulletList[i]->deleteLater();
|
|
|
|
|
mBulletList.removeOne(mBulletList[i]);
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::bullet_playerCollision()
|
|
|
|
|
{
|
|
|
|
|
if(mPlayer.isInvincible) return;//判断无敌
|
|
|
|
|
int bulletNum = mEnemyBulletList.size();
|
|
|
|
|
for(int i=0;i<bulletNum;i++)
|
|
|
|
|
{
|
|
|
|
|
if(mEnemyBulletList[i]->collidesWithItem(&mPlayer))
|
|
|
|
|
{
|
|
|
|
|
mPlayer.getHurt(mEnemyBulletList[i]->getAttackPoint());
|
|
|
|
|
emit mPlayer.isHurt();
|
|
|
|
|
if(mPlayer.getHP() <= 0)//死亡
|
|
|
|
|
{
|
|
|
|
|
emit mPlayer.isDead();
|
|
|
|
|
}
|
|
|
|
|
mPlayer.isInvincible = 1;
|
|
|
|
|
mPlayer.InvincibleTimer->start(GameDefine::InvincibleTime);
|
|
|
|
|
|
|
|
|
|
if (mEnemyBulletList[i] != nullptr) mEnemyBulletList[i]->deleteLater();
|
|
|
|
|
mEnemyBulletList.removeOne(mEnemyBulletList[i]);
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::releaseOutBullet()
|
|
|
|
|
{
|
|
|
|
|
for(int i=0;i<mBulletList.size();i++)
|
|
|
|
|
{
|
|
|
|
|
if(mBulletList[i]->getCenterPos().x()>950 || mBulletList[i]->getCenterPos().x()<-50
|
|
|
|
|
|| mBulletList[i]->getCenterPos().y()>750 || mBulletList[i]->getCenterPos().y()<-50)
|
|
|
|
|
{
|
|
|
|
|
mGameScene.removeItem(mBulletList[i]);
|
|
|
|
|
if (mBulletList[i] != nullptr) mBulletList[i]->deleteLater();
|
|
|
|
|
mBulletList.removeOne(mBulletList[i]);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::releaseOutEnemyBullet()
|
|
|
|
|
{
|
|
|
|
|
for(int i=0;i<mEnemyBulletList.size();i++)
|
|
|
|
|
{
|
|
|
|
|
if(mEnemyBulletList[i]->getCenterPos().x()>1000 || mEnemyBulletList[i]->getCenterPos().x()<-100
|
|
|
|
|
|| mEnemyBulletList[i]->getCenterPos().y()>800 || mEnemyBulletList[i]->getCenterPos().y()<-100)
|
|
|
|
|
{
|
|
|
|
|
mGameScene.removeItem(mEnemyBulletList[i]);
|
|
|
|
|
if (mEnemyBulletList[i] != nullptr) mEnemyBulletList[i]->deleteLater();
|
|
|
|
|
mEnemyBulletList.removeOne(mEnemyBulletList[i]);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::getExp()
|
|
|
|
|
{
|
|
|
|
|
int expNum = mExpBallList.size();
|
|
|
|
|
for(int i=0;i<expNum;i++)
|
|
|
|
|
{
|
|
|
|
|
if(abs((mExpBallList[i]->getCenterPos()-mPlayer.getCenterPos()).x())<120
|
|
|
|
|
&& abs((mExpBallList[i]->getCenterPos()-mPlayer.getCenterPos()).y())<120)
|
|
|
|
|
{
|
|
|
|
|
mExpBallList[i]->expBallMove();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for(int i=0;i<expNum;i++)
|
|
|
|
|
{
|
|
|
|
|
if(mExpBallList[i]->collidesWithItem(&mPlayer))
|
|
|
|
|
{
|
|
|
|
|
mPlayer.PlayerGetExp(mExpBallList[i]->getVal());
|
|
|
|
|
emit mPlayer.getExp();
|
|
|
|
|
mGameScene.removeItem(mExpBallList[i]);
|
|
|
|
|
if (mExpBallList[i] != nullptr) mExpBallList[i]->deleteLater();
|
|
|
|
|
mExpBallList.removeOne(mExpBallList[i]);
|
|
|
|
|
return;//清除一个后退出 避免“index out of range”
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GameWidget::handleCollision(const QString str)
|
|
|
|
|
{
|
|
|
|
|
if(str == "hurt")
|
|
|
|
|
emit mPlayer.isHurt();
|
|
|
|
|
if(str == "dead")
|
|
|
|
|
emit mPlayer.isDead();
|
|
|
|
|
if(str == "Invincibletime")
|
|
|
|
|
{
|
|
|
|
|
mPlayer.isInvincible = 1;
|
|
|
|
|
mPlayer.InvincibleTimer->start(GameDefine::InvincibleTime);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return;
|
|
|
|
|
}
|