头文件:
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QDateTime>
#include <QDebug>
#include<QMessageBox>
#include<QLabel>
#include<QTimer>
#include<QPixmap>
#include<QPaintDevice>
#include<QMovie>
#include<QSize>
#include<QKeyEvent>
#include<QPainter>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
bool isTouched(QWidget* ss,QWidget* js);//判断碰撞
void paintEvent(QPaintEvent *event);
void jump();//松鼠跳跃
void keyPressEvent(QKeyEvent *);
void hit();//进行攻击
private:
Ui::Dialog *ui;
int n;//跳跃标志位
int x;
int y;
int m;//松果数量标志位
int speed;//松鼠速度
int value;//松鼠血量
int value_js;//僵尸血量
QMovie *movie_ss;
QMovie *movie_js;
QTimer *timer_ss;//松鼠跳跃定时器
QTimer *timer_js;//僵尸移动定时器
QTimer *timer_cure;//血包移动定时器
QTimer *timer_attack;//松果移动定时器
QTimer *timer_hit;//松果攻击定时器
private slots:
void moveSlot();//僵尸移动
void cureSlot();//血包移动
void attackSlot();//松果移动
void falseSlot();//游戏失败
void victorySlot();//游戏成功
void newSlot();//重新开始
void downSlot();//松鼠下落
void hitSlot();//松果攻击
signals:
void newSignal();
void falseSignal();
void victorySignal();
};
#endif // DIALOG_H
源文件:
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
n=0;
m=0;
speed=10;
value =100;
value_js=100;
ui->setupUi(this);
//松鼠
movie_ss = new QMovie(this);
movie_ss->setFileName(":/new/prefix1/ss.gif");
ui->label_ss->move(480,280);
ui->label_num->setText("松果数: 0 ");
ui->label_num->move(750,0);
ui->progressBar->move(ui->label_ss->x(),ui->label_ss->y()-10);
ui->progressBar->setValue(value);
ui->label_ss->setMovie(movie_ss);
movie_ss->start();
//僵尸
movie_js = new QMovie(this);
movie_js->setFileName(":/new/prefix1/js.gif");
ui->label_js->move(1550,230);
ui->progressBar_js->move(ui->label_js->x(),ui->label_js->y()-10);
ui->label_js->setMovie(movie_js);
movie_js->start();
//僵尸移动定时器
timer_js= new QTimer(this);
timer_js->setSingleShot(false);
timer_js->setInterval(40);
connect(timer_js,SIGNAL(timeout()),this,SLOT(moveSlot()));
timer_js->start();
//血包移动定时器
timer_cure=new QTimer(this);
timer_cure->setSingleShot(false);
timer_cure->setInterval(4000);
connect(timer_cure,SIGNAL(timeout()),this,SLOT(cureSlot()));
timer_cure->start();
//松果移动定时器
timer_attack=new QTimer(this);
timer_attack->setSingleShot(false);
timer_attack->setInterval(6000);
connect(timer_attack,SIGNAL(timeout()),this,SLOT(attackSlot()));
timer_attack->start();
//松果攻击定时器
timer_hit=new QTimer(this);
timer_hit->setSingleShot(false);
timer_hit->setInterval(40);
connect(timer_hit,SIGNAL(timeout()),this,SLOT(hitSlot()));
connect(this,SIGNAL(falseSignal()),this,SLOT(falseSlot()));//游戏失败
connect(this,SIGNAL(victorySignal()),this,SLOT(victorySlot()));//游戏成功
connect(this,SIGNAL(newSignal()),this,SLOT(newSlot()));//重新游戏
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::paintEvent(QPaintEvent *)//设置背景
{
QPainter painter(this);
QPixmap pic_back(":/new/prefix1/back.png");
painter.drawPixmap(0,0,width(),height(),pic_back);
}
void Dialog::keyPressEvent(QKeyEvent *event)//按键设置
{
int code=event->key();
switch (code) {
case Qt::Key_A:
if(ui->label_ss->x()>150)
{ui->label_ss->move(ui->label_ss->x()-speed,ui->label_ss->y());
ui->progressBar->move(ui->label_ss->x(),ui->label_ss->y()-10);}
break;
case Qt::Key_D:
if(ui->label_ss->x()<1450&&ui->label_js->x()<=1400)
{ui->label_ss->move(ui->label_ss->x()+speed,ui->label_ss->y());
ui->progressBar->move(ui->label_ss->x(),ui->label_ss->y()-10);}
break;
case Qt::Key_W:
if(ui->label_ss->y()>20)
{ui->label_ss->move(ui->label_ss->x(),ui->label_ss->y()-speed);
ui->progressBar->move(ui->label_ss->x(),ui->label_ss->y()-10);}
break;
case Qt::Key_S:
if(ui->label_ss->y()<660)
{ui->label_ss->move(ui->label_ss->x(),ui->label_ss->y()+speed);
ui->progressBar->move(ui->label_ss->x(),ui->label_ss->y()-10);}
break;
case Qt::Key_Space:jump();break;
case Qt::Key_J:if(m==1)hit();break;
default:break;
}
}
void Dialog::jump()//松鼠跳起
{
if(n==0)//控制不能二级跳
{
y=ui->label_ss->y();
x=ui->label_ss->x();
ui->label_ss->move(ui->label_ss->x(),ui->label_ss->y()-200);
ui->progressBar->move(ui->label_ss->x(),ui->label_ss->y()-10);
}
n=1;
timer_ss = new QTimer(this);
timer_ss->setSingleShot(true);
timer_ss->setInterval(800);
connect(timer_ss,SIGNAL(timeout()),this,SLOT(downSlot()));
timer_ss->start();
}
void Dialog::downSlot()//松鼠下落
{
ui->label_ss->move(x,y);
ui->progressBar->move(ui->label_ss->x(),ui->label_ss->y()-10);
n=0;
}
void Dialog::moveSlot()//僵尸移动
{
ui->label_js->move(ui->label_js->x()-5,ui->label_js->y());
ui->progressBar_js->move(ui->label_js->x(),ui->label_js->y()-10);
if(isTouched(ui->label_js,ui->label_ss))//碰撞触发行为
{
value-=1;
ui->progressBar->setValue(value);//控制松鼠血量
if(value==0)
{
emit falseSignal();
}
}
if(isTouched(ui->label_ss,ui->label_cure))//吃到血包
{
ui->label_cure->clear();
ui->label_cure->move(ui->label_cure->x()+100,ui->label_cure->y()+100);//防止重复触发触碰
if(value<=80)
value+=20;
else
value=100;
ui->progressBar->setValue(value);
}
if(isTouched(ui->label_ss,ui->label_attack))//吃到松果
{
if(m==0)
{
m=1;
ui->label_num->setText("松果数: 1 ");
ui->label_attack->clear();
ui->label_attack->move(ui->label_attack->x()+100,ui->label_attack->y()+100);//防止重复触发触碰
//QMessageBox::information(this,"information","恭喜获得神器诛尸果!!!按J可攻击一次");
}
}
//僵尸重复移动
if(ui->label_js->x()<ui->label_ss->x()-250)
{
int random = qrand()%10+1;
ui->label_js->move(ui->label_ss->x()+random*30+100,ui->label_ss->y()-50);
ui->progressBar_js->move(ui->label_js->x(),ui->label_js->y()-10);
qsrand(QDateTime::currentMSecsSinceEpoch()); // 种子
timer_js->setInterval(40-random*2); //僵尸速度随机加快
speed=random+5;//松鼠速度变化
}
}
void Dialog::falseSlot()//失败动作
{
QMessageBox::StandardButton result =QMessageBox::question(this,"question","游戏失败是否要重新开始?");
if(result == QMessageBox:: No)
close();
else
{
emit newSignal();
}
}
void Dialog::victorySlot()//成功动作
{
timer_js->stop();
QMessageBox::StandardButton result =QMessageBox::question(this,"question","挑战成功!!!!是否继续游戏?");
if(result == QMessageBox:: No)
close();
else
{
emit newSignal();
}
}
void Dialog::newSlot()//重新开始游戏
{
qsrand(QDateTime::currentMSecsSinceEpoch()); // 种子
int random = qrand()%10+1;
ui->label_ss->move(480,280+40*random);
ui->label_js->move(1400,230+40*random);
speed=1;
timer_js->start();
value=100;
value_js=100;
ui->progressBar->setValue(value);
ui->progressBar->move(ui->label_ss->x(),ui->label_ss->y()-10);
ui->progressBar_js->move(ui->label_js->x(),ui->label_js->y()-10);
}
void Dialog::cureSlot()//血包移动
{
QPixmap pic(":/new/prefix1/cure.png");//生成血包
qsrand(QDateTime::currentMSecsSinceEpoch()); // 种子
int random = qrand()%10+1;
ui->label_cure->move(100*random,50*random);
ui->label_cure->setPixmap(pic);
}
void Dialog::attackSlot()//松果移动
{
if(m==0)
{
qsrand(QDateTime::currentMSecsSinceEpoch()); // 种子
int random = qrand()%10+1;
QPixmap pic1(":/new/prefix2/attack.png");//生成松果武器
QSize pic1Size(30,30);
pic1 = pic1.scaled(pic1Size,Qt::KeepAspectRatioByExpanding);
ui->label_attack->move(109*random,+67*random);
ui->label_attack->setPixmap(pic1);
}
}
void Dialog::hit()//松果攻击
{
ui->label_attack->move(ui->label_ss->x()+100,ui->label_ss->y()+40);
QPixmap pic1(":/new/prefix2/attack.png");//生成松果武器
QSize pic1Size(30,30);
pic1 = pic1.scaled(pic1Size,Qt::KeepAspectRatioByExpanding);
ui->label_attack->setPixmap(pic1);
timer_hit->start();
}
void Dialog::hitSlot()
{
ui->label_attack->move(ui->label_attack->x()+5,ui->label_attack->y());
if(isTouched(ui->label_js,ui->label_attack))//打到僵尸
{
qsrand(QDateTime::currentMSecsSinceEpoch()); // 种子
int random = qrand()%10+1;
m=0;
ui->label_num->setText("松果数: 0 ");
ui->label_attack->clear();
if(value_js>=random+5)
value_js-=random+5;
else
value_js=0;
ui->progressBar_js->setValue(value_js);
if(value_js==0)
emit victorySignal();
timer_hit->stop();
}
else if(ui->label_attack->x()>=1480)
{
m=0;
ui->label_num->setText("松果数: 0 ");
ui->label_attack->clear();
timer_hit->stop();
}
}
bool Dialog::isTouched(QWidget*ss,QWidget* js)//碰撞条件
{
// 拿到两个组件的位置和宽高
int ss_width = ss->width();
int ss_height = ss->height();
int ss_x = ss->x();
int ss_y = ss->y();
int js_width = js->width();
int js_height = js->height();
int js_x = js->x();
int js_y = js->y();
// 僵尸的左上角碰到了松鼠!
if(js_x>= ss_x && js_x<= ss_x + ss_width &&
js_y >= ss_y && js_y <= ss_y+ss_height)
{
return true;
}
// 僵尸的右上角碰到了松鼠!
if(js_x+js_width>= ss_x && js_x+js_width<= ss_x + ss_width &&
js_y >= ss_y && js_y <= ss_y+ss_height)
{
return true;
}
// 左下角碰到了!
if(js_x>= ss_x && js_x<= ss_x + ss_width &&
js_y+js_height >= ss_y && js_y+js_height <= ss_y+ss_height)
{
return true;
}
// 右下角
if(js_x+js_width>= ss_x && js_x+js_width<= ss_x + ss_width &&
js_y+js_height >= ss_y && js_y+js_height <= ss_y+ss_height)
{
return true;
}
return false;
}
效果: