Ejemplo n.º 1
0
    public static LedgeInfo DetectLedgeOnWall(Direction.Horizontal _direction, Direction.Vertical _verticalDirection, BoxCollider2D _collider, float velocityToCheck, float offset = 0.25f)
    {
        RaycastHit2D raycastHits        = new RaycastHit2D();
        int          collisionLayerMask = 1 << LayerMask.NameToLayer("Terrain");

        float   rayLength    = _collider.size.y + Mathf.Abs(velocityToCheck) + offset;
        Vector2 rayDirection = (_verticalDirection == Direction.Vertical.Up) ? Vector2.up : Vector2.down;
        bool    isConnected  = false;

        Vector2 rayOrigin = new Vector2(_collider.transform.position.x + (_collider.size.x * 0.5f) * (int)_direction, _collider.transform.position.y - (_collider.size.y * 0.5f * (int)_verticalDirection));

        rayOrigin.y = (rayDirection == Vector2.up) ? _collider.bounds.min.y - offset : _collider.bounds.max.y + offset;

        float raycastSpacing = _collider.size.x * 0.5f;

        rayOrigin.x = (_direction == Direction.Horizontal.Left) ? rayOrigin.x - raycastSpacing : rayOrigin.x + raycastSpacing;

        raycastHits = Physics2D.Raycast(rayOrigin, rayDirection, rayLength, collisionLayerMask);
        if (raycastHits.fraction > 0)
        {
            isConnected = true;
        }

                #if UNITY_EDITOR
        //Debug.DrawRay(rayOrigin, new Vector2(0.25f * (int)_direction, (int)rayDirection.y * rayLength), Color.red);
                #endif

        float     hitY      = (isConnected) ? raycastHits.point.y : 0.0f;
        LedgeInfo ledgeInfo = new LedgeInfo();
        ledgeInfo.didHit = isConnected;
        ledgeInfo.hitY   = hitY;

        return(ledgeInfo);
    }
Ejemplo n.º 2
0
		public override void OnBegin()
		{
			currentJumpFrame = 0;
			isJumpActive = true;
			hasReleasedButtonSinceJump = false;
			controller.slots.physicsObject.properties.isFalling = false;
			isGroundedWithJumpButtonUp = false;

			if(controller.slots.actor.currentAttack != null && controller.slots.actor.currentAttack.canceledBy.onJump)
			{
				controller.slots.actor.currentAttack.Cancel();
			}

			if(freezeHorizontalMovement)
			{
				direction = (Direction.Horizontal)controller.slots.input.horizontalAxis;
			}

			/*float velocity = speed;
			controller.slots.physicsObject.AddVelocityForSingleFrame(new Vector2(0.0f, velocity * controller.GravityScaleMultiplier()));*/

			StartCoroutine("JumpCoroutine");

			controller.slots.actor.NotifyOfControllerJumping(currentJump);
		}
Ejemplo n.º 3
0
    public static bool IsNextToLedge(Direction.Horizontal _direction, Direction.Vertical _verticalDirection, BoxCollider2D _collider, float gravityScaleMultiplier = 1.0f)
    {
        RaycastHit2D raycastHits        = new RaycastHit2D();
        int          collisionLayerMask = 1 << LayerMask.NameToLayer("Terrain") | 1 << LayerMask.NameToLayer("PassThroughBottom");

        float   rayLength    = _collider.size.y * 0.5f + 0.1f;
        Vector2 rayDirection = (_verticalDirection == Direction.Vertical.Up) ? Vector2.up : Vector2.down;
        bool    isConnected  = false;

        Vector2 rayOrigin = new Vector2(_collider.transform.position.x, _collider.transform.position.y + (_collider.offset.y * gravityScaleMultiplier));

        float raycastSpacing = _collider.size.x * 0.5f;

        rayOrigin.x = (_direction == Direction.Horizontal.Left) ? rayOrigin.x - raycastSpacing : rayOrigin.x + raycastSpacing;

        raycastHits = Physics2D.Raycast(rayOrigin, rayDirection, rayLength, collisionLayerMask);
        if (raycastHits.fraction > 0)
        {
            isConnected = true;
        }

                #if UNITY_EDITOR
        //Debug.DrawRay(rayOrigin, new Vector2(0.0f, (int)_verticalDirection) * rayLength, Color.red);
                #endif

        return(!isConnected);
    }
