QT:完整的人機五子棋遊戲(五)回合倒計時和音效
阿新 • • 發佈:2020-07-24
2.5回合倒計時
在對弈時,每個回合都要有時間的限定,一般都是用的圓形進度條和中間秒數顯示。
QT當中沒有圓形的進度條,所以需要自己設計。圓形設計進度條傳送門:圓形進度條設計
圓形進度條需要時間軸搭配使用。
①定義自定義進度條類和時間軸類,需新增對應標頭檔案。
ArcPaint * progressStepPrompt; QTimeLine * timeLine;
②建立兩個例項,並設定時間軸執行狀態。
設定幀範圍為15,則剛好是1秒鐘1幀,幀改變時,會有訊號發射,自定義槽函式接收訊號,則幀改變時,自動更新倒計時即可;
時間軸具有值改變訊號(值範圍0.0~1.0),剛好定義槽函式接收顯示圓弧(0~360°);
時間軸具有時間執行完成訊號,剛好定義槽函式接收判斷當前回合是否超時。
progressStepPrompt = new ArcPaint(this); timeLine = new QTimeLine(15000,this); // 時間軸總時間15秒 timeLine->setFrameRange(0, 15); // 幀範圍0~15 timeLine->setDirection(QTimeLine::Backward); // 時間軸向後走,預設向前 timeLine->setCurveShape(QTimeLine::LinearCurve); // 時間軸速度不變,預設先慢後快,最後慢
自定義槽函式,與訊號連線如下:
// timeLineconnect(timeLine, SIGNAL(frameChanged(int)), this, SLOT(updateFrame(int))); connect(timeLine, SIGNAL(valueChanged(qreal)), this, SLOT(timeValueChanged(qreal))); connect(timeLine, SIGNAL(finished()), this, SLOT(timefinished()));
槽函式實現:
1 void FiveChess::updateFrame(int frame) 2 { 3 staticslot functionint i = 0; 4 if (frame <= 5) 5 { 6 soundList->setCurrentIndex(2); 7 music->play(); 8 } 9 progressStepPrompt->setCenterText(frame); 10 // qDebug() << "fram change!" << i++; 11 } 12 13 void FiveChess::timeValueChanged(qreal value) 14 { 15 progressStepPrompt->setArcAngle(360 * value); 16 } 17 18 void FiveChess::timefinished() 19 { 20 CurrentRound cur = currentRound == player ? computer: player; 21 GameOverPrompt(cur); 22 progressStepPrompt->setVisible(false); 23 chessboard->setDropFlag(false); 24 gameOverFlag = true; 25 if(currentRound==player) { 26 ui->msgLabel->setText("超時失敗!"); 27 } else { 28 ui->msgLabel->setText("對方超時!"); 29 } 30 }
③回合未進行時,進度條禁能,不顯示,當回合到來時,根據當前回合,獲取玩家頭像位置座標,然後使能和顯示,並開啟時間軸。圓圈會依時間進行圓弧倒退並倒計時顯示。更換回合時,來回顯示。
1 void FiveChess::pregressPrompt() 2 { 3 progressStepPrompt->setVisible(true); 4 if (currentRound == computer) { 5 timeLine->stop(); 6 progressStepPrompt->move(ui->computerLabel->pos()+QPoint(-5,6)); 7 timeLine->start(); 8 } else { 9 timeLine->stop(); 10 progressStepPrompt->move(ui->playerLabel->pos()+QPoint(-5,6)); 11 timeLine->start(); 12 } 13 }
2.6音效
①找幾個簡短MP3音效檔案,新增進資原始檔。
②定義媒體播放類和播放列表,除了新增標頭檔案外,還需要在工程檔案(.pro)中新增模組:QT += multimedia
1 QMediaPlayer * music; 2 QMediaPlaylist * soundList;
③初始化中建立媒體播放器和播放列表例項,在播放列表中新增音效曲目並設定為單曲一次模式,把播放列表給媒體播放器。
1 music = new QMediaPlayer; 2 soundList = new QMediaPlaylist; 3 soundList->addMedia(QMediaContent(QUrl("qrc:/sound/press.mp3"))); 4 soundList->addMedia(QMediaContent(QUrl("qrc:/sound/start.mp3"))); 5 soundList->addMedia(QMediaContent(QUrl("qrc:/sound/clock.mp3"))); 6 soundList->addMedia(QMediaContent(QUrl("qrc:/sound/win.mp3"))); 7 soundList->setPlaybackMode(QMediaPlaylist::CurrentItemOnce); 8 music->setPlaylist(soundList);
④在需要顯示音效的地方,修改當前播放的下標,進行播放。播放列表下標與新增順序對應,此處範圍為0~3
1 soundList->setCurrentIndex(0); 2 music->play();
⑤開始遊戲時,提示開始音效;落子時,提示落子音效;倒計時最後5秒,提示落子音效;結束時,提示音效。