植物大战僵尸项目
1.项目总体陈述 1
我们需要实现如下功能
1,图形界面:游戏主界面,准备界面
2,放置植物,删除植物,生成僵尸,攻击
3,胜负判断
4,卡牌冷却
5,场景选择(白天黑夜
6,背景音乐,碰撞,防止植物,收集阳光
7,显示阳光槽,植物槽
8,九种植物,七种僵尸
9,特殊功能,快速生成僵尸,增加阳光
10,文件操作(用户名读取,游戏最长时间读取),基本数据结构使用
2.类型实现逻辑
2.0zObject
2.1maindialog类
继承自QDialog:
三个槽函数:草地场景,黑暗场景,返回上一级
每个场景启动前删除原来的scene对象,然后new一个当前场景的类型对象,草地和黑暗场景关联开始场景,开始场景可以通过两个按键的信号调用开始草地和黑暗场景,再scenecpp中发出这些信号
例子
void mainDialog::back()
{
this->setFixedSize(800, 600);
delete scene;
scene = new zStartScene(this);
connect(this->scene, SIGNAL(toLawn()), this, SLOT(startLawn()));
connect(this->scene, SIGNAL(toDarkLawn()), this, SLOT(startDark()));
}
2.2zanim类
继承zobject,所以重写了act,不过不需要血量,有生存情况alive
动画有一个属性frame控制动画帧数
在这个头文件里面同时我们还实现了豌豆击中动画,火动画,僵尸死掉动画,烧死动画,土豆爆炸动画,僵尸头掉下动画,樱桃炸弹爆炸动画,撑杆跳僵尸死掉动画,新闻僵尸死掉动画,新闻僵尸头掉下动画,这些动画全部继承自zanim,每一个里面有一个Qmovie类型的指针,需要析构,这个指针实现
在每一个子类的act里面实现按照各自动画距离消失的帧数(设置this->alive
frame说明它几帧后消失
构造函数:
把QMovie绑定到QLabel(zAnim继承自QLabel)开启动画
面试题:==这个帧数是怎么确定的?==为什么要有这个帧
防止重复播放动画,动画结束就设置alive为false,在每个scene里面会,然后每20ms发送一次超时信号调用onTimer函数,其中进行act和对于已经不alive的对象的清除
动画类型 | frame 值 | 持续时间 |
---|---|---|
zPeaHit (豌豆命中) | 2 | 很短,瞬间消失 |
zZombieDie (僵尸死亡) | 50 | 僵尸倒地的过程 |
zBoom (爆炸) | 40 | 炸弹爆炸特效 |
zBurnDie (燃烧死亡) | 85 | 僵尸被烧死的时间 |
这些动画通常是 短暂的特效,比如 子弹命中、爆炸、燃烧、僵尸死亡,不会一直存在,所以需要 一个方式控制动画的生命周期。这里的 frame
就是用来控制动画存在时间的
我在PIL 查看帧数,发现是100ms一帧,所以我这个20ms一次act应该把frame乘以5
frame
作用
- 控制动画存活时间,防止动画无限播放。
- 确保游戏不会创建太多无用动画,影响性能。
- 短动画快速消失,长动画缓慢播放后删除。