public void attemptRopeGrab(string levelUid, int characterId, CharacterMovementComponent characterMovementComponent, PhysicsComponent physicsComponent, RopeGrabComponent existingRopeGrabComponent) { float margin = 0.5f; AABB region = new AABB(); RopeNode ropeNode = null; int nodeCount = 0; region.LowerBound = physicsComponent.body.Position - new Vector2(margin, margin); region.UpperBound = physicsComponent.body.Position + new Vector2(margin, margin); if (physicsComponent == null) return; // Query the world for a body, and check to see if it's a rope physicsComponent.body.World.QueryAABB((fixture) => { int ropeEntityId = (int)fixture.Body.UserData; RopeComponent ropeComponent = (RopeComponent)_entityManager.getComponent(levelUid, ropeEntityId, ComponentType.Rope); RopeGrabComponent ropeGrabComponent = null; if (ropeComponent != null && !ropeComponent.doubleAnchor) { RopeNode current = ropeComponent.ropeNodeHead; characterMovementComponent.allowRopeGrab = false; while (current != null) { if (current.body == fixture.Body) { ropeNode = current; break; } nodeCount++; current = current.next; } if (existingRopeGrabComponent != null) { RopeComponent existingRopeComponent = (RopeComponent)_entityManager.getComponent(levelUid, existingRopeGrabComponent.ropeEntityId, ComponentType.Rope); if (existingRopeComponent.destroyAfterRelease) existingRopeComponent.timeToLive = 100; _ropeSystem.releaseRope(existingRopeGrabComponent, physicsComponent.body); _entityManager.removeComponent(levelUid, characterId, existingRopeGrabComponent); } ropeGrabComponent = new RopeGrabComponent(ropeEntityId, ropeNode, (float)nodeCount, ropeComponent.reverseClimbDirection); _ropeSystem.grabRope(ropeGrabComponent, physicsComponent.body); _entityManager.addComponent(levelUid, characterId, ropeGrabComponent); return false; } return true; }, ref region); }
// Handle dialogue private void handleDialogue(string levelUid, PhysicsComponent playerPhysicsComponent, bool inDialogue) { DialogueSystem dialogueSystem = _systemManager.getSystem(SystemType.Dialogue) as DialogueSystem; List<int> dialogueEntities = _entityManager.getEntitiesPosessing(levelUid, ComponentType.CharacterDialogue); for (int i = 0; i < dialogueEntities.Count; i++) { PhysicsComponent otherPhysicsComponent = _entityManager.getComponent(levelUid, dialogueEntities[i], ComponentType.Physics) as PhysicsComponent; Vector2 relative = playerPhysicsComponent.body.Position - otherPhysicsComponent.body.Position; float distanceSq = relative.LengthSquared(); if (_newKeyState.IsKeyDown(Keys.E) && _oldKeyState.IsKeyUp(Keys.E)) { if (!inDialogue && distanceSq <= 1f) { CharacterDialogueComponent dialogueComponent = _entityManager.getComponent(levelUid, dialogueEntities[i], ComponentType.CharacterDialogue) as CharacterDialogueComponent; dialogueSystem.beginDialogue(levelUid, PlayerSystem.PLAYER_ID, dialogueEntities[i], dialogueComponent); } } else { TooltipComponent tooltipComponent = _entityManager.getComponent(levelUid, dialogueEntities[i], ComponentType.Tooltip) as TooltipComponent; if (tooltipComponent == null) { if (!inDialogue && distanceSq <= 1f) { _entityManager.addComponent(levelUid, dialogueEntities[i], new TooltipComponent("[Use] Talk", otherPhysicsComponent.body, 1f)); } } else { if (inDialogue || distanceSq > 1f) { _entityManager.removeComponent(levelUid, dialogueEntities[i], ComponentType.Tooltip); } } } } }
// Handle player character movement private void handleCharacterMovement(string levelUid, PhysicsComponent playerPhysicsComponent, bool inDialogue) { if (playerPhysicsComponent != null) { CharacterMovementComponent characterMovementComponent = _entityManager.getComponent(levelUid, PLAYER_ID, ComponentType.CharacterMovement) as CharacterMovementComponent; RopeGrabComponent ropeGrabComponent = _entityManager.getComponent(levelUid, PLAYER_ID, ComponentType.RopeGrab) as RopeGrabComponent; if (InputSystem.usingGamepad) { if (InputSystem.newGamepadState.ThumbSticks.Left.X < 0) { //characterMovementComponent.walkSpeedModifier = Math.Abs(InputSystem.newGamepadState.ThumbSticks.Left.X); characterMovementComponent.walkLeft = true; } else if (InputSystem.newGamepadState.DPad.Left == ButtonState.Pressed) characterMovementComponent.walkLeft = true; else characterMovementComponent.walkLeft = false; if (InputSystem.newGamepadState.ThumbSticks.Left.X > 0) { //characterMovementComponent.walkSpeedModifier = InputSystem.newGamepadState.ThumbSticks.Left.X; characterMovementComponent.walkRight = true; } else if (InputSystem.newGamepadState.DPad.Right == ButtonState.Pressed) characterMovementComponent.walkRight = true; else characterMovementComponent.walkRight = false; characterMovementComponent.climbAmount = 0f; characterMovementComponent.climbDown = false; characterMovementComponent.climbUp = false; if (InputSystem.newGamepadState.ThumbSticks.Left.Y > 0) { characterMovementComponent.climbUp = true; characterMovementComponent.climbAmount = Math.Abs(InputSystem.newGamepadState.ThumbSticks.Left.Y); } else if (InputSystem.newGamepadState.ThumbSticks.Left.Y < 0) { characterMovementComponent.climbDown = true; characterMovementComponent.climbAmount = Math.Abs(InputSystem.newGamepadState.ThumbSticks.Left.Y); } characterMovementComponent.attemptJump = InputSystem.newGamepadState.Buttons.A == ButtonState.Pressed; } else { //characterMovementComponent.walkSpeedModifier = 1f; characterMovementComponent.walkLeft = InputSystem.newKeyState.IsKeyDown(Keys.A) || InputSystem.newKeyState.IsKeyDown(Keys.Left); characterMovementComponent.walkRight = InputSystem.newKeyState.IsKeyDown(Keys.D) || InputSystem.newKeyState.IsKeyDown(Keys.Right); characterMovementComponent.attemptJump = InputSystem.newKeyState.IsKeyDown(Keys.Space) && InputSystem.oldKeyState.IsKeyUp(Keys.Space); characterMovementComponent.swimUp = InputSystem.newKeyState.IsKeyDown(Keys.Space); characterMovementComponent.climbUp = InputSystem.newKeyState.IsKeyDown(Keys.W); characterMovementComponent.climbDown = InputSystem.newKeyState.IsKeyDown(Keys.S); characterMovementComponent.climbAmount = 1f; characterMovementComponent.doRopeGrab = InputSystem.newKeyState.IsKeyDown(Keys.E) && InputSystem.oldKeyState.IsKeyUp(Keys.E); characterMovementComponent.allowRopeGrab = characterMovementComponent.allowRopeGrab ? true : (InputSystem.newKeyState.IsKeyUp(Keys.E) && InputSystem.oldKeyState.IsKeyDown(Keys.E)); } } }