Ejemplo n.º 4
0
        protected void MoveHorizontal()
        {
            bool willTurn = false;

            if ((physicsObject.DidHitEitherWallThisFrame() && willTurnOnWallContact))
            {
                willTurn = true;
            }
            else if (willTurnOnDistance && ((transform.position.x >= maxMovePositionVector.x && directionX == Direction.Horizontal.Right) || (transform.position.x <= minMovePositionVector.x && directionX == Direction.Horizontal.Left)))
            {
                willTurn = true;
                float snappingPosition;
                if (transform.position.x >= maxMovePositionVector.x && directionX == Direction.Horizontal.Right)
                {
                    snappingPosition = maxMovePositionVector.x;
                }
                else
                {
                    snappingPosition = minMovePositionVector.x;
                }

                physicsObject.previousFrameProperties.position = new Vector3(snappingPosition, transform.position.y, transform.position.z);
                physicsObject.properties.position = new Vector3(snappingPosition, transform.position.y, transform.position.z);
            }

            if (willTurn)
            {
                directionX = (directionX == Direction.Horizontal.Left) ? Direction.Horizontal.Right : Direction.Horizontal.Left;
            }

            physicsObject.SetVelocityX(moveSpeed.x * (int)directionX);
        }
Ejemplo n.º 5
0
        //If a projectile is slotted, this spawns it
        public void CreateProjectile()
        {
            Direction.Horizontal direction = (slots.actor.slots.controller) ? slots.actor.slots.controller.direction.horizontal : Direction.Horizontal.Right;
            if (attackDirection == AttackDirection.Behind)
            {
                direction = (Direction.Horizontal)((int)direction * -1.0f);
            }

            Projectile newProjectile = projectile.rexPool.Spawn().GetComponent <Projectile>();

            Direction.Horizontal startingHorizontalDirection = direction;
            Direction.Vertical   startingVerticalDirection   = Direction.Vertical.Up;

            if (projectile.isAimable)
            {
                if (Mathf.Abs(slots.actor.slots.input.verticalAxis) == 1.0f && slots.actor.slots.input.horizontalAxis == 0.0f)
                {
                    startingHorizontalDirection = Direction.Horizontal.Neutral;
                }

                startingVerticalDirection = (Direction.Vertical)(slots.actor.slots.input.verticalAxis * PhysicsManager.Instance.gravityScale);
            }

            newProjectile.isAimable = projectile.isAimable;
            newProjectile.Fire(new Vector2(slots.actor.transform.position.x + transform.localPosition.x * (int)direction, transform.position.y), startingHorizontalDirection, startingVerticalDirection, slots.actor, projectile.rexPool);
        }
Ejemplo n.º 6
0
		public void NotifyOfWallJump(int framesToFreeze, Direction.Horizontal kickbackDirection)
		{
			direction = kickbackDirection;
			framesFrozenForWallJump = framesToFreeze;
			ForceBegin();
			currentJump = 0;
			isWallJumpKickbackActive = true;
		}
Ejemplo n.º 7
0
 void Start()
 {
     directionX = startingDirectionX;
     directionY = startingDirectionY;
     if (!willStartWhenPlayerIsOnTop && isMovementEnabled)
     {
         StartMoving();
     }
 }
Ejemplo n.º 8
0
        public void Knockback(Direction.Horizontal _direction)         //Called directly to apply knockback if a KnockbackState component is attached
        {
            KnockbackState knockback = GetComponent <KnockbackState>();

            if (knockback)
            {
                knockback.knockbackDirection = _direction;
                knockback.Begin();
            }
        }
