5.pixi.js编写的塔防游戏(类似保卫萝卜)-子弹跟随精灵移动

news2024/11/16 15:36:36

 游戏说明

一个用pixi.js编写的h5塔防游戏,可以用electron打包为exe,支持移动端,也可以用webview控件打包为app在移动端使用

环境说明

  cnpm@6.2.0  
  npm@6.14.13  
  node@12.22.7  
  npminstall@3.28.0  
  yarn@1.22.10  
  
  npm config list  
  electron_mirror = "https://npm.taobao.org/mirrors/electron/"  
  home = "https://www.npmjs.org"  
  registry = "https://registry.npmmirror.com/"  

子弹对象的设计

子弹对象应该有多种移动路径(直线,曲线),是否跟踪敌人。

游戏中的运动:

通过在每一帧中移动精灵从而让看起来像在移动

子弹的移动是通过一元方程进行直线的移动,对于曲线移动我们通过贝塞尔曲线来进行曲线运动

下面是相关公式在程序中的使用:

  /**
   * 直线贝塞尔曲线运动
   * @param p0 起点
   * @param p1 终点
   * @param t 常量t
   * @returns 返回常量t所在的位置坐标
   */
  oneBezier(p0: number, p1: number, t: number) {
    return (1 - t) * p0 + t * p1
  },

  /**
   * 曲线贝塞尔曲线运动
   * @param p0 起点
   * @param p1 中点
   * @param p2 终点
   * @param t 常量t
   * @returns 返回常量t所在的位置坐标
   */
  twoBezier(p0: number, p1: number, p2:number, t: number) {
    return (1 - t) * (1 - t) * p0 + 2 * t * (1 - t) * p1 + t * t * p2
  },

 在公式中我们可以通过修改常量t(0-1)来控制运动的过程

对于可跟踪子弹我们可以在移动过程中动态的通过修改起点和终点的位置来达到跟踪的效果。

不启用动态修改位置的运动:

 可以看到子弹会打空

开启动态修改位置的运动:

可以看到子弹不会打空

动态修改终点和开始点的代码:

  
  _updateTrack() {
    // 更新结束位置到精灵所在位置
    this.end.x = this.trackTarget.x
    this.end.y = this.trackTarget.y
    // 更新开始位置为子弹当前位置
    this.start.x = this.x
    this.start.y = this.y
    this.userData._bufferXY = undefined
    // 更新常量t为重新开始
    this.t = 0
    if (this.trackMoveType === BULLET_MOVE_TYPE.BEZIER) {
      this._moveTypeBezier()
    } else if (this.trackMoveType === BULLET_MOVE_TYPE.LINE) {
      this.angle = userUtilsPro.pointsAngle(this.start, this.end)
      // 根据子弹移动速度设置常量t的改变量
      this.tMult = this.speed / userUtilsPro.pointsDis(this.start, this.end)
    }
  }

  protected _moveTypeBezier() {
   
    const dis = userUtilsPro.pointsDis(this.start, this.end)
    // 获取贝塞尔曲线的长度
    const c = userUtilsPro.bezierMidPoint(this.start, this.end, userUtilsPro.PI3, Math.round(dis / 4))
    this.center = {
      x: c[0],
      y: c[1]
    }
    // 根据子弹移动速度设置常量t的改变量
    this.tMult = this.speed / userUtilsPro.getCurveLenght(this.start, this.center, this.end)
  }

 代码中我们修改了子弹对象结束位置的坐标,开始位置的坐标,重置了常量t然后根据移动的距离来动态的修改tMult的改变值 从而让移动动画有一种跟踪的感觉

这是我们要做的目标:

项目开源地址:

GitHub - yinhui1129754/towerDefense: 一个使用pixi.js编写的类似保卫萝卜的塔防游戏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/656887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【详解】篮球记分牌硬件及代码

篮球记分牌设计 1 系统设计1.1 设计任务 1.2 性能指标要求1.2 设计思路及设计框图1.2.1设计思路1.2.2总体设计框图1.2.3电路原理图1.2.3 PCB布线图 2 主要程序模块的设计及原理2.1 外部中断0 2.2 菜单2.3 两队比分及两队犯规次数显示及修改2.3.1选择功能2.3.2修改功能2.3.3显示…

golang vscode环境报错gopls was not able to find modules in your workspace的解决方式

目录 错误提示 分析 解决方式 方法一:将workspace与项目路径保持一致 方案二:使用go work指明纳入工作区的的module 总结 错误提示 golang从老版本升级到go1.20.5后打开vscode,发现代码不能自动补全了,而且vscode跳出一下的…

dolphinscheduler创建创建租户错误

报错信息 [ERROR] 2023-06-17 17:04:10.282 org.apache.dolphinscheduler.api.exceptions.ApiExceptionHandler:[45] - 创建租户错误 org.apache.hadoop.security.AccessControlException: Permission denied: userhdfs, accessWRITE, inode"/":root:supergroup:drw…

搭建自己的 new bing网站----nginx反代(群晖,全docker版)

文章目录 1.前言:2. 部署过程:2.1.部署go-proxy-bing 项目:2.1.部署nginx反代:这两步完成实际上就可以访问了, 3.部署聊天服务器:代表链接成功! 1.前言: 本篇教程全萌新向&#xff…

