7.pixi.js编写的塔防游戏(类似保卫萝卜)-plist的使用

news2024/11/29 11:48:50

 游戏说明

一个用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/"  

 plist说明:

plist在应用中其实是一个多张静态图片打包为一张图片的功能。

主要作用是减少浏览器的请求。多次请求比较耗时间,打包为一张图片,一个xml文件,这样就可以实现多个图片的少加载

plist主要是在cocos中使用的比较多在pixi中很少见到,并且pixi中的相关加载库也不完善。

pixi实现加载plist思路:

在pixi.js的6.x.x版本中Loader支持registerPlugin可以注册插件。(注意这里的registerPlugin方法在高版本不支持)

registerPlugin传入一个有use方法的对象就可以对加载的资源进行相关处理。

use方法

use(lSou:LoaderResource, next:any) {}

参数一 lSou 是加载的资源

参数二 next 告诉pixi的loader对象我们这一个资源已经加载完成 需要加载下一个资源

use方法主要思路:

第一步.先读取 lSou参数的对象为xml

第二步.获取xml文件里面的图片地址信息

第三步.加载图片等待图片加载完成

第四步.将xml转化为json对象这样可以方便我们循环加载资源因为js对xml的循环不太好

第五步.解析完毕了我们就可以调用next方法进行下一个资源的加载

第一步:

先判断我们获取的资源是否是plist对象的资源,下面是判断是否是plist的方法

function isPlist(lSou:LoaderResource) {
  if (lSou.xhr && lSou.xhr.responseText && lSou.xhr.responseText.indexOf("DOCTYPE plist") !== -1) {
    return true
  } else {
    return false
  }
}

 如果不是plist直接调用next加载下一个资源。

第二步:

根据浏览器的URL对象来拼接获取图片地址

第三步:

通过浏览器的Image对象加载图片

第四步:

读取xml方法:

function readXml(xml:string) {
  let o:any = {}
  const parser = new DOMParser()
  const xmlDoc = parser.parseFromString(xml, "text/xml")
  o = loopXmlDom(xmlDoc.firstElementChild, o)
  return o
}

 调用浏览器的原生对象DOMParser格式化xml文件获取一个dom对象这样方便我们循环xml对象。

循环xml对象将xml转换为json

下面是loopXmlDom的方法

function loopXmlDom(p:Element, o:any) {
  if (p.firstElementChild) {
    if (p.nodeName === "dict") {
      loopXmlDom(p.firstElementChild, o)
    } else {
      o[p.nodeName] = {}
      loopXmlDom(p.firstElementChild, o[p.nodeName])
    }
  } else {
    // o[p.nodeName] = p.textContent
    let first = p
    let next = first.nextElementSibling
    while (first && next) {
      if (first.nodeName.toLocaleLowerCase() === "key") {
        if (next.firstElementChild) {
          if (p.nodeName === "dict") {
            loopXmlDom(next, o)
          } else {
            o[first.textContent] = {}
            loopXmlDom(next, o[first.textContent])
          }
        } else {
          o[first.textContent] = next.textContent || next.nodeName
          o[first.textContent] = o[first.textContent].replace(/[\{]/g, "[").replace(/[\}]/g, "]")
          try {
            o[first.textContent] = JSON.parse(o[first.textContent])
          } catch (e) {
            console.warn(e.toString())
          }
        }

        first = next.nextElementSibling
        if (first) {
          next = first.nextElementSibling
        }
      }
    }
  }
  return o
}

 在获取到图片和plist储存的文件信息数据我们就可以将图片写入到pixi的纹理对象中

下面是方法