Ejemplo n.º 9
0
        //Immediately snaps this object to the nearest wall
        public void SnapToNearestWall(Direction.Horizontal _direction)
        {
            properties.isAgainstLeftWall  = false;
            properties.isAgainstRightWall = false;

            float   buffer     = 0.25f;
            Vector2 startPoint = new Vector2(box.center.x, box.yMin - buffer);
            Vector2 endPoint   = new Vector2(box.center.x, box.yMax + buffer);

            RaycastHit2D[] raycastHits        = new RaycastHit2D[raycastAmounts.horizontal];
            int            numberOfCollisions = 0;
            float          fraction           = 0;

            float rayVelocity = (_direction == Direction.Horizontal.Left) ? -1.0f : 1.0f;

            float   sideRayLength = box.width / 2 + Mathf.Abs(rayVelocity * PhysicsManager.Instance.fixedDeltaTime);
            Vector2 direction     = rayVelocity > 0 ? Vector3.right : -Vector3.right;
            bool    didCollide    = false;

            for (int i = 0; i < raycastAmounts.horizontal; i++)
            {
                float   raycastSpacing = (float)i / (float)(raycastAmounts.horizontal - 1);
                Vector2 rayOrigin      = Vector2.Lerp(startPoint, endPoint, raycastSpacing);

                raycastHits[i] = Physics2D.Raycast(rayOrigin, direction, sideRayLength, collisionLayerMask);
                if (raycastHits[i].fraction > 0)
                {
                    didCollide = true;

                    if (fraction > 0)
                    {
                        float slopeAngle = Vector2.Angle(raycastHits[i].point - raycastHits[i - 1].point, Vector2.right);
                        if (Mathf.Abs(slopeAngle - 90) < slopeAngleBuffer)
                        {
                            if (direction == Vector2.right)
                            {
                                properties.isAgainstRightWall = true;
                            }
                            else
                            {
                                properties.isAgainstLeftWall = true;
                            }

                            properties.position += (direction * (raycastHits[i].fraction * sideRayLength - box.width / 2.0f));

                            properties.velocity = new Vector2(0.0f, properties.velocity.y);
                            break;
                        }
                    }

                    numberOfCollisions++;
                    fraction = raycastHits[i].fraction;
                }
            }
        }
Ejemplo n.º 10
0
 public void FaceDirection(Direction.Horizontal _direction)         //Called when the Controller is moved left or right, and thus might change direction; calls Turn() if we did change
 {
     //We changed directions
     if (_direction != direction.horizontal)
     {
         if (CanChangeDirection())
         {
             Turn();
         }
     }
 }
Ejemplo n.º 11
0
 protected void SetHorizontalDirection(Direction.Horizontal _direction)
 {
     direction.horizontal = _direction;
     if (direction.horizontal == Direction.Horizontal.Left)
     {
         transform.localScale = new Vector3(-1.0f, 1.0f, 1.0f);
     }
     else if (direction.horizontal == Direction.Horizontal.Right)
     {
         transform.localScale = new Vector3(1.0f, 1.0f, 1.0f);
     }
 }
Ejemplo n.º 12
0
        //Checks in a direction to see if we hit a wall
        private bool CheckForWallContact(Direction.Horizontal _direction, bool willDetectWithMargin = false)
        {
            Vector2 startPoint = new Vector2(box.center.x, box.yMin);
            Vector2 endPoint   = new Vector2(box.center.x, box.yMax);

            RaycastHit2D[] raycastHits        = new RaycastHit2D[raycastAmounts.horizontal];
            int            numberOfCollisions = 0;
            float          fraction           = 0;

            float   margin        = (willDetectWithMargin) ? 0.25f : 0.001f;
            float   sideRayLength = box.width / 2 + margin;
            Vector2 direction     = new Vector2((int)_direction, 0.0f);
            bool    didCollide    = false;

            for (int i = 0; i < raycastAmounts.horizontal; i++)
            {
                float   raycastSpacing = (float)i / (float)(raycastAmounts.horizontal - 1);
                Vector2 rayOrigin      = Vector2.Lerp(startPoint, endPoint, raycastSpacing);

                raycastHits[i] = Physics2D.Raycast(rayOrigin, direction, sideRayLength, collisionLayerMask);
                if (raycastHits[i].fraction > 0)
                {
                    didCollide = true;
                    if (fraction > 0)
                    {
                        float slopeAngle = Vector2.Angle(raycastHits[i].point - raycastHits[i - 1].point, Vector2.right);
                        if (Mathf.Abs(slopeAngle - 90) < slopeAngleBuffer)                        //If the slope is too steep, treat it as a wall
                        {
                            if (direction == Vector2.right)
                            {
                                properties.isAgainstRightWall = true;
                            }
                            else
                            {
                                properties.isAgainstLeftWall = true;
                            }

                            return(true);
                        }
                    }

                    numberOfCollisions++;
                    fraction = raycastHits[i].fraction;
                }
            }

            return(false);
        }
