Libgdx让灯光忽略身体

时间:2013-08-31 16:13:40

标签: java box2d libgdx

我有一个与Box2d和Box2d Lights合作的libgdx游戏。

我的问题是如何让Bodys / Bodydefs忽略Box2d Light中的光源而不投射阴影?

感谢。

  PolygonShape groundBox = new PolygonShape();
  groundBox.setAsBox(2f, 2f);

  FixtureDef gridBox = new FixtureDef();
  gridBox.shape = groundBox;
  gridBox.density = 1.0f;

  gridBox.filter.groupIndex = GRID_GROUP;
  gridBox.filter.categoryBits = GRID_CAT;
  gridBox.filter.maskBits = GRID_MASK;

  bodyDefs[i][j] = new BodyDef();       
  bodyDefs[i][j].position.set(j*factor + factor, i*factor + factor);
  bodyDefs[i][j].fixedRotation = true;
  bodyDefs[i][j].type = BodyDef.BodyType.DynamicBody;

  bodies[i][j] = world.createBody(bodyDefs[i][j]);
  bodies[i][j].createFixture(gridBox);

  handler = new RayHandler(world);
  handler.setCombinedMatrix(camera.combined);
  Filter filter = new Filter();
  filter.groupIndex = GRID_GROUP; // GRID_GROUP = 1
  filter.categoryBits = GRID_CAT; // GRID_CAT = 0x0001;
  filter.maskBits = GRID_MASK;    // GRID_MASK = 1;

  new PointLight(handler, 1000, Color.RED, 2000, 0, height);

  PointLight.setContactFilter(filter);

2 个答案:

答案 0 :(得分:11)

您可以使用以下方法:

cone.setContactFilter( categoryBits groupIndex maskBits );

其中,cone是 ConeLight 类型的对象。现在,这种光将忽略具有的身体 指定的categoryBits,groupIndex和maskBits。

您可以通过主体的夹具设置categoryBits,groupIndex和maskBits 以下方式 -

fixture.filter.categoryBits =您的值;

(categoryBits:碰撞类别位。通常你只需设置一位。)

fixture.filter.groupIndex =您的值;

(groupIndex:碰撞组允许某组对象永远不会碰撞(负)或总是碰撞(正)。零意味着  没有碰撞组。非零组过滤总是胜过掩码位。)

fixture.filter.maskBits =您的值

(maskBits:碰撞掩码位。这表示此形状可以接受碰撞的类别。)

如果您希望某些机构忽略所有灯光,那么您可以使用以下内容 .setContactFilter(categoryBits,groupIndex,maskBits)

答案 1 :(得分:0)

我相信接触过滤器只能使用Box2D Lights应用于所有灯光。我尝试使用aug13引用的setContactFilter方法设置它们,但这是一个从Light继承而且无法从对象调用的静态方法。我不知道在过去的某个时候它是否可以。

来自文档:

public static void setContactFilter(short categoryBits,
                    short groupIndex,
                    short maskBits)

使用参数

为所有灯光创建新的联系人过滤器