From 29c4bea104c53c62f6f77703c9ff787fd0738061 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 16 Jun 2014 16:57:47 -0430 Subject: [PATCH] Added processing for the remaining bombs. --- .../nxtar/entities/BombGameEntityCreator.java | 8 +- .../ccg/nxtar/systems/AnimationSystem.java | 2 + .../nxtar/systems/BombGameLogicSystem.java | 201 +++++++++++++++--- .../systems/RobotArmPositioningSystem.java | 17 +- 4 files changed, 180 insertions(+), 48 deletions(-) diff --git a/src/ve/ucv/ciens/ccg/nxtar/entities/BombGameEntityCreator.java b/src/ve/ucv/ciens/ccg/nxtar/entities/BombGameEntityCreator.java index 31c5610..2182716 100644 --- a/src/ve/ucv/ciens/ccg/nxtar/entities/BombGameEntityCreator.java +++ b/src/ve/ucv/ciens/ccg/nxtar/entities/BombGameEntityCreator.java @@ -29,6 +29,7 @@ import ve.ucv.ciens.ccg.nxtar.components.RenderModelComponent; import ve.ucv.ciens.ccg.nxtar.components.ShaderComponent; import ve.ucv.ciens.ccg.nxtar.components.VisibilityComponent; import ve.ucv.ciens.ccg.nxtar.graphics.shaders.DirectionalLightPerPixelShader; +import ve.ucv.ciens.ccg.nxtar.systems.AnimationSystem; import ve.ucv.ciens.ccg.nxtar.systems.CollisionDetectionSystem; import com.artemis.Entity; @@ -53,6 +54,9 @@ public class BombGameEntityCreator extends EntityCreatorBase{ private static final boolean DEBUG_RENDER_DOOR_COLLISION_MODELS = false; private static final boolean DEBUG_RENDER_PARAPHERNALIA_COLLISION_MODELS = false; public static final String DOORS_GROUP = "DOORS"; + public static final Vector3 ROBOT_ARM_START_POINT = new Vector3(0.0f, 0.0f, -1.0f); + public static final int DOOR_OPEN_ANIMATION = 1; + public static final int DOOR_CLOSE_ANIMATION = 1; private class EntityParameters{ public Environment environment; @@ -184,7 +188,7 @@ public class BombGameEntityCreator extends EntityCreatorBase{ addBomb(parameters, bomb_type_t.WIRES); // Add doors. - parameters.nextAnimation = -1; + parameters.nextAnimation = AnimationSystem.NO_ANIMATION; parameters.loopAnimation = false; parameters.markerCode = 89; @@ -233,7 +237,7 @@ public class BombGameEntityCreator extends EntityCreatorBase{ private void addRobotArm(EntityParameters parameters){ Entity robotArm = world.createEntity(); - robotArm.addComponent(new GeometryComponent(new Vector3(0.0f, 0.0f, -1.0f), new Matrix3(), new Vector3(1, 1, 1))); + robotArm.addComponent(new GeometryComponent(new Vector3(ROBOT_ARM_START_POINT), new Matrix3(), new Vector3(1, 1, 1))); robotArm.addComponent(new EnvironmentComponent(parameters.environment)); robotArm.addComponent(new ShaderComponent(parameters.shader)); robotArm.addComponent(new RenderModelComponent(robotArmModel)); diff --git a/src/ve/ucv/ciens/ccg/nxtar/systems/AnimationSystem.java b/src/ve/ucv/ciens/ccg/nxtar/systems/AnimationSystem.java index 899a7ff..f314e9b 100644 --- a/src/ve/ucv/ciens/ccg/nxtar/systems/AnimationSystem.java +++ b/src/ve/ucv/ciens/ccg/nxtar/systems/AnimationSystem.java @@ -26,6 +26,8 @@ import com.artemis.systems.EntityProcessingSystem; import com.badlogic.gdx.Gdx; public class AnimationSystem extends EntityProcessingSystem { + public static final int NO_ANIMATION = -1; + @Mapper ComponentMapper animationMapper; @Mapper ComponentMapper visibilityMapper; diff --git a/src/ve/ucv/ciens/ccg/nxtar/systems/BombGameLogicSystem.java b/src/ve/ucv/ciens/ccg/nxtar/systems/BombGameLogicSystem.java index cc0032e..8f2d6e7 100644 --- a/src/ve/ucv/ciens/ccg/nxtar/systems/BombGameLogicSystem.java +++ b/src/ve/ucv/ciens/ccg/nxtar/systems/BombGameLogicSystem.java @@ -42,10 +42,12 @@ public class BombGameLogicSystem extends GameLogicSystemBase { private MarkerCodeComponent tempMarker; private BombGameObjectTypeComponent tempType; + private GroupManager manager; @SuppressWarnings("unchecked") public BombGameLogicSystem(){ super(Aspect.getAspectForAll(BombGameObjectTypeComponent.class)); + manager = world.getManager(GroupManager.class); } @Override @@ -56,75 +58,171 @@ public class BombGameLogicSystem extends GameLogicSystemBase { switch(typeComponent.type){ case BombGameObjectTypeComponent.BOMB_WIRE_1: - break; case BombGameObjectTypeComponent.BOMB_WIRE_2: - break; case BombGameObjectTypeComponent.BOMB_WIRE_3: + processWireBomb(e); break; + case BombGameObjectTypeComponent.BIG_BUTTON: processInclinationBomb(e); break; + case BombGameObjectTypeComponent.COM_BUTTON_1: - break; case BombGameObjectTypeComponent.COM_BUTTON_2: - break; case BombGameObjectTypeComponent.COM_BUTTON_3: - break; case BombGameObjectTypeComponent.COM_BUTTON_4: + processCombinationBomb(e); break; + case BombGameObjectTypeComponent.DOOR: processDoor(e); break; - case BombGameObjectTypeComponent.DOOR_FRAME: - break; + default: - Gdx.app.debug(TAG, CLASS_NAME + ".process(): Unrecognized object type."); break; } } - private void processInclinationBomb(Entity b){ - CollisionDetectionComponent collision = collisionMapper.getSafe(b); - MarkerCodeComponent marker = markerMapper.getSafe(b); - GroupManager manager = world.getManager(GroupManager.class); + /** + *

Checks if the current player interaction disables a wire based bomb.

+ * + * @param b An Artemis {@link Entity} that possibly represents any of a Wire Bomb's wires. + */ + private void processWireBomb(Entity b){ + int relatedWires = 0; + CollisionDetectionComponent collision; + MarkerCodeComponent marker; + BombGameObjectTypeComponent wireType; ImmutableBag related; + // Get this wire's parameters. + collision = collisionMapper.getSafe(b); + marker = markerMapper.getSafe(b); + wireType = typeMapper.getSafe(b); + + // if any of the parameters is missing then skip. + if(marker == null || collision == null || wireType == null){ + Gdx.app.log(TAG, CLASS_NAME + ".processInclinationBomb(): Wire bomb is missing some components."); + return; + } + + // If this bomb is still enabled and it's door is already open then process it. + if(marker.enabled && isDoorOpen(marker.code, manager) && collision.colliding){ + manager.remove(b, CollisionDetectionSystem.COLLIDABLE_OBJECTS_GROUP); + manager.remove(b, Integer.toString(marker.code)); + b.deleteFromWorld(); + related = manager.getEntities(Integer.toString(marker.code)); + + // Check the state of the other wires associated with this bomb. + for(int i = 0; i < related.size(); i++){ + tempType = typeMapper.getSafe(related.get(i)); + + if(tempType == null) continue; + + if(tempType.type >= BombGameObjectTypeComponent.BOMB_WIRE_1 && tempType.type <= BombGameObjectTypeComponent.BOMB_WIRE_3){ + if(tempType.type != wireType.type){ + relatedWires++; + } + } + } + + if(relatedWires == 0) + disableBomb(marker.code); + } + } + + /** + *

Checks if the current player interaction disables a combination bomb.

+ * + * @param b An Artemis {@link Entity} that possibly represents any of a Combination Bomb's buttons. + */ + private void processCombinationBomb(Entity b){ + int relatedButtons = 0; + CollisionDetectionComponent collision; + MarkerCodeComponent marker; + BombGameObjectTypeComponent buttonType; + ImmutableBag related; + + // Get this wire's parameters. + collision = collisionMapper.getSafe(b); + marker = markerMapper.getSafe(b); + buttonType = typeMapper.getSafe(b); + + // if any of the parameters is missing then skip. + if(marker == null || collision == null || buttonType == null){ + Gdx.app.log(TAG, CLASS_NAME + ".processInclinationBomb(): Wire bomb is missing some components."); + return; + } + + // If this bomb is still enabled and it's door is already open then process it. + if(marker.enabled && isDoorOpen(marker.code, manager) && collision.colliding){ + manager.remove(b, CollisionDetectionSystem.COLLIDABLE_OBJECTS_GROUP); + manager.remove(b, Integer.toString(marker.code)); + b.deleteFromWorld(); + related = manager.getEntities(Integer.toString(marker.code)); + + // Check the state of the other wires associated with this bomb. + for(int i = 0; i < related.size(); i++){ + tempType = typeMapper.getSafe(related.get(i)); + + if(tempType == null) continue; + + if(tempType.type >= BombGameObjectTypeComponent.COM_BUTTON_1 && tempType.type <= BombGameObjectTypeComponent.COM_BUTTON_4){ + if(tempType.type != buttonType.type){ + relatedButtons++; + } + } + } + + if(relatedButtons == 0) + disableBomb(marker.code); + } + } + + /** + *

Checks if the current player interaction disables an inclination bomb.

+ * + * @param b An Artemis {@link Entity} that possibly represents an Inclination Bomb's big button. + */ + private void processInclinationBomb(Entity b){ + // Get the components of the big button. + CollisionDetectionComponent collision = collisionMapper.getSafe(b); + MarkerCodeComponent marker = markerMapper.getSafe(b); + + // If any of the components is missing, skip this entity. if(marker == null || collision == null ){ Gdx.app.log(TAG, CLASS_NAME + ".processInclinationBomb(): Inclination bomb is missing some components."); return; } - if(isDoorOpen(marker.code, manager) && marker.enabled && collision.colliding){ + // If this bomb is still enabled and it's door is already open then process it. + if(marker.enabled && isDoorOpen(marker.code, manager) && collision.colliding){ + // Disable the bomb and remove it from collision detection. marker.enabled = false; manager.remove(b, CollisionDetectionSystem.COLLIDABLE_OBJECTS_GROUP); + manager.remove(b, Integer.toString(marker.code)); + b.deleteFromWorld(); // Disable all related entities. - related = manager.getEntities(Integer.toString(marker.code)); - for(int i = 0; i < related.size(); i++){ - tempMarker = markerMapper.getSafe(related.get(i)); - tempType = typeMapper.getSafe(related.get(i)); + disableBomb(marker.code); - // Enable collisions with the door frame. Disable collisions with other related objects. - if(tempMarker != null) tempMarker.enabled = false; - if(tempType != null){ - if(tempType.type != BombGameObjectTypeComponent.DOOR_FRAME){ - manager.remove(related.get(i), CollisionDetectionSystem.COLLIDABLE_OBJECTS_GROUP); - }else{ - manager.add(related.get(i), CollisionDetectionSystem.COLLIDABLE_OBJECTS_GROUP); - } - } - } - - Gdx.app.log(TAG, CLASS_NAME + ".processInclinationBomb(): Disabling inclination bomb."); + Gdx.app.log(TAG, CLASS_NAME + ".processInclinationBomb(): Inclination bomb disabled."); } } + /** + *

Set's the animation for a door depending on it's collision and marker state.

+ * + * @param d An Artemis {@link Entity} possibly representing a door. + */ private void processDoor(Entity d){ + // Get the components of the door. CollisionDetectionComponent collision = collisionMapper.getSafe(d); AnimationComponent animation = animationMapper.getSafe(d); VisibilityComponent visibility = visibilityMapper.getSafe(d); MarkerCodeComponent marker = markerMapper.getSafe(d); + // If any of the components is missing, skip this entity. if(marker == null || collision == null || animation == null || visibility == null){ Gdx.app.log(TAG, CLASS_NAME + ".processDoor(): Door is missing some components."); return; @@ -133,15 +231,18 @@ public class BombGameLogicSystem extends GameLogicSystemBase { if(visibility.visible){ if(marker.enabled){ if(collision.colliding){ - animation.next = 1; + // If the door is visible and enabled and the player is colliding with it then set + // it's opening animation; + animation.next = BombGameEntityCreator.DOOR_OPEN_ANIMATION; animation.loop = false; collision.colliding = false; world.getManager(GroupManager.class).remove(d, CollisionDetectionSystem.COLLIDABLE_OBJECTS_GROUP); Gdx.app.log(TAG, CLASS_NAME + ".processDoor(): Opening door."); } }else{ + // If the door is disabled and open, then set it's closing animation. if(animation.current != 0){ - animation.next = 0; + animation.next = BombGameEntityCreator.DOOR_CLOSE_ANIMATION; animation.loop = false; Gdx.app.log(TAG, CLASS_NAME + ".processDoor(): Closing door."); } @@ -149,18 +250,27 @@ public class BombGameLogicSystem extends GameLogicSystemBase { } } + /** + *

Checks if a door is either open or closed depending on the completeness of it's animation.

+ * + * @param markerCode The code of the door to check. Must be between 0 and 1023. + * @param manager An Artemis {@link GroupManager} to use to get all related entities. + * @return true if the opening animation of the door has finished playing. + */ private boolean isDoorOpen(int markerCode, GroupManager manager){ AnimationComponent animation; boolean doorOpen = false; ImmutableBag doors = manager.getEntities(BombGameEntityCreator.DOORS_GROUP); + // For every door. for(int i = 0; i < doors.size(); i++){ tempMarker = markerMapper.getSafe(doors.get(i)); animation = animationMapper.getSafe(doors.get(i)); if(animation == null || tempMarker == null) return false; - if(tempMarker.code == markerCode && animation.current == 1 && animation.controller.current.loopCount == 0){ + // If this is the door we are looking for and it's opening animation is finished then this door is open. + if(tempMarker.code == markerCode && animation.current == BombGameEntityCreator.DOOR_OPEN_ANIMATION && animation.controller.current.loopCount == 0){ doorOpen = true; break; } @@ -168,4 +278,31 @@ public class BombGameLogicSystem extends GameLogicSystemBase { return doorOpen; } + + /** + *

Disables all entities associated with the corresponding marker code.

+ * + * @param markerCode + */ + private void disableBomb(int markerCode){ + ImmutableBag related = manager.getEntities(Integer.toString(markerCode)); + + // Disable every entity sharing this marker code except for the corresponding door frame. + for(int i = 0; i < related.size(); i++){ + tempMarker = markerMapper.getSafe(related.get(i)); + tempType = typeMapper.getSafe(related.get(i)); + + // Enable collisions with the corresponding door frame entity. Disable collisions with other related entities. + if(tempMarker != null) tempMarker.enabled = false; + if(tempType != null){ + if(tempType.type != BombGameObjectTypeComponent.DOOR_FRAME){ + manager.remove(related.get(i), CollisionDetectionSystem.COLLIDABLE_OBJECTS_GROUP); + manager.remove(related.get(i), Integer.toString(markerCode)); + related.get(i).deleteFromWorld(); + }else{ + manager.add(related.get(i), CollisionDetectionSystem.COLLIDABLE_OBJECTS_GROUP); + } + } + } + } } diff --git a/src/ve/ucv/ciens/ccg/nxtar/systems/RobotArmPositioningSystem.java b/src/ve/ucv/ciens/ccg/nxtar/systems/RobotArmPositioningSystem.java index f5c2256..8a5e612 100644 --- a/src/ve/ucv/ciens/ccg/nxtar/systems/RobotArmPositioningSystem.java +++ b/src/ve/ucv/ciens/ccg/nxtar/systems/RobotArmPositioningSystem.java @@ -19,6 +19,7 @@ import ve.ucv.ciens.ccg.nxtar.components.AutomaticMovementComponent; import ve.ucv.ciens.ccg.nxtar.components.CollisionDetectionComponent; import ve.ucv.ciens.ccg.nxtar.components.GeometryComponent; import ve.ucv.ciens.ccg.nxtar.components.MarkerCodeComponent; +import ve.ucv.ciens.ccg.nxtar.entities.BombGameEntityCreator; import ve.ucv.ciens.ccg.nxtar.input.GamepadUserInput; import ve.ucv.ciens.ccg.nxtar.input.KeyboardUserInput; import ve.ucv.ciens.ccg.nxtar.input.TouchUserInput; @@ -38,7 +39,6 @@ public class RobotArmPositioningSystem extends EntityProcessingSystem { private static final String CLASS_NAME = RobotArmPositioningSystem.class.getSimpleName(); private static final float INTERPOLATION_STEP = 0.05f; private static final float STEP_SIZE = 0.05f; - private static final Vector3 END_POINT = new Vector3(0.0f, 0.0f, -0.5f); private static final float MAX_Z = -4.5f; @Mapper ComponentMapper geometryMapper; @@ -89,12 +89,11 @@ public class RobotArmPositioningSystem extends EntityProcessingSystem { geometry.position.x += tempGP.axisLeftY * STEP_SIZE; geometry.position.y += tempGP.axisLeftX * STEP_SIZE; geometry.position.z += tempGP.axisRightY * STEP_SIZE; - //clampPosition(geometry); }else{ auto.moving = true; auto.forward = false; auto.startPoint.set(geometry.position); - auto.endPoint.set(END_POINT); + auto.endPoint.set(BombGameEntityCreator.ROBOT_ARM_START_POINT); } }else if(input instanceof KeyboardUserInput){ @@ -107,12 +106,11 @@ public class RobotArmPositioningSystem extends EntityProcessingSystem { geometry.position.y += tempKey.keyRight ? STEP_SIZE : 0.0f; geometry.position.z -= tempKey.keyZ ? STEP_SIZE : 0.0f; geometry.position.z += tempKey.keyA ? STEP_SIZE : 0.0f; - //clampPosition(geometry); }else{ auto.moving = true; auto.forward = false; auto.startPoint.set(geometry.position); - auto.endPoint.set(END_POINT); + auto.endPoint.set(BombGameEntityCreator.ROBOT_ARM_START_POINT); } }else @@ -154,13 +152,4 @@ public class RobotArmPositioningSystem extends EntityProcessingSystem { }else return; } - -// private void clampPosition(GeometryComponent geometry){ -// geometry.position.x = geometry.position.x >= -1.0f ? geometry.position.x : -1.0f; -// geometry.position.x = geometry.position.x <= 1.0f ? geometry.position.x : 1.0f; -// geometry.position.y = geometry.position.y >= -1.0f ? geometry.position.y : -1.0f; -// geometry.position.y = geometry.position.y <= 1.0f ? geometry.position.y : 1.0f; -// geometry.position.z = geometry.position.z >= 0.0f ? geometry.position.z : 0.0f; -// geometry.position.z = geometry.position.z <= 6.0f ? geometry.position.z : 6.0f; -// } }