在对弈时,每个回合都要有时间的限定,一般都是用的圆形进度条和中间秒数显示。
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); // 时间轴速度不变,默认先慢后快,最后慢
自定义槽函数,与信号连接如下:
// timeLine connect(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 static int 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 }
①找几个简短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秒,提示落子音效;结束时,提示音效。
原文:https://www.cnblogs.com/alex-space/p/13373600.html