在 LIBGDX 中初始化时碰撞位达到最大值

Posted

技术标签:

【中文标题】在 LIBGDX 中初始化时碰撞位达到最大值【英文标题】:Collision bit reaches its maximum value while Initialization in LIBGDX 【发布时间】:2016-04-20 16:35:07 【问题描述】:

我正在使用 Category_bits 来检测 LIBGDX 中的冲突。我使用了从 0 到 16384 的所有值。由于我们在初始化值时必须使用 2 的幂,所以我已经超出了限制,我无法再初始化任何位。 short_bit 的范围是 0 到 16384,如果我使用该数字的下一个倍数,在将其类型转换为 short 值之后,Category_bits 不会检测到对象之间的冲突。当我将值设置为大于 16384 时,当对象发生碰撞时没有任何反应。

这是我初始化值的方式,

    public static final short x = 0;
    public static final short y = 1; 
    public static final short z = 2;
    public static final short a = 4;
    public static final short b = 8;
    public static final short c = 16;
           .....
    public static final short d = 16384;
     public static final short e = (short) 32768; // exceeded the limit so type casted the number to short

当我输入 cast 并使用它时,不会发生任何碰撞检测。我必须在我的游戏中检测到很多东西的碰撞,所以我需要解决这个问题的解决方案。请帮忙。提前致谢。

【问题讨论】:

【参考方案1】:

我强烈建议重新检查您的代码并确定您是否真的需要这么多不同的类别。即使您有这么多不同类型的对象,我怀疑您可以将具有相同碰撞过滤器的对象组合成一个位,然后您可以使用其他方法来识别碰撞中涉及的实体“类型”。

如果您确实需要使用这么多不同的对象,那么 Box2d World 类有一个方法 setContactFilter(ContactFilter filter),它允许您指定自定义 ContactFilter。这包含一个shouldCollide(Fixture a, Fixture b),如果ab 发生碰撞,则返回true,反之亦然。

【讨论】:

你能给我一个例子来说明如何在二维盒碰撞中使用分组吗?因为没有太多的教程!我关注了这个博客aurelienribon.com/blog/2011/07/…,我很困惑为什么我们必须为碰撞位分配一个负值? @Basim Khajwal【参考方案2】:

short 也适用于负数,因为它从 -32768 到 32767,所以你也可以使用 -32678、-16384 等等。

我不知道如何使用联系人过滤器,但我使用 UserData,这对我也很有效。

当你创建你的身体时,我写了这样的东西:

b2body.createFixture(fdef).setUserData("something");

在我的碰撞检测中,我使用了这样的东西:

public class WorldContactListener implements ContactListener

    @Override
    public void beginContact(Contact contact) 
        Fixture fixA = contact.getFixtureA();
        Fixture fixB = contact.getFixtureB();

        int cdef = fixA.getFilterData().categoryBits | fixB.getFilterData().categoryBits;

switch(cdef) 

case BreedingSeason.HERO_BIT | BreedingSeason.TRAMPOLIN_BIT:
            if(fixA.getUserData() == "somethingElse" && fixB.getUserData() == "something") 
                ...
             else if(fixB.getUserData() == "somethingElse" && fixA.getUserData() == "something") 
                ...
              
            break;

并且不要忘记 switch 中每个 case 之后的 break ;)

希望对你有帮助

【讨论】:

但不要使用 32767,我无法解释为什么,但它对我不起作用

以上是关于在 LIBGDX 中初始化时碰撞位达到最大值的主要内容,如果未能解决你的问题,请参考以下文章

.NET 可达到的最大内存?

超出短值以检测LIBGDX中的冲突

libGDX:FrameBuffer 大小限制 == 最大纹理大小?

元空间大小

Libgdx 项目符号显示碰撞对象

最大钳位电压和额定钳位电压