首页 > 其他 > 详细

QT:完整的人机五子棋游戏(五)回合倒计时和音效

时间:2020-07-24 21:11:56      阅读:67      评论:0      收藏:0      [点我收藏+]

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); // 时间轴速度不变,默认先慢后快,最后慢

自定义槽函数,与信号连接如下:

技术分享图片

    // 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 }
slot function

③回合未进行时,进度条禁能,不显示,当回合到来时,根据当前回合,获取玩家头像位置坐标,然后使能和显示,并开启时间轴。圆圈会依时间进行圆弧倒退并倒计时显示。更换回合时,来回显示。

  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秒,提示落子音效;结束时,提示音效。

QT:完整的人机五子棋游戏(五)回合倒计时和音效

原文:https://www.cnblogs.com/alex-space/p/13373600.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!