package com.indignado.logicbricks.systems.sensors; import com.badlogic.ashley.core.Entity; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.BodyDef; import com.indignado.logicbricks.components.IdentityComponent; import com.indignado.logicbricks.components.RigidBodiesComponents; import com.indignado.logicbricks.core.CategoryBitsManager; import com.indignado.logicbricks.core.controllers.ConditionalController; import com.indignado.logicbricks.core.data.LogicBrick; import com.indignado.logicbricks.core.sensors.CollisionSensor; import com.indignado.logicbricks.systems.sensors.base.ActuatorTest; import com.indignado.logicbricks.systems.sensors.base.BaseSensorSystemTest; import com.indignado.logicbricks.utils.builders.controllers.ConditionalControllerBuilder; import com.indignado.logicbricks.utils.builders.sensors.CollisionSensorBuilder; import org.junit.Test; import static org.junit.Assert.*; /** * @author Rubentxu */ public class CollisionSensorSystemTest extends BaseSensorSystemTest<CollisionSensor, CollisionSensorSystem> { IdentityComponent identityPlayer; IdentityComponent identityGround; private Body bodyPlayer; private Body bodyGround; @Override public void tearDown() { player = null; bodyPlayer = null; bodyGround = null; sensor = null; identityPlayer = null; } @Override protected void createContext() { // Create Player Entity CategoryBitsManager categoryBitsManager = new CategoryBitsManager(); entityBuilder.initialize(); identityPlayer = entityBuilder.getComponent(IdentityComponent.class); identityPlayer.tag = "Player"; identityPlayer.category = categoryBitsManager.getCategoryBits(identityPlayer.tag); bodyPlayer = bodyBuilder .fixture(bodyBuilder.fixtureDefBuilder() .circleShape(1) .restitution(0f)) .position(40, 25) .mass(1f) .type(BodyDef.BodyType.DynamicBody) .build(); RigidBodiesComponents rigidByPlayer = entityBuilder.getComponent(RigidBodiesComponents.class); rigidByPlayer.rigidBodies.add(bodyPlayer); sensor =builders.getBrickBuilder(CollisionSensorBuilder.class) .setTargetName("Ground") .setName("sensorPlayer") .getBrick(); ConditionalController controllerGround =builders.getBrickBuilder(ConditionalControllerBuilder.class) .setOp(ConditionalController.Op.OP_AND) .getBrick(); ActuatorTest actuatorTest = new ActuatorTest(); player = entityBuilder .addController(controllerGround, "Default") .connectToSensor(sensor) .connectToActuator(actuatorTest) .getEntity(); // Create Ground Entity entityBuilder.initialize(); identityGround = entityBuilder.getComponent(IdentityComponent.class); identityGround.tag = "Ground"; identityGround.category = categoryBitsManager.getCategoryBits(identityGround.tag); bodyGround = bodyBuilder .fixture(bodyBuilder.fixtureDefBuilder() .boxShape(5, 1) .restitution(0f)) .position(40, 20) .mass(1f) .type(BodyDef.BodyType.StaticBody) .build(); RigidBodiesComponents rigidByGround = entityBuilder.getComponent(RigidBodiesComponents.class); rigidByGround.rigidBodies.add(bodyGround); Entity ground = entityBuilder.getEntity(); engine.addEntity(ground); } @Test public void bodyCollidesBodyTest() { identityPlayer.collisionMask = (short) identityGround.category; engine.addEntity(player); game.singleStep(1); game.singleStep(1); assertTrue(sensor.contactList.first().isTouching()); assertTrue(sensor.positive); assertEquals(LogicBrick.BrickMode.BM_ON, sensor.pulseState); } @Test public void filterTest() { identityPlayer.collisionMask = (short) ~identityGround.category; engine.addEntity(player); game.singleStep(1); game.singleStep(1); assertEquals(0, sensor.contactList.size); assertFalse(sensor.positive); assertEquals(LogicBrick.BrickMode.BM_OFF, sensor.pulseState); } @Test public void endBodyCollisionTest() { engine.addEntity(player); game.singleStep(1); game.singleStep(1); assertTrue(sensor.contactList.first().isTouching()); assertTrue(sensor.positive); assertEquals(LogicBrick.BrickMode.BM_ON, sensor.pulseState); bodyPlayer.applyForce(0, 60, bodyPlayer.getWorldCenter().x, bodyPlayer.getWorldCenter().y, true); game.singleStep(1); game.singleStep(1); System.out.println("Body position3: " + bodyPlayer.getPosition()); System.out.println("Body position4: " + bodyPlayer.getPosition()); assertEquals(0, sensor.contactList.size); assertFalse(sensor.positive); assertEquals(LogicBrick.BrickMode.BM_ON, sensor.pulseState); } }