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);
        }
Exemplo n.º 2
0
        // 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);
                        }
                    }
                }
            }
        }
Exemplo n.º 3
0
        // 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));
                }
            }
        }