学习 PixiJS — 精灵状态

本文介绍如何在游戏开发中使用精灵状态来控制角色动画,包括静态和动态状态的定义,以及如何响应键盘输入来改变精灵方向和行走动画。
部署运行你感兴趣的模型镜像

精灵状态

如果你有复杂的游戏角色或交互式对象,你可能希望该角色根据游戏环境中发生的情况,以不同的方式运行。每个单独的行为称为状态。如果你在精灵上定义状态,那么只要游戏中出现与该状态相对应的事件,就可以触发这些状态。
比如,通过键盘的方向键控制一个游戏角色时,按下左箭头,角色就向左移动,其实可以理解为,按下左键头时,触发了角色的向左移动的状态。

如果要开始使用精灵状态,首先需要一个状态播放器。状态播放器用于控制精灵状态。Pixi 精灵没有自己的状态播放器,但你可以使用 SpriteUtilities 库中的 sprite 的方法,该方法将创建一个内置状态播放器的精灵。

SpriteUtilities 库的使用上一篇提到过了,可以看 学习 PixiJS — 动画精灵 这篇文章。

sprite

定义:

使用 sprite 函数制作任何类型的 Pixi 精灵。

用法:

let anySprite = su.sprite(frameTextures, xPosition, yPosition);

参数:

第一个参数 frameTextures 可以是以下任何一个:

  • 一个 PNG 图像字符串
  • 一个Pixi 纹理对象
  • 纹理图集帧 id 数组
  • 一个 PNG 图像字符串的数组
  • 一个 Pixi 纹理对象数组

如果你为 sprite 方法提供一个数组,它将返回一个动画精灵,这个动画精灵会内置了一个状态播放器。

状态播放器只是四个新属性和方法的集合,用于控制精灵动画状态。

  • fps:用于设置精确的动画速度的属性,以每秒帧数为单位。它的默认值是12,fps 与游戏循环 fps 无关,这意味着你可以让精灵动画以独立于游戏或应用程序速度的速度播放。

  • playAnimation:一种播放精灵动画的方法。如果要播放帧的子集,就传入开始帧编号和结束帧编号两个参数。默认情况下,动画将循环播放,除非你将精灵的 loop 属性值设置为 false

  • stopAnimation:一种在当前帧停止精灵动画的方法。

  • show:接受参数是一个数字,用来显示特定帧编号的方法。

第二个参数 xPosition 和 第三个参数 yPosition 表示创建的精灵的 xy 坐标。

什么是精灵状态?

下图是一个游戏角色的 PNG 图像,其中包含使角色看起来像是在四个不同方向行走所需的所有帧。

在这里插入图片描述

这个雪碧图中实际上有八个精灵状态:四个静态状态和四个动画状态。让我们看看这些状态是什么以及如何定义它们。

静态状态

精灵的静态状态定义精灵在不移动时的四个位置。这些状态是:downleftright,和up。下图显示了雪碧图上的状态以及标识这些状态的帧号。

在这里插入图片描述

可以看到第0帧是向下状态,第4帧是左侧状态,第8帧是右侧状态,第12帧是向上状态。怎么定义这些状态呢?首先,创建精灵,以下代码展示了如何使用 sprite 方法创建精灵。

let frames = su.filmstrip("images/Iori.png", 32, 32);
let Iori = su.sprite(frames);

接下来,在精灵上创建一个名为 states 的对象字面量属性。并在 states 对象中创建downleftright,和up 的键。将每个键的值设置为与状态对应的帧编号。

Iori.states = {
    down: 0,
    left: 4,
    right: 8,
    up: 12
};

接下来就是使用精灵的 show 方法来显示正确的状态。例如,以下代码展示如何显示精灵的 left 状态:

Iori.show(Iori.states.left);

下图显示了改变这些状态对精灵外观的影响。

在这里插入图片描述

你在可以在任何你需要的地方使用它,让精灵对游戏世界的变化作出反应。比较常见的一个场景是在键盘按键的时候,这样你就可以通过箭头键的方向改变精灵面向的方向。例如,按下左箭头键时,你可以通过以下方式将精灵转向左侧。

//左箭头按下
left.press = () => {
 //显示`left`状态
 Iori.show(Iori.states.left);
};

只需对其余的箭头键使用相同的格式,就可以使精灵面向所有的四个方向。

动画状态

