首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Libgdx:从多个纹理地图集渲染排序的精灵

Libgdx:从多个纹理地图集渲染排序的精灵
EN

Stack Overflow用户
提问于 2014-01-07 12:23:24
回答 2查看 2.2K关注 0票数 2

我需要在屏幕上呈现libgdx (平均20-30)中的对象,所有对象都按Y值排序,因此首先呈现Y值最低的精灵。(想想这个透视图http://i.stack.imgur.com/m1VQA.gif )

游戏使用纹理地图集,每个都有2048*2048的大小。

我现在有三个地图集。一个用于可玩角色,一个用于NPC角色,另一个用于动物/怪物。最后,我们计划添加许多不同的对象、npc集等等,因此将所有的精灵混合到一个大地图集中是不可能的(在设计和硬件方面都可能受到很大的限制)。

当前的呈现方法首先根据Y值对屏幕上的每一帧对象进行排序,然后绘制对象。这是完美的工作,除了事实,这样,许多纹理转换可以发生。

例如:-3只动物-2只npc的玩家-1只npc -1只动物-1只npc-2只动物,

将需要7纹理切换。这完全取决于对象在屏幕上的位置。

根据地图集分类精灵不是一种选择(首先画动物,然后是npc,然后是玩家),因为这将使Y排序不可能。

(我想到的第一件事是将纹理地图集增加到8192*8192,但许多较老的台式电脑和移动设备将无法运行游戏。我想到的第二件事是某种深度缓冲,但如果可能的话,我不知道该如何做。)

必须使用什么方法才能达到预期的结果(从多个纹理中分离出精灵),同时保持稳定的帧速率?是否有任何可行的openGL技巧来做到这一点?我应该担心每帧有6-7个纹理开关吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-07 13:23:09

参见这个链接,它是libgdx测试,有z作为测试的深度,但是您可以使用y轴。

SortedSpriteTest

您需要使用比较器和排序数组,并明显降低游戏的性能。

票数 1
EN

Stack Overflow用户

发布于 2014-01-07 12:42:03

实际上,如果你给你的演员指定的雪碧作为attribut,那就不成问题了。你从不在渲染东西的时候装载任何东西。如果您创建您的演员,您确实加载了精灵,纹理等从阿特拉斯,并把它给你的演员。就像这样:

代码语言:javascript
复制
Texture monster = getTextureByType(type);
Monster mon = new Monster(level, new Sprite(monster), screen, ai,npc);

在你的怪物里面(演员!)你把它们当作雪碧保存下来。我认为普通的构造者

代码语言:javascript
复制
public Monster(int level, Sprite sprite, GameScreen screen, AIInterface ai,
                boolean npc) {
            this.life = 300;
            this.curLife = 200;
            this.ai = ai;
            this.level = level;
            this.sprite = sprite;
            this.sprite.setRegion(0, 0, 32, 48);
    }

抽签很简单:

代码语言:javascript
复制
    @Override
    public void draw(SpriteBatch batch, float parentAlpha) {
        if (alife) {
            sprite.setPosition(this.getX() + ofset, this.getY());
            sprite.draw(batch);
        }
     }

如果你这样做,你将不会有任何问题的框架。不是在这么低的演员人数下。简单地说,不要加载纹理在绘制/渲染周期内,它应该工作没有任何问题。多个地图集也不会有任何问题。地图集不是用来渲染的。它用于将多个纹理放入一个纹理中,以便更容易地处理。您从不从地图集中加载绘图或呈现方法中的某些内容。如果你这样做,你会得到一个非常糟糕的表现。

对于排序,请使用插入排序。这应该比您的szenario中的集合排序更快。也许每隔10帧就叫一次。你甚至不应该注意到,它们在很短的时间内是不正确的。

代码语言:javascript
复制
private void sortList(Array<Actor> array) {
    // double starttime = System.nanoTime();
    for (int i = 1; i < array.size; i++) {
        Actor temp = array.get(i);
        int j = i - 1;

        while (j >= 0 && array.get(j).getY() < temp.getY()) {
            array.set(j + 1, array.get(j));
            j--;
        }
        array.set(j + 1, temp);
    }
    // System.out.println("Time taken: " + (System.nanoTime() - starttime));
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20971539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档