Ejemplo n.º 13
0
        public virtual void Turn()         //The visual component of a Turn; scales the X axis to positive or negative, and plays our slotted Turn AnimationClip
        {
            Direction.Horizontal _direction = (direction.horizontal == Direction.Horizontal.Left) ? Direction.Horizontal.Right : Direction.Horizontal.Left;
            float scaleMultiplier           = (_direction == Direction.Horizontal.Left) ? -1.0f : 1.0f;

            slots.actor.transform.localScale = new Vector3(scaleMultiplier, slots.actor.transform.localScale.y, slots.actor.transform.localScale.z);
            direction.horizontal             = _direction;

            if (slots.actor.currentAttack != null && slots.actor.currentAttack.canceledBy.onTurn)
            {
                slots.actor.currentAttack.Cancel();
            }

            StopCoroutine("TurnCoroutine");
            StartCoroutine("TurnCoroutine");
        }
Ejemplo n.º 14
0
        public void Fire(Vector2 _startingPosition, Direction.Horizontal _horizontal, Direction.Vertical _vertical, RexActor _spawningActor, RexPool _parentSpawnPool = null)
        {
            if (!willDestroyWhenSceneChanges)
            {
                DontDestroyOnLoad(gameObject);
            }

            isFiring         = true;
            isBeingReflected = false;
            movementSpeed    = originalMovementSpeed;
            spawningActor    = _spawningActor;

            if (sounds.fireSound)
            {
                GetComponent <AudioSource>().PlayOneShot(sounds.fireSound);
            }

            if (_parentSpawnPool != null)
            {
                parentSpawnPool = _parentSpawnPool;
            }

            SetPosition(_startingPosition);
            SetHorizontalDirection(_horizontal);
            SetVerticalDirection((Direction.Vertical)((int)startingVerticalDirection * (int)_vertical * PhysicsManager.Instance.gravityScale));

            firingDirection = _horizontal;

            slots.physicsObject.properties.acceleration = Vector2.zero;

            float startingXSpeed = (acceleration == 0.0f) ? movementSpeed.x * (int)direction.horizontal : 0.0f;

            slots.physicsObject.SetVelocityX(startingXSpeed);
            slots.physicsObject.SetAccelerationCapX(movementSpeed.x * (int)direction.horizontal);

            float startingYSpeed = (acceleration == 0.0f) ? movementSpeed.y * (int)direction.vertical : 0.0f;

            slots.physicsObject.SetVelocityY(startingYSpeed);
            slots.physicsObject.SetAccelerationCapY(movementSpeed.y * (int)direction.vertical);
        }
Ejemplo n.º 15
0
        public void MoveTo(Vector2 position, bool setFacingDirection = true, bool ignorePhysics = false)
        {
            if (Math.Abs(X - position.X) > 0.01 && setFacingDirection)
            {
                var horizontalDifference = position.X - X;

                if (Math.Abs(horizontalDifference) > .1)
                {
                    FacingDirection = horizontalDifference < 0 ? Direction.Horizontal.Left : Direction.Horizontal.Right;
                }
            }

            Position = position;
            if (physicsComponent == null || ignorePhysics)
            {
                Position = position;
            }
            else
            {
                physicsComponent.MoveTo(position);
            }
        }