精灵的动画状态定义了精灵移动时的四个动作序列。这些状态是:walkDownwalkLeftwalkRight,和walkUp 。下图显示了这些状态在雪碧图上的位置。

[外链图片转存中…(img-VSoCxozn-1712410142452)]

这些状态中的每一个由​四个帧组成,当在循环中播放时,将创建连续的步行动画。要定义每个动画状态,就在 states 对象中创建描述该状态的键。键的值应该是一个包含两个元素的数组:起始帧编号和结束帧编号。例如,以下是如何定义 walkLeft 状态:

//3是动画序列 开始的帧编号,5是结束的帧编号
walkLeft: [3, 5]

以下是如何将这四种新动画状态添加到 Iori 精灵中:

Iori.states = {
    down: 0,
    left: 4,
    right: 8,
    up: 12,
    walkDown: [0, 3],
    walkLeft: [4, 7],
    walkRight: [8, 11],
    walkUp: [12, 15]
};

现在它的状态都被定义了,让我们做一个会走的精灵。

制作动画精灵和定义状态还有键盘响应所学到的知识相结合,就可以制作一个步行游戏角色。

在这里插入图片描述

查看效果

如果希望精灵在屏幕上移动得更快或更慢,就在箭头键方法中更改 vxvy 的值。如果希望精灵的步行动画效果更快或更慢,就更改精灵的 fps 属性。

制作动画帧的工具

  • 使用 Adobe IllustratorPhotoshop 手动绘制每个帧。
  • Flash Professional 只需将动画导出为雪碧图,就可以在 JavaScript 游戏中使用它。你还可以使用 Shoebox 等工具将 Flash 的 SWF 文件格式转换为纹理图集。
  • Piskel 是一个免费的在线工具,用于制作像素风格的动画游戏角色。
  • Dragon BonesSpine,和 Creature。这三个工具都非常相似。它们可以创建复杂的游戏角色,为它们设置动画,并将它们导出为雪碧图和 JSON 文件。
  • Shoebox 是一款基于Adobe Air 的免费应用程序,它的功能挺多,比如可以用来制作雪碧图,也可以拆分雪碧图,还可以检测透明图像中的精灵并将其剪切出来 等。

上一篇 学习 PixiJS — 动画精灵

