小鸟组件绘制
FlappyBird::FlappyBird(QGraphicsScene *scene): m_curflyStatus(0)
, m_IsLandFall(true)
, m_IsRaise(true)
{
scene->addItem(this);
m_scene = scene;
m_birdRefreashTime = new QTimer(this);
connect(m_birdRefreashTime, SIGNAL(timeout()), this, SLOT(onRefreashBird()));
m_birdRefreashTime->start(12);
m_flyAnimation = new QPropertyAnimation(this, "pos");
}
void FlappyBird::onRefreashBird()
{
update();
}
QRectF FlappyBird::boundingRect() const
{
return QRectF(60, FLY_BIRD_SIZE * 5 , FLY_BIRD_SIZE, FLY_BIRD_SIZE);
}
void FlappyBird::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
painter->save();
if (m_curflyStatus < 10)
{
m_curflyStatus++;
painter->drawImage(boundingRect(), QImage(":/FlappyBird/Resources/texture/bird1.png"));
}
else if (m_curflyStatus < 20)
{
m_curflyStatus++;
painter->drawImage(boundingRect(), QImage(":/FlappyBird/Resources/texture/bird2.png"));
}
else if ( m_curflyStatus < 30)
{
m_curflyStatus++;
painter->drawImage(boundingRect(), QImage(":/FlappyBird/Resources/texture/bird3.png"));
}
else
{
m_curflyStatus = 0;
}
painter->restore();
}
void FlappyBird::flyRaiseAnimation()
{
if (m_IsRaise)
{
m_IsLandFall = false;
m_IsRaise = false;
m_flyAnimation->stop();
if (pos().y() > -180)
{
m_flyAnimation->setDuration(300);
m_flyAnimation->setEndValue(QPoint(pos().x(), pos().y() - FLY_BIRD_SIZE));
}
else
{
m_flyAnimation->setDuration(300);
m_flyAnimation->setEndValue(pos());
}
m_flyAnimation->setEasingCurve(QEasingCurve::OutQuad);
m_flyAnimation->start();
connect(m_flyAnimation, SIGNAL(finished()), this, SLOT(onFlyRaiseAnimationFinished()));
}
}
void FlappyBird::onFlyRaiseAnimationFinished()
{
m_flyAnimation->disconnect(SIGNAL(finished()));
m_IsRaise = true;
m_IsLandFall = true;
flyLandfallAnimation();
}
void FlappyBird::flyLandfallAnimation()
{
if (m_birdRefreashTime->isActive())
{
m_birdRefreashTime->stop();
}
if (m_IsLandFall)
{
m_flyAnimation->stop();
int fallHeight = m_scene->height() - pos().y();
int time = 1000 * fallHeight / m_scene->height();
m_flyAnimation->setDuration(time);
m_flyAnimation->setEndValue(QPoint(pos().x(), pos().y() + fallHeight));
m_flyAnimation->setEasingCurve(QEasingCurve::InQuad);
m_flyAnimation->start();
m_IsLandFall = false;
}
}
bool FlappyBird::checkIsCollided()
{
if (!collidingItems().isEmpty())
return true;
else
return false;
}
void FlappyBird::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Space)
{
flyRaiseAnimation();
}
}
游戏开始按钮










