亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

Qt實現Flappy Bird游戲

2020-01-26 13:35:36
字體:
來源:轉載
供稿:網友

簡述

最近瀏覽網站的時候,忘記在哪里看的這個FlappyBird了,這個小游戲在之前小火了一段時間。今天用QT簡單的實現了一把,然后在網上找了一些相關的切圖,便進行了制作。難度不是很大,只是通過寫這篇博客,能有點啟發以及大家共同學習。

效果圖

代碼

主界面控制

MainWindow::MainWindow(QWidget *parent) : BasicWindow(parent) , m_startGame(false){ ui.setupUi(this); setAttribute(Qt::WA_TranslucentBackground); initControl();}void MainWindow::initControl(){ loadStyleSheet("MainWindow"); m_scene = new MainGraphicsScene(this, rect()); QGraphicsView* view = new QGraphicsView(m_scene, this); view->setScene(m_scene); view->setStyleSheet("border:none; background:transparent;"); view->setCacheMode(QGraphicsView::CacheBackground); startWelcome();}void MainWindow::startWelcome(){ //道路 GraphicsRoadItem *roadItem = new GraphicsRoadItem(m_scene); //小鳥 m_bird = new FlappyBird(m_scene); //管道 GraphicsPipeitem *pipeItem = new GraphicsPipeitem(m_scene); //游戲狀態檢測,開啟定時器,50ms檢測一次 m_checkGameStatus = new QTimer(this); connect(m_checkGameStatus, SIGNAL(timeout()), this, SLOT(onCheckGameStatus())); //flappybird字母 static const int nLetters = 10; static struct {  char const *pix;  qreal initX, initY;  qreal destX, destY; } letterData[nLetters] = {  { "F", -1000, -1000, 150, 100 },  { "L", -800, -1000, 200, 100 },  { "A", -600, -1000, 250, 100 },  { "P", -400, -1000, 300, 100 },  { "P", 1000, 2000, 350, 100 },  { "Y", 800, 2000, 400, 100 },  { "B", 600, 2000, 260, 160 },  { "I", 400, 2000, 310, 160 },  { "R", 200, 2000, 360, 160 },  { "D", 0, 2000, 410, 160 } }; QSequentialAnimationGroup * lettersGroupMoving = new QSequentialAnimationGroup(this); m_lettersGroupFading = new QParallelAnimationGroup(this); for (int i = 0; i < nLetters; ++i) {  QString& htmlText = QString("<span style=/"font-family:'Berlin Sans FB';font-size:48px;font-weight:600;color:#194819;/">%1</span>").arg(letterData[i].pix);  QGraphicsTextItem *letter = new QGraphicsTextItem();  letter->setHtml(htmlText);  letter->setPos(letterData[i].initX, letterData[i].initY);  QPropertyAnimation *moveAnim = new QPropertyAnimation(letter, "pos", lettersGroupMoving);  moveAnim->setEndValue(QPointF(letterData[i].destX, letterData[i].destY));  moveAnim->setDuration(200);  moveAnim->setEasingCurve(QEasingCurve::OutElastic);  lettersGroupMoving->addPause(50);  QPropertyAnimation *fadeAnim = new QPropertyAnimation(letter, "opacity", m_lettersGroupFading);  fadeAnim->setDuration(1000);  fadeAnim->setEndValue(0);  fadeAnim->setEasingCurve(QEasingCurve::OutQuad);  m_scene->addItem(letter); } lettersGroupMoving->start(QAbstractAnimation::DeleteWhenStopped); //游戲開始按鈕 QPixmap&& pix = QPixmap(":/FlappyBird/Resources/texture/startButton.png").scaled(QSize(160, 48), Qt::IgnoreAspectRatio, Qt::SmoothTransformation); GraphicsButtonItem* btnItem = new GraphicsButtonItem(pix, m_scene); btnItem->setPos(QPointF(220, 340)); QPropertyAnimation *fadeAnim = new QPropertyAnimation(btnItem, "opacity", m_lettersGroupFading); fadeAnim->setDuration(600); fadeAnim->setEndValue(0); fadeAnim->setEasingCurve(QEasingCurve::OutQuad); connect(btnItem, SIGNAL(clicked()), this, SLOT(onStartBtnClicked())); connect(fadeAnim, &QPropertyAnimation::finished, [this](){  m_startGame = true;  m_checkGameStatus->start(50);  m_bird->flyLandfallAnimation(); });}void MainWindow::onCheckGameStatus(){ //檢測小鳥是否與地面和管道發生碰撞 if (m_bird->checkIsCollided()) {  GameOver(); }}void MainWindow::GameOver(){ static const int nLetters = 8; static struct {  char const *pix;  qreal initX, initY;  qreal destX, destY; } letterData[nLetters] = {  { "G", -1000, -1000, 150, 100 },  { "A", -800, -1000, 200, 100 },  { "M", -600, -1000, 250, 100 },  { "E", -400, -1000, 300, 100 },  { "O", 600, 2000, 260, 160 },  { "V", 400, 2000, 310, 160 },  { "E", 200, 2000, 360, 160 },  { "R", 0, 2000, 410, 160 } }; QParallelAnimationGroup * lettersGroupMoving = new QParallelAnimationGroup(this); for (int i = 0; i < nLetters; ++i) {  QString& htmlText = QString("<span style=/"font-family:'Berlin Sans FB';font-size:48px;font-weight:600;color:#194819;/">%1</span>").arg(letterData[i].pix);  QGraphicsTextItem *letter = new QGraphicsTextItem();  letter->setHtml(htmlText);  letter->setPos(letterData[i].initX, letterData[i].initY);  QPropertyAnimation *moveAnim = new QPropertyAnimation(letter, "pos", lettersGroupMoving);  moveAnim->setEndValue(QPointF(letterData[i].destX, letterData[i].destY));  moveAnim->setDuration(200);  moveAnim->setEasingCurve(QEasingCurve::OutElastic);  m_scene->addItem(letter); } lettersGroupMoving->start(QAbstractAnimation::DeleteWhenStopped); m_scene->removeItem(m_bird);}void MainWindow::onStartBtnClicked(){ m_lettersGroupFading->start(QAbstractAnimation::DeleteWhenStopped);}void MainWindow::keyPressEvent(QKeyEvent *event){ if (m_startGame) {  m_bird->keyPressEvent(event); }}

小鳥組件繪制

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(); }}