Ejemplo n.º 16
0
        protected void ContinueDash(float _inputDirection)
        {
            if ((controller.slots.input && controller.slots.input.isDashButtonDown) || controller.isDashing)
            {
                if (controller.isDashing)                //Continue dash
                {
                    //Debug.Log("Dash continue");
                    currentFrame++;
                    bool willCancelDash = false;

                    Direction.Horizontal actorDirection = (_inputDirection > 0.0f) ? Direction.Horizontal.Right : Direction.Horizontal.Left;
                    bool didChangeDirection             = (actorDirection != controller.direction.horizontal && _inputDirection != 0.0f) ? true : false;
                    if (currentFrame >= minFrames && ((controller.slots.input && !controller.slots.input.isDashButtonDown) || !controller.slots.input))
                    {
                        willCancelDash = true;
                    }

                    if (controller.slots.actor.currentAttack != null && controller.slots.actor.currentAttack.cancels.dash)
                    {
                        willCancelDash = true;
                    }

                    if (currentFrame >= maxFrames)
                    {
                        willCancelDash = true;
                    }

                    if (canChangeDirection && _inputDirection != 0.0f)
                    {
                        if (didChangeDirection)
                        {
                            controller.FaceDirection(actorDirection);
                            if (isCanceledByDirectionChange)
                            {
                                willCancelDash = true;
                            }
                        }
                    }

                    if (isMomentumRetainedOnJump && !controller.slots.physicsObject.IsOnSurface())
                    {
                        if (requireDirectionalHoldToRetainMomentumOnJump && _inputDirection == 0.0f)
                        {
                            willCancelDash = true;
                        }
                        else if (didChangeDirection && isCanceledByDirectionChange)
                        {
                            willCancelDash = true;
                        }
                        else if (!didCurrentDashStartInAir)
                        {
                            willCancelDash = false;
                        }
                    }

                    if (willStopDashUponLanding && controller.slots.physicsObject.DidLandThisFrame())
                    {
                        willCancelDash = true;
                    }

                    if (controller.slots.actor.currentAttack != null && controller.slots.actor.currentAttack.cancels.dash)
                    {
                        willCancelDash = true;
                    }

                    if (isCanceledByWallContact && controller.slots.physicsObject.IsAgainstEitherWall())
                    {
                        willCancelDash = true;
                    }

                    if (willCancelDash)                    //Dash is canceled
                    {
                        if (!hasEnded && controller.StateID() == id)
                        {
                            controller.SetStateToDefault();
                        }

                        End();

                        controller.isDashing = false;
                        controller.slots.physicsObject.SetVelocityX(0);
                    }
                    else                     //Dash continues
                    {
                        controller.slots.physicsObject.SetVelocityX(speed * (int)controller.direction.horizontal);
                        controller.slots.physicsObject.SetAccelerationCapX(speed * (int)controller.direction.horizontal);

                        if (freezeVerticalMovementOnAirDash)
                        {
                            if (controller.isDashing && didCurrentDashStartInAir && !controller.slots.physicsObject.IsOnSurface() && controller.StateID() == idString)
                            {
                                controller.slots.physicsObject.FreezeYMovementForSingleFrame();
                            }
                        }
                    }
                }
            }
            else
            {
                hasReleasedButtonSinceDash = true;
            }

            if (currentAirDash != 0 && controller.slots.physicsObject.IsOnSurface())
            {
                currentAirDash = 0;
            }
        }
Ejemplo n.º 17
0
 public void Run(Direction.Horizontal direction)
 {
     animatedSprite.Change("Running");
     Transform.MoveAndSlide(new Vector2(
                                direction == Direction.Horizontal.Left ? -speed : speed, 0));
 }
Ejemplo n.º 18
0
        //If an HP Energy component is attached, this lowers its value by the amount damaged. Also does processing to ensure the player CAN be damaged first (i.e. that it isn't currently invincible) and determines if knockback should be applied.
        public int Damage(int amount, bool willCauseKnockback = true, BattleEnums.DamageType damageType = BattleEnums.DamageType.Regular, Collider2D col = null)
        {
            int damageTaken = 0;

            if (!WillProcessDamageFromObject(col) || DetermineIfInvincible() || isDead)
            {
                return(0);
            }

            if (hp != null)
            {
                hp.Decrement(amount);
                damageTaken = hp.previous - hp.current;
            }

            if (damagedProperties.willShowDamagedNumber)
            {
                float yPosition = (slots.collider != null) ? slots.collider.bounds.max.y : transform.position.y;
                DamageNumberManager.Instance.ShowNumber(amount, new Vector2(transform.position.x, yPosition));
            }

            Direction.Horizontal knockbackDirection = Direction.Horizontal.Right;

            if (damageType != BattleEnums.DamageType.Poison)
            {
                if (damagedProperties.willFlash)
                {
                    Flash();
                }
            }

            if (hp == null)
            {
                return(0);
            }

            if (hp.current <= 0)
            {
                SetDeathParameters();
            }
            else
            {
                if (damageType != BattleEnums.DamageType.Poison)
                {
                    if (damagedProperties.willShakeScreen)
                    {
                        ScreenShake.Instance.Shake();
                    }

                    if (willCauseKnockback)
                    {
                        if (col != null)
                        {
                            knockbackDirection = (col.transform.position.x < transform.position.x) ? Direction.Horizontal.Right : Direction.Horizontal.Left;
                        }
                        else
                        {
                            knockbackDirection = (slots.controller && slots.controller.direction.horizontal == Direction.Horizontal.Left) ? Direction.Horizontal.Right : Direction.Horizontal.Left;
                        }

                        if (currentAttack != null)
                        {
                            if (currentAttack.canceledBy.onKnockback)
                            {
                                currentAttack.Cancel();
                            }
                            else
                            {
                                willCauseKnockback = false;
                            }
                        }
                    }

                    bool didChangeController = false;
                    if (damagedProperties.damagedControllers.damagedController && hp.current <= damagedProperties.damagedControllers.hpThreshold)
                    {
                        SetController(damagedProperties.damagedControllers.damagedController);
                        didChangeController = true;
                    }

                    StartDamageInvincibility();

                    if (!(currentAttack != null && !currentAttack.canceledBy.onKnockback) && willCauseKnockback)
                    {
                        if (slots.controller && !didChangeController)
                        {
                            slots.controller.Knockback(knockbackDirection);
                        }
                    }
                }
            }

            if (col != null && damageType != BattleEnums.DamageType.Poison)
            {
                HitSparkManager.Instance.CreateHitSpark(GetComponent <BoxCollider2D>(), col.GetComponent <BoxCollider2D>(), (damageTaken > 0), hp.current);
                OnHit(damageTaken, col);
                if (col.GetComponent <RexActor>() != null)
                {
                    //col.GetComponent<RexActor>().StartContactDelay();
                }

                if (GetComponent <Jitter>())
                {
                    GetComponent <Jitter>().Play();
                }
            }

            return(damageTaken);
        }
