问题标签 [sprite-sheet]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
231 浏览

performance - 精灵表排列算法

我正在使用 opengl 和 sprite-sheets 为 android 创建一个简单的 2d 游戏,现在要创建这些 sprite-sheets 我使用 zwoptex。

我的问题是,是否有任何实用程序可以使用任何算法而不是其他任何算法,例如,目前我正在使用树,因为它似乎浪费了很少的空间(尽管 max rect 似乎也不错)。

除了有效利用空间来优化显卡性能之外,是否还有其他考虑因素,例如,如果动画中的 2 个关键帧在精灵表上相隔很远,那么在它们之间切换是否存在相关成本,或者这无关紧要,因为整个 spritesheet 包含在 GPU RAM 中?

如果没有这种可能的速度优势,那么不同的算法究竟是如何工作的,所以我可以决定哪种算法对我的想法最有效?

0 投票
1 回答
567 浏览

javascript - 在现有代码中使用 EaselJS 精灵表

我想修改使用图像进行动画处理的现有代码,并改用精灵表。我为此使用 EaselJS 库。

为动画创建对象的代码:

这是完整的代码:

我如何替换我创建的精灵使用的图像?

0 投票
1 回答
492 浏览

ios - cocos2d ios应用程序的spritesheet应该放入什么样的图像?

我为这个冗长的问题预先道歉,有多个子问题,但问题确实如标题中所述。接下来是对问题不同方面的详细分解。

在我使用 cocos2d 构建的通用 ios 游戏中,我有四类图像 - 我想确定哪些应该进入 spritesheets,哪些最好作为单独的图像加载。我目前的猜测是,只有在整个游戏中运行的角色动画才能提供作为 spritesheets 加载到内存中的值:

  1. 在整个游戏过程中运行的角色动画(用户在菜单中时除外):对于这些,我假设将图像放在 spritesheet 中将减少运行时内存使用量(由于单个文件的填充到两个字节边界的幂),因此它们是精灵表的候选者。那是对的吗?
  2. 小图像(大约 200 个),其中 0 到 4 个在游戏过程中随时显示,随机选取。对于这些,我不确定是否值得将所有 200 张图像加载到内存中,而一次最多只能使用 4 张。因此,直接将它们作为图像访问可能会更好。那是对的吗?
  3. 一些(大约 20 个)小的菜单元素,例如仅在静态菜单中使用的按钮:由于菜单项仅在菜单显示期间使用,我认为它们在通过 spritesheets 改善内存访问方面没有太大价值。那是对的吗?
  4. 一些用作菜单背景、游戏场景等的大图像。这些图像大多数与屏幕分辨率一样大。由于屏幕分辨率大致等于单个图像的最大尺寸(例如,对于 ipad Retina,图像尺寸为 4096 x 4096 与屏幕尺寸为 2048 x 1536),使用 spritesheets 最多没有太多增益 1或 2 个大图像将适合一个精灵表。此外,由于这些大文件中的每一个都只在一个场景中使用,因此将所有这些大图像作为 spritesheets 预先加载到内存中似乎是一种不必要的开销。因此,直接将它们作为 spritesheets 访问。那是对的吗?

几个常见的相关问题:

a) 将不同场景中使用的图像打包到同一个 spritesheet 中,即使在该场景中只使用了图像的一个子集,我们也可以将它们加载到内存中。我认为这是一个坏主意。正确的?

b) 仅在较旧的设备(iPad 1 和 iPhone 3gs)上玩游戏时会出现口吃。spritesheets 会帮助减少这种卡顿吗?

c) 我假设 spritesheets 只会有利于运行时内存占用,而不是应用存档的磁盘大小。例如,我注意到一组大小为 11.8 MB 的文件在放入 spritesheet 时为 11 Mb - 压缩优势不大。这是一个有效的假设吗?

请让我知道您对上述理由的看法。

谢谢

阿南德

0 投票
1 回答
2245 浏览

c++ - 使用着色器在 OpenGL 中绘制精灵表的技术

我现在正在学习 OpenGL,我想从精灵表中将一些精灵绘制到屏幕上。我注意到我是否以正确的方式这样做。

我想做的是用泰拉瑞亚的瓷砖建造一个世界。这意味着构建我的世界的所有图块都是 1x1,但我以后可能想要一些东西,比如 2x1、1x2、2x2 等实体。

我现在要做的是,我有一个名为“Tile”的类,其中包含 tile 的变换矩阵和指向其缓冲区的指针。非常简单:

然后,当我绘制瓷砖时,我只需绑定缓冲区并更新着色器的 UV 坐标和顶点位置。之后,我将图块的变换矩阵传递给着色器并使用 glDrawElements 绘制它:

我能更有效地做到这一点吗?我在想我可以有一个用于 1x1 瓦片的缓冲区,一个用于 2x1 瓦片等的缓冲区,然后让 Tile 类包含 UVpos 和 UVsize,然后将它们发送到着色器,但我不确定我是如何会那样做。

我认为我用一个用于 1x1 的缓冲区和一个用于 2x1 的缓冲区所描述的听起来会快很多。

0 投票
1 回答
1004 浏览

python - PySide:分离精灵表/将图像分离成连续的颜色区域

我正在开发一个程序,我需要在其中分离 spritesheets,或者换句话说,将图像分离成连续的颜色区域。

我以前从来没有做过任何图像处理,所以我想知道我会怎么做。测试像素颜色后我会做什么?确定每个精灵对应哪个像素的最佳方法是什么?