游戲開始按鈕

GraphicsButtonItem::GraphicsButtonItem(const QPixmap &pixmap, QGraphicsScene *scene) : pix(pixmap){ scene->addItem(this); setCursor(QCursor(Qt::PointingHandCursor));}void GraphicsButtonItem::mousePressEvent(QGraphicsSceneMouseEvent *event){ if (event->button() == Qt::LeftButton) {  emit clicked(); } __super::mousePressEvent(event);}QSizeF GraphicsButtonItem::size() const{ return pix.size();}QRectF GraphicsButtonItem::boundingRect() const{ return QRectF(QPointF(0, 0), pix.size());}void GraphicsButtonItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *){ painter->drawPixmap(0, 0, pix);}

管道組件繪制

#define PIPE_WIDTH 60GraphicsPipeitem::GraphicsPipeitem(QGraphicsScene *scene){ m_scene = scene; m_scene->addItem(this); createPipeHeight(); startMove();}void GraphicsPipeitem::createPipeHeight(){ m_upPipeHeight = qrand() % 100 + 80; m_downPipeHeight = m_scene->height() - m_upPipeHeight - 178;}QRectF GraphicsPipeitem::boundingRect() const{ return QRectF(m_scene->width(), 0, PIPE_WIDTH, m_scene->height());}QPainterPath GraphicsPipeitem::shape() const{ QPainterPath path; path.addRect(QRectF(m_scene->width(), 0, PIPE_WIDTH, m_upPipeHeight)); path.addRect(QRectF(m_scene->width(), m_upPipeHeight + 140, PIPE_WIDTH, m_downPipeHeight)); return path;}void GraphicsPipeitem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){ painter->save(); painter->drawImage(QRectF(m_scene->width(), 0, PIPE_WIDTH, m_upPipeHeight), QImage(":/FlappyBird/Resources/texture/tubeup.png").scaled(PIPE_WIDTH, m_upPipeHeight)); painter->drawImage(QRectF(m_scene->width(), m_upPipeHeight + 140, PIPE_WIDTH, m_downPipeHeight), QImage(":/FlappyBird/Resources/texture/tubedown.png").scaled(PIPE_WIDTH, m_downPipeHeight)); painter->restore();}void GraphicsPipeitem::startMove(){ QPropertyAnimation* moveAnimation = new QPropertyAnimation(this, "pos"); moveAnimation->setLoopCount(-1); moveAnimation->setDuration(3000); moveAnimation->setStartValue(QPoint(0, pos().y())); moveAnimation->setEndValue(QPoint(-1 * m_scene->width() - PIPE_WIDTH, pos().y())); moveAnimation->start(); connect(moveAnimation, &QPropertyAnimation::currentLoopChanged, [this](int loopCount){  createPipeHeight(); });}

