假期小项目-黄金矿工


  假期计划用QT写一个小项目-黄金矿工,一边学习QT一边巩固’C+ +,在这里简单记录一下。

  这是我第一次着手C+ +的项目,仿照4399上的游戏来做,能做成什么样我也不是很清楚,先列一下大概的思路吧

场景设置

  从最熟悉的黄金矿工来看大致需要4个场景

开始界面

  从功能上看只需要实现点击开始进入游戏的功能。
4

游戏进行中

  分析游戏画面,不难看出来这里应该有7个功能,分别是
     (1)文字显示,例如当前金钱,时间,目标分数等
     (2)背景以及矿工的实现
     (3)旋转钩子及释放钩子
     (4)返回上一等级的按钮
     (5)时间到后,判断是否达到目标以及进入转场界面
     (6)矿物的显示及移动
     (7)特殊物品的显示及使用
2

转场界面

  游戏时间到之后有一个简单的转场动画,但是达到分数与未达分数界面并不一致,但是背景上总体来说是一样的可以用Qlabel改变文字。
3

商店界面

  商店界面大致分5个功能
    (1)背景及商人的实现
    (2)商人对话框
    (3)物品介绍
    (4)物品显示
    (5)下一关按钮
1

场景实现

开始界面

背景图的实现

  在mainmnue界面重写绘图事件void paintEvent(QPaintEvent *);把开始界面以绘图的方式布置在第一个窗口。

开始按钮的实现

  QT有自带的pushbutton组件,不过并不能实现不规则图形按钮。所以打算自己写一个类。
  mypushbutton类中函数列表如下

1
2
3
4
5
6
7
8
9
//继承QPushButton
MyPushButton(QString normarImg);//创建不规则按钮,图片大小为默认大小,
void init();
void setSize(double n);//重新设置图片大小
//实现简单的跳动动画
//向下移动
void zoom1();
//向上移动
void zoom2();

mypushbutton具体实现方式

  Qpixmap加载图标,通过setFixedSize();setStyleSheet();函数设置图片大小,不规则样式。setIcon();设置图标,setIconSize();设置图标大小(设置图片大小相当于预留空间给图标,而设置图标大小则是使图标充满预留的图片大小空间)。
  因为继承的QPushButton,不用写按钮事件。

简单跳动动画实现方式

  创建QPropertyAnimation动画对象,setDuration();设置时间间隔,setStartValue();设置起始位置,setEndValue();设置结束位置。
  setEasingCurve(QEasingCurve::OutBounce);设置弹起效果,最后让动画执行start();
  动画执行里边有一个参数可以让动画执行完毕后释放动画对象。防止堆区内存泄漏,要加上这个参数
  动画只能向一个方向弹起,所以要用两个函数实现跳动的效果。

游戏进行中界面

文字显示

  用QLabel简单实现四个标签,在获得分数时重写以达到更新的效果。对于时间选择QTime作计时器。

旋转钩子及释放钩子

  重写void paintEvent(QPaintEvent *);,加载图片
  旋转钩子及释放钩子,利用Qpainter实现旋转钩子及释放钩子

1
2
3
4
5

QPainter painter(this)
painter.translate();//设置旋转中心
painter.rotate();//旋转一定角度
painter.translate();//使原点复原

  检测矿工状态,如果在旋转painter.drawPixmap();设置绘图原点,在原地旋转。
如果没有旋转:
1
2
3
4
5
Qpen pen;
pen.setWidth(6);
...//pen参数设置
painter.drawLine();//画线
painter.drawPixmap();//绘图起点

抛出钩子。,通过改变钩子长度属性实现画线长度改变的动画。
  最后update();,强制刷新以达到动画效果。

矿物的显示及移动

  新建类item,用来表示矿物。其属性包括坐标,分值,种类,速度等,在其中导入所有物品图片。
  对特殊矿物如宝藏袋,炸药桶建立特殊函数,对老鼠用QTime和move()实现移动
  增加碰撞检测,输入钩子坐标判断是否发生碰撞。
  如发生碰撞则移动对象,到达矿工处计入得分并释放对象
  时间结束,释放所有未钩到的对象。

特殊物品的显示及使用

  在item类中新增加特殊物品
  在矿工类中保存数据,在每一关开始都创建出对象。
  对不同物品建立对应函数。

转场界面

  背景图重写void paintEvent(QPaintEvent *);
  文字实现用Qlabel.

商店界面

  用随机函数随机建立物品对象,同时控制价格跟随关卡变动。
  购买数据录入矿工类

关卡设计

  新建类dataconfig,用二维数组保存item信息,map确定对应关卡

1
2
3
QMap<int,QVector<QVector<int>>> mDate;

QMap<int,int> mGoal;

结语

  完整的完成一个可执行的程序,一定程度上提升了我的编程能力。后续学习对更大得项目也有了一定的信心。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2024 lucky_dog
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信