用Canvas复刻一个植物大战僵尸

简介: 用Canvas复刻一个植物大战僵尸

前言


想参加游戏活动,但一点儿思路都没有,今天突然发现活动就要截止了,最后一天了,真不能再摆下去了。


于是花了两个小时复刻了一个植物大战僵尸,只有一关,甚至没有开始按钮🤷‍♂️

大家可以体验一下:tower-defense-mancuoj.vercel.app/


24日晚,大更新

  • 修改文字,颜色,样式
  • 添加美术素材
  • 添加按钮
  • 添加提示信息
  • 如果可能还会继续更新...


image.png


下面说一下整体的思路做一个教程,权当是《抛砖引玉》,有兴趣的朋友可以继续完善,我大抵是没时间继续做下去了【此处教程是最开始的基础代码,点击查看最新代码


游戏界面


脑海对植物大战僵尸的记忆,就是5行,上面还有一行控制栏,几列记不清楚了,这里就当10列吧(为了使用码上掘金,做了同比缩小,与原版代码有所区别)。


把每一个小方格设为50px,于是我们得到了现在的游戏界面:


image.png


我们创建了一个Cell类,同时记录鼠标位置,每次在游戏界面移动鼠标,就会显示之前设置号的小方格标识植物安置点,其中有几个点需要说一下:


  1. 使用 requestAnimationFrame() 进行每次的重绘,每个绘制函数都使用 handleXxx() 的格式 。
  2. collision 碰撞函数非常简单,画两个方块就能轻松理解
  3. Cell事先存在,只要鼠标与Cell位置重合就会调用 draw() 画出
  4. 记录鼠标位置时,需要找到canvas距离边界的距离,绘图时减去该部分


植物 + 炮弹


与Cell类似,我们的植物和炮弹也采用面向对象的方式,效果如下:


image.png


  1. cellGap是因为 collision() 在边角重合时也会判定碰撞,之后的敌人伤害会有bug
  2. 每次放置植物需要判断位置是否合适,同时消耗☀
  3. 植物类内置一个timer,用于控制发射炮弹的频率
  4. 炮弹超出 canvas.width 后,用 splice(i, 1) 删除该炮弹,之后删除全部使用该函数


僵尸 + 胜利 + 失败


依旧是面向对象,效果如下:


image.png


  1. 僵尸本身的逻辑并不复杂,只是与植物,炮弹进行交互比较麻烦
  2. 每次重绘时 frame++,相当于计算帧率,设计一个间隔时间生成僵尸,这个间隔并不是固定的。
  3. 内置timer,用于加速,移动速度越来越快
  4. 每杀死一只僵尸,会得到其血量/5的分数,当分数达到设定值且僵尸数组为0,游戏胜利且不再生成僵尸
  5. 僵尸碰到左边界时,游戏失败,不再进行重绘
  6. 每次生成僵尸时用一个数组记录僵尸在哪一行,方便植物在本行没有僵尸时停止射击,杀死僵尸时删除该位置信息


交互


与植物,炮弹的交互逻辑:


image.png


  1. 当本行有僵尸时开始射击,没有就停止
  2. 当僵尸与植物碰撞时,僵尸停止运动,植物扣血,植物死亡时删除,同时恢复僵尸速度
  3. 炮弹与僵尸碰撞时,僵尸扣血,僵尸死亡时删除僵尸并删除位置信息


随机☀


为了方便赢,特意添加了随机☀,依旧是同一套代码逻辑,这里不多解释了


image.png


后续


非常简单的代码,应该没有后续了🤷‍♂️



目录
相关文章
|
并行计算 API C++
又欲又撩人,基于新版Bert-vits2V2.0.2音色模型雷电将军八重神子一键推理整合包分享
Bert-vits2项目近期炸裂更新,放出了v2.0.2版本的代码,修正了存在于2.0先前版本的重大bug,并且重炼了底模,本次更新是即1.1.1版本后最重大的更新,支持了三语言训练及混合合成,并且做到向下兼容,可以推理老版本的模型,本次我们基于新版V2.0.2来本地推理原神小姐姐们的音色模型。
又欲又撩人,基于新版Bert-vits2V2.0.2音色模型雷电将军八重神子一键推理整合包分享
|
6月前
|
SQL 分布式计算 Serverless
鹰角网络:EMR Serverless Spark 在《明日方舟》游戏业务的应用
鹰角网络为应对游戏业务高频活动带来的数据潮汐、资源弹性及稳定性需求,采用阿里云 EMR Serverless Spark 替代原有架构。迁移后实现研发效率提升,支持业务快速发展、计算效率提升,增强SLA保障,稳定性提升,降低运维成本,并支撑全球化数据架构部署。
610 56
鹰角网络:EMR Serverless Spark 在《明日方舟》游戏业务的应用
|
算法 Windows
Winform控件优化之实现无锯齿的圆角窗体(或任意图形的无锯齿丝滑的窗体或控件)【借助LayeredWindow】
在一般能搜到的所有实现圆角窗体的示例中,都有着惨不忍睹的锯齿...而借助于Layered Windows,是可以实现丝滑无锯齿效果的Form窗体的,其具体原理就是分层窗体....
2163 0
Winform控件优化之实现无锯齿的圆角窗体(或任意图形的无锯齿丝滑的窗体或控件)【借助LayeredWindow】
|
图形学 容器
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版9(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版9(附带项目源码)
248 0
|
存储 图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版11(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版11(附带项目源码)
336 0
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版6(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版6(附带项目源码)
358 1
|
移动开发 HTML5
动漫二次元漂亮的网站导航HTML5源码
二次元漂亮网站导航HTML源码,页面中还调用了很多外站的图片等链接需自行更换。
484 4
|
搜索推荐
一文教会你:如何在搜索过程中过滤CSDN的相关文章,一次设置永久过滤
这篇文章教你如何在浏览器搜索设置中添加自定义搜索引擎,通过在搜索查询中加入"-csdn"参数来过滤掉CSDN的搜索结果,从而提高搜索结果的质量。
一文教会你:如何在搜索过程中过滤CSDN的相关文章,一次设置永久过滤
|
消息中间件 安全 Kafka
Python IPC机制全攻略:让进程间通信变得像呼吸一样自然
【9月更文挑战第12天】在编程领域,进程间通信(IPC)是连接独立执行单元的关键技术。Python凭借简洁的语法和丰富的库支持,提供了多种IPC方案。本文将对比探讨Python的IPC机制,包括管道与消息队列、套接字与共享内存。管道适用于简单场景,而消息队列更灵活,适合高并发环境。套接字广泛用于网络通信,共享内存则在本地高效传输数据。通过示例代码展示`multiprocessing.Queue`的使用,帮助读者理解IPC的实际应用。希望本文能让你更熟练地选择和运用IPC机制。
240 10
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版7(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版7(附带项目源码)
192 0