地面繪制

#define ROAD_ITEM_HEIGHT 38GraphicsRoadItem::GraphicsRoadItem(QGraphicsScene *scene) :m_scene(scene){ scene->addItem(this); startMove();}QRectF GraphicsRoadItem::boundingRect() const{ return QRectF(0, m_scene->height() - ROAD_ITEM_HEIGHT, m_scene->width() * 2, ROAD_ITEM_HEIGHT);}void GraphicsRoadItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *){ painter->drawImage(QRectF(0, m_scene->height() - ROAD_ITEM_HEIGHT, m_scene->width(), ROAD_ITEM_HEIGHT), QImage(":/FlappyBird/Resources/texture/road.png")); painter->drawImage(QRectF(m_scene->width(), m_scene->height() - ROAD_ITEM_HEIGHT, m_scene->width(), ROAD_ITEM_HEIGHT), QImage(":/FlappyBird/Resources/texture/road.png"));}void GraphicsRoadItem::startMove(){ QPropertyAnimation* moveAnimation = new QPropertyAnimation(this, "pos"); moveAnimation->setLoopCount(-1); moveAnimation->setDuration(6000); moveAnimation->setStartValue(QPoint(0, pos().y())); moveAnimation->setEndValue(QPoint(0 - m_scene->width(), pos().y())); moveAnimation->setEasingCurve(QEasingCurve::Linear); moveAnimation->start();}

結尾

