前言

记得几年前刚做前端开发的时候,跟着师傅用纯 es5 实现了这款坦克大战,可以说我入行前端是从 javascript 小游戏开始的,时间已匆匆过去了数年,前端发展日新月异,各种新框架、新概念层出不穷,很容易就迷失在对各种新技术的盲目学习和应用中,真正的编程是什么呢?值得思考的问题。

我准备用 vue3 重新实现一下这款游戏,顺便回顾和梳理下自己的知识体系。

w/上 s/下 a/左 d/右 f/射击

让我们开始吧!

架构搭建

项目技术选型为 vue3、vite、less、pnpm、ts,按照vue3 官网文档来新建项目,注意:虽然我用了 vue3 实际上只是强行尝鲜,主体内容都是 js 用到的框架特性有限。

canvas 构造函数

游戏的核心为 canvas 画布和坦克元素,我们定义两个构造函数

canvas 构造函数的定义参数、方法:dom、dimension 尺寸、renderto 渲染函数、drawtext 文本绘制函数、drawimageslice 图片绘制函数

画布绘制

canvas 图层按照一般的游戏设计优化理念,需要为静态背景和动态元素单独用不同的 canvas 图层表示,每次更新时只需要重新绘制动态元素就好了,我抽象出一个渲染函数

文本渲染

想要知道画布中的具体位置坐标,可以定义一个函数,当鼠标滑动时候执行来将当前位置坐标绘制出来

画布重绘前的 clear

每次重绘前需要先擦掉整个画布

核心:绘制函数

坦克、子弹、建筑等元素等绘制都是通过这个函数来完成的,实现远离是利用来雪碧图,通过坐标抓取特定位置的图片元素来获取各种不同坦克等元素的ui;

通过 rotate 旋转元素来实现坦克的转向;

battlecity 构造函数

battlecity 构造函数定义坦克的各种配置信息,和方法函数

实现坦克的移动

用键盘的 w、s、a、d、来表示上下左右方向键,按下键盘则会触发对应坦克实例的 move 函数,用于计算移动后的位置坐标信息,注意:对边界条件的判断,不可使其超出战场边界。

坦克发射子弹的逻辑

首先需要定义子弹的配置信息以及构造函数;

然后再定义一个 fire 开发函数,当开火后,会使用 window.requestanimationframe() 来达到循环的效果,每次重绘最新的位置信息

总结

利用 requestanimationframe 来实现循环刷新画布,通过修改各元素位置坐标值,在下一次画布重绘时更新视图,这是阶段交互的基本逻辑;

到这里已经实现了坦克移动和发射子弹的效果。

以上就是vue3+canvas实现坦克大战游戏的详细内容,更多关于vue3 canvas坦克大战的资料请关注www.887551.com其它相关文章!