@Override public boolean shouldCollide (Fixture fixtureA, Fixture fixtureB) { if ((fixtureA == m_platform && fixtureB == m_character) || (fixtureB == m_platform && fixtureA == m_character)) { Vector2 position = m_character.getBody().getPosition(); if (position.y < m_top + m_radius - 3.0f * 0.005f) return false; else return true; } else return true; }
/** Internal method called from JNI in case a contact happens * @param fixtureA * @param fixtureB * @return whether the things collided */ private boolean contactFilter (long fixtureA, long fixtureB) { if (contactFilter != null) return contactFilter.shouldCollide(fixtures.get(fixtureA), fixtures.get(fixtureB)); else { Filter filterA = fixtures.get(fixtureA).getFilterData(); Filter filterB = fixtures.get(fixtureB).getFilterData(); if (filterA.groupIndex == filterB.groupIndex && filterA.groupIndex != 0) { return filterA.groupIndex > 0; } boolean collide = (filterA.maskBits & filterB.categoryBits) != 0 && (filterA.categoryBits & filterB.maskBits) != 0; return collide; } }
/** Destroy a fixture. This removes the fixture from the broad-phase and destroys all contacts associated with this fixture. * This will automatically adjust the mass of the body if the body is dynamic and the fixture has positive density. All * fixtures attached to a body are implicitly destroyed when the body is destroyed. * @param fixture the fixture to be removed. * @warning This function is locked during callbacks. */ public void destroyFixture (Fixture fixture) { this.world.destroyFixture(this, fixture); fixture.setUserData(null); this.world.fixtures.remove(fixture.addr); this.fixtures.removeValue(fixture, true); this.world.freeFixtures.free(fixture); }
private boolean isPlayerGrounded (float deltaTime) { groundedPlatform = null; Array<Contact> contactList = world.getContactList(); for (int i = 0; i < contactList.size; i++) { Contact contact = contactList.get(i); if (contact.isTouching() && (contact.getFixtureA() == playerSensorFixture || contact.getFixtureB() == playerSensorFixture)) { Vector2 pos = player.getPosition(); WorldManifold manifold = contact.getWorldManifold(); boolean below = true; for (int j = 0; j < manifold.getNumberOfContactPoints(); j++) { below &= (manifold.getPoints()[j].y < pos.y - 1.5f); } if (below) { if (contact.getFixtureA().getUserData() != null && contact.getFixtureA().getUserData().equals("p")) { groundedPlatform = (Platform)contact.getFixtureA().getBody().getUserData(); } if (contact.getFixtureB().getUserData() != null && contact.getFixtureB().getUserData().equals("p")) { groundedPlatform = (Platform)contact.getFixtureB().getBody().getUserData(); } return true; } return false; } } return false; }
private void drawShape (Fixture fixture, Transform transform, Color color) { if (fixture.getType() == Type.Circle) { CircleShape circle = (CircleShape)fixture.getShape(); t.set(circle.getPosition()); transform.mul(t); if (fixture.getType() == Type.Edge) { EdgeShape edge = (EdgeShape)fixture.getShape(); edge.getVertex1(vertices[0]); edge.getVertex2(vertices[1]); if (fixture.getType() == Type.Polygon) { PolygonShape chain = (PolygonShape)fixture.getShape(); int vertexCount = chain.getVertexCount(); for (int i = 0; i < vertexCount; i++) { if (fixture.getType() == Type.Chain) { ChainShape chain = (ChainShape)fixture.getShape(); int vertexCount = chain.getVertexCount(); for (int i = 0; i < vertexCount; i++) {
@Override public float reportRayFixture(Fixture fixture, Vector2 point, Vector2 normal, float fraction) { if (fixture.getBody() == body) { return 1; } if (fraction < 1.0f && fixture.getFilterData().categoryBits == GameManager.BOMB_BIT) { hitting = true; } return 0; } };
Body bodyA = fixtureA.getBody(); Body bodyB = fixtureB.getBody(); if (fixtureA.isSensor()) { Enemy e = (Enemy) bodyA.getUserData(); e.setAngry(false); if(c.getFixtureB().getFilterData().maskBits == MASK_PLAYER && c.getFixtureB() != fixtureB) { e.setAngry(true); break; else if(c.getFixtureA().getFilterData().maskBits == MASK_PLAYER && c.getFixtureA() != fixtureB) { e.setAngry(true); else if(fixtureB.isSensor()) { Enemy e = (Enemy) bodyB.getUserData(); e.setAngry(false); if(c.getFixtureB().getFilterData().maskBits == MASK_PLAYER && c.getFixtureB() != fixtureA) { e.setAngry(true); break; else if(c.getFixtureA().getFilterData().maskBits == MASK_PLAYER && c.getFixtureA() != fixtureA) { e.setAngry(true);
public static void setFilterData(Fixture fixture, short maskBits, short categoryBits, short groupIndex){ Filter filter = fixture.getFilterData(); filter.categoryBits = categoryBits; filter.maskBits = maskBits; filter.groupIndex = groupIndex; fixture.setFilterData(filter); }
@Override public void beginContact(Contact contact) { // TODO Auto-generated method stub Fixture fixtureA = contact.getFixtureA(); Fixture fixtureB = contact.getFixtureB(); Body bodyA = fixtureA.getBody(); Body bodyB = fixtureB.getBody(); if (fixtureA.isSensor()) { Enemy e = (Enemy) bodyA.getUserData(); e.setAngry(true); //Gdx.app.log(TAG, "T-Rex is angry!!!"); } else if(fixtureB.isSensor()) { Enemy e = (Enemy) bodyB.getUserData(); e.setAngry(true); //Gdx.app.log(TAG, "T-Rex is angry!!!"); } }
int cDef = fixA.getFilterData().categoryBits | fixB.getFilterData().categoryBits; if(fixA.getFilterData().categoryBits == MarioBros.MARIO_HEAD_BIT) ((InteractiveTileObject) fixB.getUserData()).onHeadHit((Mario) fixA.getUserData()); else ((InteractiveTileObject) fixA.getUserData()).onHeadHit((Mario) fixB.getUserData()); break; case MarioBros.ENEMY_HEAD_BIT | MarioBros.MARIO_BIT: if(fixA.getFilterData().categoryBits == MarioBros.ENEMY_HEAD_BIT) ((Enemy)fixA.getUserData()).hitOnHead((Mario) fixB.getUserData()); else ((Enemy)fixB.getUserData()).hitOnHead((Mario) fixA.getUserData()); break; case MarioBros.ENEMY_BIT | MarioBros.OBJECT_BIT: if(fixA.getFilterData().categoryBits == MarioBros.ENEMY_BIT) ((Enemy)fixA.getUserData()).reverseVelocity(true, false); else ((Enemy)fixB.getUserData()).reverseVelocity(true, false); break; case MarioBros.MARIO_BIT | MarioBros.ENEMY_BIT: if(fixA.getFilterData().categoryBits == MarioBros.MARIO_BIT) ((Mario) fixA.getUserData()).hit((Enemy)fixB.getUserData()); else ((Mario) fixB.getUserData()).hit((Enemy)fixA.getUserData()); break; case MarioBros.ENEMY_BIT | MarioBros.ENEMY_BIT: ((Enemy)fixA.getUserData()).hitByEnemy((Enemy)fixB.getUserData()); ((Enemy)fixB.getUserData()).hitByEnemy((Enemy)fixA.getUserData()); break;
@Override protected Fixture newObject () { return new Fixture(null, 0); } };
public void draw(IFieldRenderer renderer) { CircleShape shape = (CircleShape)body.getFixtureList().get(0).getShape(); Vector2 center = body.getPosition(); float radius = shape.getRadius(); renderer.fillCircle(center.x, center.y, radius, primaryColor); // Draw a smaller circle to show the ball's rotation. float angle = body.getAngle(); float smallCenterX = center.x + (radius / 2) * MathUtils.cos(angle); float smallCenterY = center.y + (radius / 2) * MathUtils.sin(angle); renderer.fillCircle(smallCenterX, smallCenterY, radius / 4, secondaryColor); }
@Override public boolean reportFixture (Fixture fixture) { // if the hit fixture's body is the ground body // we ignore it if (fixture.getBody() == groundBody) return true; // if the hit point is inside the fixture of the body // we report it if (fixture.testPoint(testPoint.x, testPoint.y)) { hitBody = fixture.getBody(); return false; } else return true; } };
@Override public float reportRayFixture(Fixture fixture, Vector2 point, Vector2 normal, float fraction) { if (fixture.getBody() == body) { return 1; } if (fraction < 1.0f && fixture.getFilterData().categoryBits == GameManager.BOMB_BIT) { hitting = true; } return 0; } };
private void ifCarThenCollide (Contact contact, Fixture f, Fixture other, ContactImpulse impulse) { Body body = f.getBody(); Object userData = f.getUserData(); if ((body != null) && (userData == CarType.PlayerCar || userData == CarType.ReplayCar)) { Car car = (Car)body.getUserData(); if (contact.getFixtureA().getUserData() == CarType.PlayerCar) { fcar = contact.getFixtureA(); } else if (contact.getFixtureB().getUserData() == CarType.PlayerCar) { fcar = contact.getFixtureB(); Vector2 lp = fcar.getBody().getLocalPoint(pts[i]);
Filter filter = body.getFixtureList().get(0).getFilterData(); filter.maskBits = Player.invincibleMaskBit; body.getFixtureList().get(0).setFilterData(filter); renderer.setColor(new Color(1, 1, 1, 1.2f + MathUtils.sin(player.invincibleCountDown * 24))); } else { Filter filter = body.getFixtureList().get(0).getFilterData(); filter.maskBits = Player.defaultMaskBits; body.getFixtureList().get(0).setFilterData(filter); renderer.setColor(Color.WHITE); case DYING: state.setCurrentState("dying"); Filter filter = body.getFixtureList().get(0).getFilterData(); filter.maskBits = GameManager.NOTHING_BIT; body.getFixtureList().get(0).setFilterData(filter);
private void drawShape (Fixture fixture, Transform transform, Color color) { if (fixture.getType() == Type.Circle) { CircleShape circle = (CircleShape)fixture.getShape(); t.set(circle.getPosition()); transform.mul(t); if (fixture.getType() == Type.Edge) { EdgeShape edge = (EdgeShape)fixture.getShape(); edge.getVertex1(vertices[0]); edge.getVertex2(vertices[1]); if (fixture.getType() == Type.Polygon) { PolygonShape chain = (PolygonShape)fixture.getShape(); int vertexCount = chain.getVertexCount(); for (int i = 0; i < vertexCount; i++) { if (fixture.getType() == Type.Chain) { ChainShape chain = (ChainShape)fixture.getShape(); int vertexCount = chain.getVertexCount(); for (int i = 0; i < vertexCount; i++) {
/** Creates a fixture from a shape and attach it to this body. This is a convenience function. Use b2FixtureDef if you need to * set parameters like friction, restitution, user data, or filtering. If the density is non-zero, this function automatically * updates the mass of the body. * @param shape the shape to be cloned. * @param density the shape density (set to zero for static bodies). * @warning This function is locked during callbacks. */ public Fixture createFixture (Shape shape, float density) { org.jbox2d.dynamics.Fixture f = body.createFixture(shape.shape, density); Fixture fixture = new Fixture(this, f); fixtures.add(fixture); world.fixtures.put(f, fixture); return fixture; }
@Override public void beginContact (Contact contact) { System.out.println(String.format("beginContact() addr=%d", getContactAddr(contact))); System.out.println(String.format("beginContact() addrA=%d, addrB=%d", getFixtureAddrA(contact), getFixtureAddrB(contact))); System.out.println(String.format("beginContact() fixA=%s, fixB=%s", contact.getFixtureA(), contact.getFixtureB())); final Body toRemove = contact.getFixtureA().getBody().getType() == BodyType.DynamicBody ? contact.getFixtureA().getBody() : contact.getFixtureB().getBody(); Gdx.app.postRunnable(new Runnable() { @Override public void run () { world.destroyBody(toRemove); } }); }