全部代碼,都在上面了,希望對大伙有所點啟發和幫助,只為記錄,只為分享! 愿所寫能對你有所幫助。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲美女www午夜| 亚洲人成电影网站色| 国产精品老女人精品视频| 奇米影视亚洲狠狠色| 欧美色播在线播放| 日韩精品久久久久久福利| 亚洲免费伊人电影在线观看av| 色阁综合伊人av| 精品国产欧美一区二区三区成人| 久久精品小视频| 欧美激情视频给我| 亚洲自拍偷拍一区| 最新国产精品拍自在线播放| 精品亚洲va在线va天堂资源站| 狠狠做深爱婷婷久久综合一区| 疯狂蹂躏欧美一区二区精品| 91网站免费看| 久久久久国产精品免费| 亚洲自拍小视频免费观看| 成人网中文字幕| 国产精品成av人在线视午夜片| 欧美激情亚洲激情| 亚洲一区二区三区777| 国产香蕉精品视频一区二区三区| 久久精品视频播放| 久久精品久久久久电影| 欧美在线中文字幕| 中文欧美日本在线资源| 欧美日韩一区二区在线播放| 国产97人人超碰caoprom| 国产成人高清激情视频在线观看| 亚洲精品理论电影| 国产伦精品一区二区三区精品视频| 精品国产999| 亚洲欧美国内爽妇网| 日韩美女免费观看| 亚洲精品色婷婷福利天堂| 狠狠色狠色综合曰曰| 在线日韩中文字幕| 亚洲欧美色婷婷| 亚洲美女激情视频| 97国产精品视频人人做人人爱| 成人国产精品免费视频| 国产精品久久久久久久久久久久久| 亚洲第一视频在线观看| 日本高清不卡的在线| 成人信息集中地欧美| 色av吧综合网| 91久久久久久久久久久久久| 91久久综合亚洲鲁鲁五月天| 久久中文字幕在线| 色综合久久88| 亚洲精品欧美日韩| 日韩精品在线免费播放| 色综合男人天堂| 亚洲国产精品va在线观看黑人| 亚洲欧美激情一区| 久久久99久久精品女同性| 久久久久久97| 亚洲欧美国产精品久久久久久久| 欧美午夜宅男影院在线观看| 亚洲高清一区二| 国产不卡一区二区在线播放| 俺去亚洲欧洲欧美日韩| 一区二区三区回区在观看免费视频| 91久久精品日日躁夜夜躁国产| 福利视频一区二区| 青青草一区二区| 蜜臀久久99精品久久久久久宅男| www.久久久久久.com| 国产精品男女猛烈高潮激情| 色悠久久久久综合先锋影音下载| 国产精品毛片a∨一区二区三区|国| 亚洲一区二区三区四区视频| 日韩高清电影免费观看完整版| 日韩av在线导航| 国产精品视频播放| 91成人在线视频| 91久久久久久久久久久| 日韩中文字幕免费| 色偷偷偷亚洲综合网另类| 久久中文精品视频| 中文字幕精品国产| 91免费观看网站| 国产999在线观看| 亚洲国产精品成人精品| 亚洲欧美在线一区| 亚洲春色另类小说| 亚洲日本成人女熟在线观看| 亚洲人成在线观看网站高清| 97在线免费观看视频| 欧美成人激情在线| 中文字幕亚洲欧美一区二区三区| 日韩在线播放视频| 欧美激情精品久久久久久免费印度| 国产精品私拍pans大尺度在线| 亚洲福利视频网站| 国产精品久久久久久婷婷天堂| 一色桃子一区二区| 国产精品稀缺呦系列在线| 亚洲成人精品视频在线观看| 性欧美长视频免费观看不卡| 亚洲精品中文字| 亚洲精品欧美日韩专区| 岛国精品视频在线播放| 欧美黑人视频一区| 777精品视频| 日韩欧美亚洲一二三区| 久久久亚洲影院你懂的| 日本成熟性欧美| 日韩福利伦理影院免费| 国产成人综合一区二区三区| 成人免费大片黄在线播放| 97碰碰碰免费色视频| 日韩高清电影免费观看完整版| 久久这里只有精品99| 欧美精品久久一区二区| 成人网在线观看| 亚洲第一视频网站| 日韩中文字在线| 日韩一区二区三区在线播放| 亚洲视频电影图片偷拍一区| 亚洲在线免费观看| 久久久免费精品| 日韩中文字幕国产| 欧美丝袜一区二区| 国产亚洲精品久久久久动| 裸体女人亚洲精品一区| 国产精品三级美女白浆呻吟| 国产精品久久久久久久久久久久久| 欧美性猛交xxxx黑人| 午夜免费在线观看精品视频| 国产精品爽黄69天堂a| 九九久久久久99精品| 羞羞色国产精品| 中文字幕日本欧美| 日韩av在线影院| 亚洲iv一区二区三区| 在线播放亚洲激情| 91超碰中文字幕久久精品| 夜色77av精品影院| 成人a在线观看| 国产日韩精品综合网站| 91日本在线视频| 日韩视频―中文字幕| 日韩毛片在线观看| 57pao国产成人免费| 国产自产女人91一区在线观看| 97香蕉超级碰碰久久免费的优势| 欧美午夜片在线免费观看| 精品伊人久久97| 日韩免费在线播放| 色悠悠久久久久| 精品亚洲一区二区三区在线观看| 日韩av中文字幕在线| 91夜夜揉人人捏人人添红杏| 亚洲少妇中文在线| 国产一区二区黄| 色婷婷av一区二区三区久久| 98精品国产高清在线xxxx天堂| 亚洲欧美日韩图片| 国产亚洲欧美另类中文| 欧美激情视频三区| 日韩av资源在线播放|