【经典项目精讲-植物大战僵尸】1项目总体

植物大战僵尸项目

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 作用
  1. 控制动画存活时间,防止动画无限播放。
  2. 确保游戏不会创建太多无用动画,影响性能
  3. 短动画快速消失,长动画缓慢播放后删除

扫描下方二维码获取完整代码

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值