JS Canvas实现简易飞机大战:代码结构与核心逻辑解析
本文将解析使用 JavaScript 和 HTML5 Canvas 实现的简易“飞机大战”游戏。该案例采用面向对象编程(OOP)思路,将游戏元素封装为独立的对象类,涵盖自动滚动的星空背景、多帧动画的英雄机、子弹发射检测以及敌方飞机的碰撞销毁机制,适合初学者学习 Canvas 动画制作。
游戏运行结果
开发环境与资源准备
要实现该游戏,需确保本地拥有以下图片资源并放置在 img/ 目录下,代码中通过相对路径引用:
- 背景图:
background.png(用于循环滚动) - UI元素:
start.png(开始标题)、game_loading*.png(加载进度条)、game_pause_nor.png(暂停图标) - 玩家飞机:
hero1.png、hero2.png(飞行姿态)、hero_blowup_n*.png(爆炸序列帧) - 武器:
bullet1.png(子弹素材) - 敌方单位:
enemy1.png/down*(小飞机)、enemy2.png/down*(中飞机)、enemy3*.png/down*(大飞机)
核心对象设计与实现
游戏的核心架构基于构造函数模式,每个游戏实体(背景、英雄机、敌人)都具备 paint()(绘制)和 step()(更新状态)方法。这种设计使得游戏主循环只需遍历调用各对象的更新与绘制方法。
第1步:实现可循环滚动的背景图层
为了营造飞行的视觉效果,背景需要持续向下移动。当第一张背景图完全移出屏幕时,重置其位置以显示第二张图,形成无缝衔接。
- 参数配置:画布宽高
480x650,背景图高852px,宽480px。 - 运动逻辑:在
step()中增加 Y 轴坐标,达到临界值后重置为负高度,保持双图交替。paint()依次绘制两张背景图。
第2步:构建英雄机与输入控制
英雄机的位置由鼠标事件实时驱动,同时负责管理自身的飞行动画和子弹发射。
- 移动入口:监听 Canvas 的
onmousemove事件。计算鼠标偏移量并修正至飞机中心点,更新this.x和this.y。 - 状态管理:正常状态下切换
startIndex实现引擎喷火/变形动画;被击中后进入爆炸序列,播放完毕后扣除生命值或判定游戏结束。 - 火力输出:利用计时器
this.time每 2 帧向bullets数组推送一个新的Bullet实例。
第3步:子弹系统的生成与销毁
子弹是一个动态数组,包含向上位移和生命周期判断。
- 生成与移动:从英雄机顶部坐标发射,
step()中不断减小 Y 值实现上升。paint()使用单一贴图绘制。 - 边界清理:在主循环末尾调用清理函数,移除坐标超出屏幕上方或已被标记为
candel = true(发生碰撞)的子弹对象,防止内存泄漏。
第4步:敌方飞机的生成与碰撞交互
敌方飞机分为三种类型,血量(life)和得分(score)各不相同。它们通过随机数概率在屏幕顶部生成。
- AI行为:普通飞行时 Y 轴逐渐增加,同时按帧率切换图片素材;被击中后切换至
down系列帧,直至动画播放完标记candel = true。 - 碰撞检测:利用 AABB(轴对齐包围盒)算法检查矩形区域重叠:
wo.y + wo.height > this.y && ...。若子弹命中敌方,敌方扣血;若英雄机直接撞毁敌机,双方均触发损毁逻辑并扣分/扣命。
游戏主循环与状态流转
所有游戏逻辑集中在一个 setInterval 定时器中,频率设为 10ms。通过全局变量 state 控制流程:
- Start (0):显示 Logo,等待用户点击画布。
- Loading (1):展示 4 帧加载动画,完成后自动转入 Running。
- Running (2):执行全套更新与绘制指令(背景、英雄机、子弹、敌人、碰撞检测、计分)。鼠标移入移出画布可切换暂停/继续状态。
- Gameover (4):生命值为 0 时停止逻辑刷新,显示 Game Over 文字及 Reboot 选项。
总结
本示例展示了如何使用原生 JavaScript 处理复杂的动画交互逻辑。通过拆分对象职责(绘制、移动、碰撞),避免了冗长的过程式代码,实现了清晰的模块化管理。
以上就是 JavaScript Canvas 简易飞机大战游戏开发的详细内容,更多关于前端游戏开发的技术教程请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