Ejemplo n.º 19
0
		protected void CheckForWallCling()
		{
			if(controller.StateID() == KnockbackState.idString || controller.isStunned)
			{
				isClingingToWall = false;
				return;
			}

			if(controller.slots.physicsObject.properties.isAgainstRightWall)
			{
				mostRecentWallJumpDirection = Direction.Horizontal.Left;
			}
			else if(controller.slots.physicsObject.properties.isAgainstLeftWall)
			{
				mostRecentWallJumpDirection = Direction.Horizontal.Right;
			}

			isClingingToWall = false;
			if(!controller.slots.physicsObject.IsOnSurface())
			{
				if(IsPressingIntoWall() && IsClingAllowed() && !(controller.StateID() == JumpState.idString && !enableClingWhileJumping))
				{
					isClingingToWall = true;
					currentWallJumpGraceFrame = wallJump.wallJumpGraceFrames;
				}
			}

			if(controller.slots.input.isJumpButtonDownThisFrame)
			{
				bool canJump = false;
				if((((controller.slots.physicsObject.properties.isAgainstRightWall || controller.slots.physicsObject.properties.isAgainstLeftWall)) || currentWallJumpGraceFrame > 0) && wallJump.enableWallJump && (!IsJumpActive() || enableClingWhileJumping) && !controller.slots.physicsObject.IsOnSurface() && substate != Substate.LedgeHanging && IsCooldownComplete())
				{
					canJump = true;
				}
				else if(substate == Substate.LedgeHanging && ledgeGrab.canLedgeJump && !controller.slots.physicsObject.IsOnSurface())
				{
					canJump = true;
				}

				if(canJump)
				{
					if(jumpState == null)
					{
						jumpState = controller.GetComponent<JumpState>();
					}

					if(jumpState)
					{
						jumpState.NotifyOfWallJump(wallJump.wallJumpKickbackFrames, mostRecentWallJumpDirection);
						isClingingToWall = false;
					}
				}
				else if(!(wallJump.enableWallJump && substate != Substate.LedgeHanging) || (substate == Substate.LedgeHanging && !ledgeGrab.canLedgeJump) && (wallClimb.enableClimbing || substate == Substate.LedgeHanging))
				{
					currentCooldownFrame = cooldownFrames;
					isClingingToWall = false;

					if(substate != Substate.None)
					{
						isDropping = true;
					}

					controller.SetStateToDefault();
				}
			}

			if(canDisengageWithDirectionalPress && ((controller.slots.physicsObject.properties.isAgainstRightWall && controller.axis.x == -1.0f) || (controller.slots.physicsObject.properties.isAgainstLeftWall && controller.axis.x == 1.0f)))
			{
				isClingingToWall = false;
				controller.SetStateToDefault();
			}

			if(isClingingToWall)
			{
				isDropping = false;
			}
		}