async function loadPlistTexture(json:any, img:any, call:any, opt?:any) {
  opt = opt || {}
  opt.name = opt.name || "plist_"
  const endName = []
  for (const i in json) {
    const name = opt.name + i
    const txture = await Texture.fromLoader(img, "", opt.name + i)
    endName.push(name)
    try {
      if (json[i].rotated) {
        txture.frame = new Rectangle(json[i].frame[0][0] + json[i].offset[0], json[i].frame[0][1] + json[i].offset[1], json[i].frame[1][1], json[i].frame[1][0])
        txture.orig = new Rectangle(json[i].frame[0][0] + json[i].offset[0], json[i].frame[0][1] + json[i].offset[1], json[i].frame[1][0], json[i].frame[1][1])
        txture.rotate = groupD8.S
      } else {
        txture.frame = new Rectangle(json[i].frame[0][0] + json[i].offset[0], json[i].frame[0][1] + json[i].offset[1], json[i].frame[1][0], json[i].frame[1][1])
        txture.orig = new Rectangle(json[i].frame[0][0] + json[i].offset[0], json[i].frame[0][1] + json[i].offset[1], json[i].frame[1][0], json[i].frame[1][1])
      }
    } catch (e) {
      debugger
    }
  }

  call && call(endName)
}

 这里我们根据json的数据来写入纹理对象

第五步 

这里调用next即可

这是我们要做的目标:

项目开源地址:

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

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

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

相关文章

NUCLEO-F411RE RT-Thread 体验 (2) - GCC环境 Pin 驱动的移植

NUCLEO-F411RE RT-Thread 体验 (2) - GCC环境 Pin 驱动的移植 1、准备工作 前面控制LED的函数,其实还是调用的hal的函数,RT-Thread分离了驱动层与应用层,驱动层往下对接hal库,往上对接pin组件。 驱动层代码路径如图:…

零基础速成simulink代码生成——stateflow基础3

零基础速成simulink代码生成——stateflow基础3 Stateflow 可以用于嵌入式系统的建模、仿真和代码生成。在嵌入式系统中,Stateflow 可以用于实现控制逻辑、状态机、事件驱动系统等功能。Stateflow 提供了一种图形化的建模语言,可以用于描述状态、转换、事件、动作等元素,并…

新用户注册

业务实现 (一) 字段校验 检验用户名、密码、手机号、验证码如果校验不通过则刷新页面,并显示字段校验失败信息 (二) 校验验证码 点击发送验证码,验证会保存一份到redis,并且会发送至手机输入…

【大数据hive】hive 拉链表设计与实现

目录 一、前言 二、拉链表业务背景 2.1 数据同步引发的问题 2.1.1 解决方案1 2.1.2 解决方案2 2.1.3 解决方案3 三、拉链表设计与原理 3.1 功能与应用场景 3.2 实现步骤 3.2.1 Step1 3.2.2 Step2 3.2.3 Step3 3.3 操作演示 3.3.1 创建一张表并加载数据 3.3.2 模…

高级数据分析师工作的基本职责(合集)

高级数据分析师工作的基本职责1 职责: 1. 负责出行平台层面司乘用户分析,给平台相关业务及策略建设输入洞察和方法; 2. 形成天、周和月度的分析报告,传递给公司管理层并进行定期汇报; 3. 可独立完成针对特定问题的分析解读,支持临…

【数据分享】2023年全国范围的1km分辨率高新技术企业数量栅格数据

企业是经济活动的参与主体。一个城市的企业数量决定了这个城市的经济发展水平!比如一个城市的金融企业较多,那这个城市的金融产业肯定比较发达;一个城市的制造业企业较多,那这个城市的制造业肯定比较发达。 目前,在城…

插件 - 一份配置,离插件机制只有一步之遥

文章目录 Pre优化方案流程图优点缺点举例论证CodePre 插件 - 通过SPI方式实现插件管理 中我们提到了缺点 无法保证唯一实现:在SPI机制中,同一个服务接口可能会有多个提供者实现,而无法明确指定使用哪一个。依赖于配置文件:配置文件是发现和加载提供者的关键,如果配置文件…

Java泛型中的T、E、K、V、?通配符,你确定都了解吗?

目录 前言 泛型带来的好处 泛型中通配符 小结 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操…

7.controller部署neutron服务