下一篇 学习 PixiJS — 粒子效果

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think> 我们正在讨论如何学习PixiJS,参考了用户提供的三个引用。用户之前的问题是关于PixiJS是否属于Python,现在已经明确不是,现在用户想获取学习PixiJS的方法。 根据引用,我们可以总结出以下几点学习路径: 1. 引用[1]提到了PixiJS中的文本处理,包括基础文本、位图文本和文本样式。这说明学习PixiJS需要掌握其内置类,比如PIXI.Text, PIXI.BitmapText, PIXI.TextStyle等。 2. 引用[2]强调了PixiJS的运行环境,需要在Web服务器中运行,因为安全限制不能直接通过文件协议(file://)访问。因此,学习PixiJS的第一步是搭建本地服务器,可以使用Node.js的http-server、Python的http.server等。 3. 引用[3]提到了交互工具,PixiJS本身提供的交互功能有限,推荐使用第三方库(如Tink库)来增强交互性。因此,学习PixiJS的过程中,还需要了解如何集成第三方库来扩展功能。 因此,我们可以将学习PixiJS的方法分为以下几个步骤: 第一步:搭建开发环境 - 安装Node.js或Python(用于搭建本地服务器)。 - 使用Node.js的http-server模块或Python的http.server模块启动一个本地服务器。 - 创建一个项目目录,并在其中编写HTML和JavaScript文件。 第二步:学习PixiJS基础 - 引入PixiJS库:通过CDN或本地文件引入。 - 创建应用:初始化PIXI.Application,设置渲染视图(renderer view)并添加到DOM中。 - 绘制基本图形:学习使用PIXI.Graphics绘制矩形、圆形等。 - 加载和显示图片:使用PIXI.Loader加载图片,创建精灵(sprite)并添加到舞台(stage)。 第三步:深入学习特定功能 - 文本处理:如引用[1]所述,学习使用PIXI.Text, PIXI.BitmapText, PIXI.TextStyle等类来创建和样式化文本。 - 动画:使用PIXI.Ticker或requestAnimationFrame来创建动画效果。 - 交互事件:处理鼠标和触摸事件,例如点击、拖拽等。 第四步:使用扩展库增强功能 - 如引用[3]所述,集成第三方库(如Tink)来实现更丰富的交互,例如拖放精灵、按钮对象、键盘控制等。 第五步:实践项目 - 创建一个小游戏或交互式应用来巩固所学知识。 此外,官方文档和示例是重要的学习资源: - 官方文档:http://pixijs.download/release/docs/index.html - 示例:http://pixijs.io/examples/ 下面给出一个简单的示例代码,展示如何搭建一个PixiJS应用: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>PixiJS 示例</title> <script src="https://pixijs.download/v6.5.8/pixi.min.js"></script> </head> <body> <script> // 创建Pixi应用 const app = new PIXI.Application({ width: 800, height: 600 }); document.body.appendChild(app.view); // 绘制一个矩形 const rectangle = new PIXI.Graphics(); rectangle.beginFill(0x66CCFF); // 蓝色 rectangle.drawRect(0, 0, 100, 100); rectangle.endFill(); rectangle.x = 200; rectangle.y = 150; app.stage.addChild(rectangle); // 加载并显示图片 const sprite = PIXI.Sprite.from('example.png'); sprite.x = 400; sprite.y = 300; app.stage.addChild(sprite); </script> </body> </html> ``` 注意:这个示例需要在服务器环境下运行(如通过http-server),否则可能无法加载图片资源[^2]。 最后,生成相关问题: 1. 如何用PixiJS创建一个简单的动画? 2. PixiJS中如何处理用户交互(例如点击事件)? 3. 在PixiJS中,位图文本(BitmapText)和普通文本(Text)有什么区别? 4. 如何优化PixiJS应用的性能? </think> 以下是系统化的PixiJS学习方法,结合实践路径和关键资源: ### 一、基础环境搭建(开发起点) 1. **本地服务器配置**(解决安全限制) PixiJS需在HTTP服务器运行(不可用`file://`协议)[^2]: ```bash # Node.js方案(推荐) npm install -g http-server http-server . # Python方案 python -m http.server 8000 ``` 2. **项目初始化** HTML基础模板: ```html <!DOCTYPE html> <script src="https://pixijs.download/v7.3.2/pixi.min.js"></script> <script> const app = new PIXI.Application({ background: '#1099bb' }); document.body.appendChild(app.view); // 在此添加图形代码 </script> ``` ### 二、核心模块学习路径 1. **图形渲染基础** - 几何绘制:`PIXI.Graphics`绘制形状(圆/矩形/多边形) - 精灵创建:`PIXI.Sprite.from("image.png")`加载图片 - 容器管理:`PIXI.Container`分组管理对象 2. **文本系统专项**(引用[1]重点) | 类型 | 类名 | 特点 | 适用场景 | |---|---|---|---| | 基础文本 | `PIXI.Text` | 实时矢量渲染 | 动态文本/UI标签 | | 位图文本 | `PIXI.BitmapText` | 预渲染字符集 | 游戏分数/高频更新文本 | | 文本样式 | `PIXI.TextStyle` | 控制字体/颜色/描边 | 统一文本风格管理[^1] | ```js // 创建带样式的文本 const style = new PIXI.TextStyle({ fill: "#FF3300", fontSize: 36, stroke: "#4a1850" }); const text = new PIXI.Text("Hello PixiJS", style); app.stage.addChild(text); ``` 3. **交互系统进阶**(引用[3]延伸) - 原生事件:`sprite.eventMode = 'static'` + `on('click',...)` - 扩展库集成: ```js // 使用Tink库增强交互 import * as Tink from "@tinkers/tink"; const pointer = Tink.makePointer(app.renderer); pointer.hover(buttonSprite); // 自动添加悬停效果 ``` ### 三、高效学习资源 1. **官方文档** - [核心API文档](http://pixijs.download/release/docs/index.html) - [交互示例库](http://pixijs.io/examples/) 2. **实践项目推荐** - 初级:动态图表可视化 - 中级:2D平台小游戏 - 高级:SVG与WebGL混合渲染 3. **调试工具** 启用PixiJS开发模式查看渲染信息: ```js PIXI.utils.skipHello(); // 隐藏启动LOGO app.renderer.view.addEventListener('webglcontextlost', handleContextLost); ``` ### 四、性能优化要点 1. 纹理集打包:用TexturePacker合并小图 2. 对象池模式:复用精灵降低GC压力 3. 渲染分层:分离静态/动态元素减少重绘 4. WebGL状态监控:`app.renderer.stats`查看渲染耗时
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值