Ejemplo n.º 20
0
        protected void ApplyMovement(float _inputDirection, MovementAxis movementAxis)
        {
            bool isLockedForAttack  = (controller.slots.physicsObject.IsOnSurface()) ? IsLockedForAttack(Attack.ActionType.GroundMoving) : IsLockedForAttack(Attack.ActionType.AirMoving);
            bool isOverriddenByDash = controller.isDashing;
            bool isRunning          = false;

            if (runSettings.canRun && controller.slots.input && controller.slots.input.isRunButtonDown)
            {
                if ((controller.slots.physicsObject.IsOnSurface() || runSettings.canInitiateInAir) || currentMoveType == MoveType.Running)
                {
                    isRunning            = true;
                    isSlowingDownFromRun = false;

                    if (runSettings.runAnimation && currentMoveType != MoveType.Running && Mathf.Abs(_inputDirection) != 0.0f && controller.slots.physicsObject.IsOnSurface() && controller.StateID() == idString)
                    {
                        PlaySecondaryAnimation(runSettings.runAnimation);
                    }

                    currentMoveType = MoveType.Running;
                }
                else
                {
                    if (currentMoveType == MoveType.Running && Mathf.Abs(controller.slots.physicsObject.properties.velocity.x) > movementProperties.speed)
                    {
                        isSlowingDownFromRun = true;
                        PlayAnimation();
                    }

                    currentMoveType = MoveType.Walking;
                }
            }
            else
            {
                if (currentMoveType == MoveType.Running && Mathf.Abs(controller.slots.physicsObject.properties.velocity.x) > movementProperties.speed)
                {
                    isSlowingDownFromRun = true;
                    PlayAnimation();
                }

                currentMoveType = MoveType.Walking;
            }

            if (Mathf.Abs(controller.slots.physicsObject.properties.velocity.x) <= movementProperties.speed)
            {
                isSlowingDownFromRun = false;
            }

            if (isOverriddenByDash || controller.isKnockbackActive || controller.isStunned || controller.StateID() == WallClingState.idString)
            {
                return;
            }

            bool isLockedIntoJump = (jumpState && !controller.slots.physicsObject.IsOnSurface() && jumpState.IsHorizontalMovementFrozen());

            if (isLockedIntoJump)
            {
                ApplyHorizontalJump(jumpState);
                return;
            }

            if (movementProperties == null)
            {
                return;
            }


            float baseSpeed        = (isRunning) ? runProperties.speed : movementProperties.speed;
            float baseAcceleration = (isRunning) ? runProperties.acceleration : movementProperties.acceleration;
            float baseDeceleration = (isRunning || isSlowingDownFromRun) ? runProperties.deceleration : movementProperties.deceleration;

            //If we're moving diagonally and willMaintainSpeedOnDiagonal is true, cut our speed in each direction in half to compensate
            float diagonalMultiplier = 0.707f;             //Moving in two directions at once is 1.4x faster than just one; therefore, we multiply speed in each direction by 0.707
            bool  isMovingDiagonally = (canMoveVertically && willMaintainSpeedOnDiagonal && Mathf.Abs(controller.axis.x) > 0.0f && Mathf.Abs(controller.axis.y) > 0.0f);
            float speed        = (isMovingDiagonally) ? baseSpeed * diagonalMultiplier : baseSpeed;
            float acceleration = (isMovingDiagonally) ? baseAcceleration * diagonalMultiplier : baseAcceleration;
            float deceleration = baseDeceleration;

            if (controller.currentState.id == CrouchState.idString)
            {
                CrouchState crouchState = controller.GetComponent <CrouchState>();
                if (crouchState)
                {
                    if (crouchState.isSkidComplete && !crouchState.allowAccelerationOnMove)
                    {
                        acceleration = 0.0f;
                        deceleration = 0.0f;
                    }

                    if (crouchState.isSkidComplete)
                    {
                        speed = crouchState.moveSpeed;
                    }
                }
            }

            if (_inputDirection != 0.0f && !controller.isKnockbackActive && !isLockedForAttack && !controller.IsOveriddenByCrouch() && !isSlowingDownFromRun)
            {
                if (movementAxis == MovementAxis.Horizontal)                //Let the controller know that we turned around horizontally
                {
                    Direction.Horizontal actorDirection = controller.direction.horizontal;
                    actorDirection = (_inputDirection > 0.0f) ? Direction.Horizontal.Right : Direction.Horizontal.Left;
                    controller.FaceDirection(actorDirection);
                }

                hasEnded = false;                 //We animate the sprite moving, but only if it's moving horizontally
                if (CanPlayAnimation(movementAxis))
                {
                    Begin();
                }

                if (controller.slots.actor.currentAttack != null && controller.slots.actor.currentAttack.canceledBy.onMove)
                {
                    controller.slots.actor.currentAttack.Cancel();
                }

                if (acceleration != 0.0f)                //Accelerate to the top speed
                {
                    if (movementAxis == MovementAxis.Horizontal)
                    {
                        controller.slots.physicsObject.properties.velocityCap.x  = speed * _inputDirection;
                        controller.slots.physicsObject.properties.acceleration.x = acceleration * _inputDirection;
                        controller.slots.physicsObject.properties.deceleration.x = 0;
                    }
                    else
                    {
                        controller.slots.physicsObject.properties.velocityCap.y  = speed * _inputDirection;
                        controller.slots.physicsObject.properties.acceleration.y = acceleration * _inputDirection;
                        controller.slots.physicsObject.properties.deceleration.y = 0;
                    }
                }
                else                 //Immediately go at top speed
                {
                    if (movementAxis == MovementAxis.Horizontal)
                    {
                        controller.slots.physicsObject.properties.velocityCap.x = speed * _inputDirection;
                        controller.slots.physicsObject.SetVelocityX(speed * _inputDirection);
                        controller.slots.physicsObject.properties.acceleration.x = 0.0f;
                        controller.slots.physicsObject.properties.deceleration.x = 0.0f;
                    }
                    else
                    {
                        controller.slots.physicsObject.properties.velocityCap.y = speed * _inputDirection;
                        controller.slots.physicsObject.SetVelocityY(speed * _inputDirection);
                        controller.slots.physicsObject.properties.acceleration.y = 0.0f;
                        controller.slots.physicsObject.properties.deceleration.y = 0.0f;
                    }
                }
            }
            else                          //We can't move directly, but we can apply residual deceleration
            {
                if (deceleration != 0.0f) //Decelerate gradually to a stop
                {
                    if (movementAxis == MovementAxis.Horizontal)
                    {
                        controller.slots.physicsObject.properties.acceleration.x = 0.0f;
                        controller.slots.physicsObject.properties.deceleration.x = deceleration;

                        if (Mathf.Abs(controller.slots.physicsObject.properties.velocity.x) <= 0.0f && (controller.slots.physicsObject.IsOnSurface() || canMoveVertically))
                        {
                            if (!hasEnded)
                            {
                                if (!controller.isKnockbackActive && controller.StateID() != LadderState.idString)
                                {
                                    controller.SetStateToDefault();
                                }
                            }

                            End();
                        }
                    }
                    else
                    {
                        controller.slots.physicsObject.properties.acceleration.y = 0.0f;
                        controller.slots.physicsObject.properties.deceleration.y = deceleration;
                    }
                }
                else                 //Stop immediately
                {
                    if (movementAxis == MovementAxis.Horizontal)
                    {
                        controller.slots.physicsObject.properties.acceleration.x = 0.0f;
                        controller.slots.physicsObject.properties.deceleration.x = 0.0f;
                        controller.slots.physicsObject.SetVelocityX(0.0f);

                        if (!hasEnded)
                        {
                            if (!controller.isKnockbackActive && controller.StateID() != LadderState.idString && (controller.slots.physicsObject.IsOnSurface() || canMoveVertically) && controller.StateID() != CrouchState.idString)
                            {
                                //Default if:
                                //You are on the ground, AND !canMoveVertically
                                //Or, you are in the air
                                controller.SetStateToDefault();
                            }
                        }

                        //Debug.Log("Ending");

                        End();
                    }
                    else
                    {
                        controller.slots.physicsObject.properties.acceleration.y = 0.0f;
                        controller.slots.physicsObject.properties.deceleration.y = 0.0f;
                        controller.slots.physicsObject.SetVelocityY(0.0f);
                    }
                }
            }
        }