Neutron 为整个 openstack 提供虚拟化的网络支持,主要功能包括二层交换、三层路由、防火墙、VPN ,以及负载均衡等。 neutron数据库配置 controller节点 在安装和配置 neutron 服务之前,必须创建服务对应的数据库用于存储相关数据 &#xff0…

多模态简介

1. 多模态定义 多模式深度学习是一个机器学习子领域,旨在训练人工智能模型来处理和发现不同类型数据(模式)之间的关系——通常是图像、视频、音频和文本。通过结合不同的模态,深度学习模型可以更普遍地理解其环境,因为…

【C++】I/O流类库

I/O 数据的输入和输出(input/output简写为I/O),对标准输入设备和标准输出设备的输入输出简称为标准I/O。对在外存磁盘上的文件输入输出简称为文件I/O。对内存中指定的字符串存储空间的输入输出简称为串I/O。 流 数据输入输出的过程&#x…

边缘智能:边缘计算和人工智能的深度融合

摘要 随着通信技术的飞速发展和移动设备使用的激增,一种全新的计算范式——边缘计算正在迅速普及。与此同时,随着深度学习的突破和硬件架构的许多改进,人工智能(AI)应用正在蓬勃发展。在网络边缘产生数十亿字节的数据,对数据处理…

也聊聊BLDC 电机的 10 大热门应用---【其利天下技术分享】

近年来,随着全球提出的低碳,高能效的概念提出,作为高效动力来源的BLDC技术,越来越受到各界的追捧。 大家都知道,BLDC的发展史也就短短几十年的时间,随着近年来,新磁性材料的运用、微电子技术和…

基于大模型的虚拟数字人__虚拟主播实例

基于大模型的虚拟数字人__虚拟主播实例 本文目录: 一、技术的背景: 二、创意名称: 三、创意背景 四、创意目标 五、创意设计 六、技术实现路径 七、完整代码实现 八、创意总结 九、人工智能虚拟人物的一些优秀代表作品及其特点 十、…

河道水位标尺识别预警 yolov7

河道水位标尺识别预警系统通过pythonyolov7网络模型技术,河道水位标尺识别预警算法对河道水位标尺进行实时监测,当河道水位出现异常情况时,河道水位标尺识别预警算法将自动发出警报提示后台管理人员及时采取措施。YOLO系列算法是一类典型的on…

【工具篇】SpringBoot基于assembly的服务化打包方案

简介 最近项目中,使用插件式开发方式,将多个Web应用打成一个FatJar程序包部署运行。但考虑到原始裸Jar包方式交付,有很多不便之处,比如启动命令过长(JVM参数配置、Spring环境配置等)、配置无法修改等问题会…

基于OpenMV的自动驾驶智能小车模拟系统

一、项目简介 基于机器视觉模块OpenMV采集车道、红绿灯、交通标志等模拟路况信息,实现一辆能车道保持、红绿灯识别、交通标志识别、安全避障以及远程WiFi控制的多功能无人驾驶小车。 赛道规格: 1、编程所需软件: OpenMV:使用Op…

cuda pyinstall cvs 使用记录

1.pip 换源 pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/2.安装匹配cuda的pytorch 官网:PyTorch pip3 install torch torchvision torchaudio查看能否使用cuda: import torch torch.cuda.is_available()获得以下反馈: 意思…

CSS基础学习--22 图像透明/不透明

一、透明度属性 CSS3中属性的透明度是 opacity 正常的图像 相同的图像带有透明度: img {opacity:0.4;filter:alpha(opacity40); /* IE8 及其更早版本 */ } 备注:Opacity属性值从0.0 - 1.0。值越小,使得元素更加透明。 IE8和早期版本使用滤…

【MySQL】库和表结构的增删查改

目录 一、库的操作 1、创建数据库 2、数据库所使用的编码 2.1查询编码集和校验集 2.2查看数据库的字符集和校验集 2.3创建数据库指定字符集和校验集 2.4不同的校验集所筛选的数据结果不一样 3、查看数据库 4、修改数据库 5、删除数据库 6、数据库的备份和恢复 6.1备…