#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
#include <QTimer>
#include <QDebug>
#include <QKeyEvent>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 设定定时器 Timer
timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MainWindow::TimerEvent);
timer->start(60); // 30毫秒触发一次(每秒触发30)fps:30
// 创建游戏对象
int objectsNum = 10;
int H = this->height();
int W = this->width();
int xstep = (W - objectsNum*20)/(objectsNum - 1);
for (int i = 0 ;i<objectsNum;i++)
{
PassiveBall * obj = new PassiveBall();
// 摆放障碍物
obj->x = i*((obj->r)*2+xstep);
obj->y = H/2;
// 基类指针可以指向派生类
objLst.push_back(obj);
}
for (int i = 0 ;i< 2 * (objectsNum);i++)
{
RandomMoveBall * obj = new RandomMoveBall();
// 摆放障碍物
obj->x = i*((obj->r)*2+xstep/2);
obj->y = H/2 - 40;
// 基类指针可以指向派生类
objLst.push_back(obj);
}
for (int i = 0 ;i< 2 * (objectsNum);i++)
{
RandomMoveBall * obj = new RandomMoveBall();
// 摆放障碍物
obj->x = i*((obj->r)*2+xstep/2);
obj->y = H/2 - 80;
// 基类指针可以指向派生类
objLst.push_back(obj);
}
for (int i = 0 ;i< 2 * (objectsNum);i++)
{
RandomMoveBall * obj = new RandomMoveBall();
// 摆放障碍物
obj->x = i*((obj->r)*2+xstep/2);
obj->y = H/2 - 120;
// 基类指针可以指向派生类
objLst.push_back(obj);
}
for (int i = 0 ;i< 2 * (objectsNum);i++)
{
RandomMoveBall * obj = new RandomMoveBall();
// 摆放障碍物
obj->x = i*((obj->r)*2+xstep/2);
obj->y = H/2 - 180;
// 基类指针可以指向派生类
objLst.push_back(obj);
}
playerBall = new PlayerBall();
// 初始化玩家位置
playerBall->x = W/2;
playerBall->y = H;
}
MainWindow::~MainWindow()
{
delete ui;
delete timer;
for(auto itm:objLst)
{
delete itm;
}
delete playerBall;
}
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(Qt::black);
// 绘制游戏世界和对象 TODO
for(auto itm:objLst)
{
painter.drawEllipse(itm->x - itm->r, itm->y - itm->r, 2*(itm->r), 2*(itm->r));
}
painter.setPen(Qt::red);
painter.drawEllipse(playerBall->x - playerBall->r, playerBall->y - playerBall->r, (playerBall->r)*2, (playerBall->r)*2);
}
void MainWindow::keyPressEvent(QKeyEvent *ev)
{
if(ev->key() == Qt::Key_Up)
{
playerBall->y -= 10;
}
if(ev->key() == Qt::Key_Down)
{
playerBall->y += 10;
}
if(ev->key() == Qt::Key_Left)
{
playerBall->x -= 10;
}
if(ev->key() == Qt::Key_Right)
{
playerBall->x += 10;
}
}
void MainWindow::TimerEvent()
{
// 给每个游戏对象存活一个时间片TODO
for (auto itm:objLst)
{
itm->LiveOneTimeSlice();
}
// 测绘整个游戏场景
update();
// 判断失败TODO
for (auto itm:objLst)
{
// 碰撞检查
float distSqure = (itm->x - playerBall->x)*(itm->x - playerBall->x) +(itm->y - playerBall->y)*(itm->y - playerBall->y);
if(distSqure <= ((itm->r + playerBall->r)*(itm->r + playerBall->r)))
{
qDebug() << "失败!!!!";
timer->stop();
}
}
// 判断成功
if(playerBall->y <= 0)
{
qDebug() << "你成功了!!!!";
timer->stop();
}
}