所有输入图像都有统一的背景,与背景不同的 alpha 通道算作颜色。输出图像的顺序需要从左到右,从上到下。我的项目是用 PySide 编写的,所以我也希望将它用于此任务,但如有必要,我可以导入更多库。

感谢您的回复!

PS:我不确定 PySide 标签是否合适,因为我使用的是 PySide,但问题不涉及它的 GUI 方面。如果一个模组觉得它不属于它,请随意删除它。


例如,我有一个看起来像这样的精灵表:

输入图像

我想把它分成这些:

输出 1 输出 2 输出 3 输出 4 输出 5 输出 6 输出 7 输出 8

0 投票
1 回答
83 浏览

cocos2d-iphone - 我们应该使用哪些 API 来将 spritesheets 和 sprites 添加到 cocos2d 游戏中?

在创建 cocos2d iOS 游戏时,有几种添加 spritesheets 的选项 - CCTextureCache::addImageAsync、CCSpriteFrameCache::addSpriteFramesWithFile 等 - 使用这些不同的方式添加 spritesheet 有什么区别?

类似地,要加载一个精灵,我们可以调用 CCSprite::spriteWithSpriteFrameName 或 CCSprite::spriteWithFile 或 CCSpriteBatchNode::batchNodeWithTexture 等。使用这些技术有什么区别?

谢谢

阿南德

0 投票
2 回答
1129 浏览

cocos2d-iphone - cocos2d如何加载加载场景背景而不出现空白?

我有一个cocos2d游戏,它有一个加载场景,我们加载了一堆资产。游戏以启动画面开始,然后启动加载场景。加载场景从加载背景开始,因此用户在加载资产时会看到加载场景背景。

CCSprite::spriteWithFile:我通过调用并传递文件路径来加载加载场景背景:loadingbackground.pvr.ccz

它似乎在不同设备上的工作方式不同:

  1. 在 iphone (3gs) 模拟器上,我看到了预期的加载场景。
  2. 在 iphone 视网膜模拟器上,我看不到加载场景(还没有很多资产,所以可能很快就会发生),它直接进入主菜单场景。
  3. 在ipad 3设备上,闪屏出现,然后黑屏半秒,然后出现主菜单场景。

我想看看我能做些什么来避免 iPad 3 上出现黑屏。我怀疑这是因为加载加载背景所花费的时间。

我尝试了以下优化(主要基于@Steffen关于内存优化的博客文章):

  1. 将加载背景(最初为 2.3 MB RGB8 png 文件)单独移动到 pvr.ccz spritesheet 中,将其大小减小到 1.8 MB。
  2. 使用后不久从纹理中删除了图像。

我仍然在 iPad 3 上看到黑屏。有什么建议吗?

更新:发现问题 - 我有一些代码在其中覆盖OnEnter并调用[[CCDirector sharedDirector]replaceScene]它,并且还从后台线程调用相同的代码。删除了 OnEnter 重载,它工作时没有闪烁。

谢谢

0 投票
2 回答
1716 浏览

javascript - 使用分隔符将二维数组划分为多个数组

我已将 JavaScript spritesheet 转换为 2D 整数数组,现在我正在尝试将 2D 整数数组拆分为多个 2D 数组,使用 1 作为“分隔符”数字。

精灵表 有没有办法使用分隔符将如下所示的 2D JavaScript 数组分隔为多个数组,如下所示?

我想到的这个算法的主要应用是 spritesheet 图像分离。

0 投票
0 回答
62 浏览

java - 以下代码中的变量“MAP_WIDTH = 64”用于渲染精灵表有什么用

我想知道“MAP_WIDTH = 64”在下面的代码中做了什么。它取自一系列关于 Java 2d 游戏引擎设计的视频中的一集,我已经链接了有问题的视频。

正在使用的精灵表是 256 x 256 .png,网格/平铺/精灵(?)为 8 x 8。精灵表仅使用 4 种颜色,他们将这 4 种颜色中的每一种设置为代码中的其他颜色。以下代码位于底部链接的视频的第一分钟。(省略了与渲染有关的一些变量)

我无法为我的生活弄清楚发生了什么。64 是从哪里来的?我唯一能看到的是 8 x 8 网格中有 64 个像素,但是为什么还要再乘以 64 呢?它不能是每行/列的像素,因为其中有 256 个,也不能是图块的数量,因为每行/列有 32 个。

我可以看到为什么 int colours[] 比瓦片数组大 4 倍,因为每个像素可以是 4 个值之一,但我很难掌握这一点。

YouTube 链接

0 投票
2 回答
2685 浏览

ios - 什么是“offset”和“sourceColorRect”键texturepacker pList 模式?

我正在编写一个 .NET 服务来提供与纹理打包器模式匹配的数据,使 iOS 开发人员可以轻松使用我生成的精灵表。这是一个基本节点(我还没有找到文档):

除了架构中明显的冗余之外,还有“框架”,这是目标矩形吗?

什么是 sourceColorRect?如果这只是源,为什么不这样称呼它并摆脱 sourceSize,因为那是一种冗余?

另外,什么是抵消?这就像一个注册点的事情吗?如果我们不需要原点坐标信息,我可以忽略它吗?

似乎理想情况下这个列表看起来像

也许只给我自己的 pList 提供简化的数据和 iOS 开发人员将 image_name 确定为键所需的准系统并忘记什么是“框架”会更容易。