Qt for Android 调试遇到问题总结

一、首次编译Downloading “Gradle” 无法下载导致编译无法完成问题 解决办法: 1、通过地址:https://services.gradle.org/distributions/gradle-5.5.1-bin.zip单独下载 2、再将下载的gradle-5.5.1-bin.zip放到“C:\Users\hp\.gradle\wrapper\dists\gr…

软件工程导论期末急救包(上)

目录 什么是软件工程?它的目标和内容是什么? 软件文档作用及包含 软件过程模型 瀑布模型 快速原型模型 增量模型 螺旋模型 喷泉模型 软件生存周期 需求分析阶段的基本任务是什么? 可行性研究的任务是什么? 软件是什…

MySQL——MySQL的图形化界面工具安装与使用

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 写在前面: 一.DataGrip安装使用 1). 找到下载准备好的安装包&am…

2023 最新 1200 道 JAVA 面试题,囊括面试所有硬核技能

Java 面试八股文有必要背吗? 我的回答是:很有必要。你可以讨厌这种模式,但你一定要去背,因为不背你就进不了大厂。现如今,Java 面试的本质就是八股文,把八股文面试题背好,面试才有可能表现好。…

power gating/power switch/level shift/IR-drop

目录 1.power gating 2.level shift 3.IR-drop 1.power gating power gating 的设计重点如下: 1)Power Switch的设计; 2)Power Gating controller的设计; 3)retention register和isolation cell的选择及插入; 4)Power Gati…

【Pandas】pandas用法解析(一)

目录 一、生成数据表 1.导入pandas库 2.导入CSV或者xlsx文件 3.用pandas创建数据表 二、数据表信息查看 1.维度查看 2.数据表基本信息(维度、列名称、数据格式、所占空间等) 3.每一列数据的格式 4.某一列格式 5.空值判断 6.查看某一列空值 7…

使用torch的自动微分实现自定义函数优化

前言 目的是利用torch已经有的自动微分机制,进行参数迭代更新,就不用自己写代码算了。 文章目录 前言1. 待优化函数1.1 解释 2. 代码3. 结果 1. 待优化函数 y 10 ( x 1 x 2 − 5 ) 2 ( x 1 − x 2 ) 2 y10\times(x_1x_2-5)^2(x_1-x_2)^2 y10(x1​x…

oracle中如何修改日期类型的字段值

系列文章目录 文章目录 系列文章目录前言一、数据库表方式进行修改二、sql方式步骤总结 前言 Oracle是一家全球领先的数据库管理系统(DBMS)和企业软件公司。Oracle Corporation成立于1977年,总部位于美国加利福尼亚州的红木城(Re…

SpringBoot整合篇

SpringBoot整合第三方技术 1、整合缓存 何为缓存? 缓存是一种介于数据永久存储介质与数据应用之间的数据临时存储介质使用缓存可以有效的减少低速数据读取过程的次数(例如磁盘IO),提高系统性能缓存不仅可以用于提高永久性存储介…

腾讯云最新社招面经出炉(面试原题+答案解析)

前言 大家好,今天给大家分享一篇腾讯云的面经,以下是面试题和答案。加油,一起卷。 聊聊项目,好的设计,好的代码 谈谈什么是零拷贝? 一共有几种 IO 模型?NIO 和多路复用的区别? F…

Get请求参数过多导致请求失败

1. 问题 系统正常使用没有问题,但是有极个别的用户出现系统异常,通过日志发现某个get请求,传入的城市list太多,就会抛出异常 java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map。 2. 排查过程 …

Elasticsearch 安装(Linux)

ElasticSearch 概念安装安装es 后台启动 & 停止启动nohup 记录pid 停止 其他启动错误max number of threads内存不足 Cannot allocate memoryfailed to obtain node locks 概念 ES是一款分布式全文搜索引擎,基于Lucene,进行了二次封装,更…

ElasticSearch笔记02-ElasticSearch入门

ElasticSearch安装 下载软件 ElasticSearch的官网,视频教程里用的Version是7.8.0,所以,我们也是用7.8.0版本的ElasticSearch。 下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch,然后搜索…

车载诊断协议 —— 诊断服务Service 11

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 在最艰难的时候,自己就别去幻想太远的将来,只要鼓励自己过好今天就行了! 这世间有太多的猝不及防,有些东西根本不配占有自己的情绪,人生就是一场体验,…

一种栅格数据的空间聚类方法(ACA-Cluster)

本文结合实例详细讲解了如何使用Python对栅格数据进行空间聚类,关注公众号GeodataAnalysis,回复20230616获取示例数据和代码,包含整体的写作思路,上手运行一下代码更容易弄懂。 带有非空间属性的空间数据聚类分析是空间聚类研究的…

English Learning - L3 作业打卡 Lesson6 Day43 2023.6.16 周五

English Learning - L3 作业打卡 Lesson6 Day43 2023.6.16 周五 引言🍉句1: Thousands of lanterns slowly drift out to sea guiding the dead on their return journey to the other world.成分划分弱读连读爆破语调 🍉句2: This is a moving spectacl…