Esempio n. 1
0
        // Update is called once per frame
        public virtual void update(IGravityClient object_)
        {
            if (!reset)
            {
                y_velocity    = y_velocity + gravity * Time.deltaTime * (isFalling()? multiplyYVelocityDown : multiplyYVelocityUp);
                yFallDistance = y_velocity * Time.deltaTime + 0.5f * gravity * (Time.deltaTime * Time.deltaTime);

                if (!checkForCollision(object_))
                {
                    moveEntity(object_, yFallDistance);
                }
                else
                {
                    if (isNotFalling())
                    {
                        y_velocity = 0.00f;
                    }
                    else
                    {
                        reset               = true;
                        yFallDistance       = 0.0f;
                        distanceTravelled.x = 0.0f;
                        distanceTravelled.y = 0.0f;
                        distanceTravelled.z = 0.0f;
                        y_velocity          = 0.00f;
                    }
                }
            }
            else
            {
                _reset(object_);
            }
        }
Esempio n. 2
0
        public override void update(AICharacter character)
        {
            IGravityClient gravityClient  = character.getEntity().getGravityClient();
            KeysPressed    keysPressed    = character.getEntity().getKeysPressed();
            RayInformation rayInformation = character.getEntity().getGravityClient().getRayInformation();
            RayHitboxes    rayHitboxes    = gravityClient.getRayHitboxes();

            gravityClient.getRayInformation().checkRaysFront(gravityClient, 0.0f, character.getEntity().getTransform().eulerAngles.z + 0.0f, layermask, false);
            gravityClient.getRayInformation().checkRaysBelow(gravityClient, 0.0f, character.getEntity().getTransform().eulerAngles.z + 270.0f, layermask, false);

            float minimalSpaceBetweenTileBelow = rayInformation.MinimalSpaceBetweenTileBelow;
            float topFrontDistance             = (rayHitboxes.HitTopFront.distance * 0.9f);
            bool  turned = false;

            gravityClient.getRayInformation().checkRaysFront(gravityClient, 0.0f, character.getEntity().getTransform().eulerAngles.z + 0.0f, layermask, true);

            keysPressed = turnIfWallIsNear(gravityClient, topFrontDistance,
                                           rayInformation.MinimalSpaceBetweenTileFront, keysPressed, out turned);

            if (!turned && (rayHitboxes.HitMiddleBelow.collider.tag.CompareTo("Slope") != 0))
            {
                keysPressed = turnIfOnAnEdge(keysPressed, minimalSpaceBetweenTileBelow, character);
            }
            character.setKeysPressed(keysPressed);
        }
Esempio n. 3
0
        public float checkRaysTop(IGravityClient gameObject, float yAangle, float zAngle, int layersToIgnore = 0)
        {
            RaycastHit2D hitLeftTop;
            RaycastHit2D hitMiddleTop;
            RaycastHit2D hitRightTop;

            float distanceTop = checkRay(gameObject, posRayLeftTop,
                                         1000.0f, yAangle, zAngle, out hitLeftTop, Color.red, layersToIgnore);
            float tmpDistanceTop = checkRay(gameObject, posRayMiddleTop,
                                            1000.0f, yAangle, zAngle, out hitMiddleTop, Color.red, layersToIgnore);

            distanceTop = (distanceTop < tmpDistanceTop) ? distanceTop : tmpDistanceTop;

            tmpDistanceTop = checkRay(gameObject, posRayRightTop,
                                      1000.0f, yAangle, zAngle, out hitRightTop, Color.red, layersToIgnore);

            distanceTop = (distanceTop < tmpDistanceTop) ? distanceTop : tmpDistanceTop;

            RayHitboxes rayHitboxes = gameObject.getRayHitboxes();

            rayHitboxes.HitLeftTop   = hitLeftTop;
            rayHitboxes.HitMiddleTop = hitMiddleTop;
            rayHitboxes.HitRightTop  = hitRightTop;
            rayHitboxes.DistanceTop  = distanceTop;
            gameObject.setRayHitboxes(rayHitboxes);

            return(distanceTop);
        }
Esempio n. 4
0
        public virtual bool checkObjectHitsFloor(IGravityClient object_)
        {
#if USE_3D_RAYS
            RayInformation3D rayInformation = object_.getRayInformation3D();
            RayHitboxes3D    rayHitboxes    = object_.getRayHitboxes3D();
#else
            RayInformation rayInformation = object_.getRayInformation();
            RayHitboxes    rayHitboxes    = object_.getRayHitboxes();
#endif
            rayInformation.checkRaysBelow(object_, 0.0f,
                                          object_.getTransform().eulerAngles.z + 270.0f,
                                          layermask);
            float correction = 0.0f;
            float minimalSpaceBetweenTileBelow = rayInformation.MinimalSpaceBetweenTileBelow;

            bool objectOnFloor = (rayHitboxes.DistanceBelow <
                                  minimalSpaceBetweenTileBelow * rayInformation.BelowTolerance) ? true :
                                 ((multiplyYVelocityDown * yFallDistance) > (rayHitboxes.DistanceBelow -
                                                                             minimalSpaceBetweenTileBelow)) ? true : false;

            if (objectOnFloor)
            {
                correction = -(rayHitboxes.DistanceBelow -
                               rayInformation.MinimalSpaceBetweenTileBelow);
                moveEntity(object_, correction);
            }

            return(objectOnFloor);
        }
Esempio n. 5
0
        protected virtual KeysPressed turnIfWallIsNear(IGravityClient gravityClient, float topFrontDistance,
                                                       float minimalSpaceBetweenTileFront, KeysPressed keysPressed, out bool turned)
        {
            turned = false;

            if (!gravityClient.isFlipped() &&
                topFrontDistance <= minimalSpaceBetweenTileFront)
            {
                turned            = true;
                keysPressed.left  = true;
                keysPressed.right = false;
            }
            else if (!gravityClient.isFlipped() &&
                     topFrontDistance > minimalSpaceBetweenTileFront)
            {
                keysPressed.left  = false;
                keysPressed.right = true;
            }

            if (gravityClient.isFlipped() &&
                topFrontDistance <= minimalSpaceBetweenTileFront)
            {
                turned            = true;
                keysPressed.left  = false;
                keysPressed.right = true;
            }
            else if (gravityClient.isFlipped() &&
                     topFrontDistance > minimalSpaceBetweenTileFront)
            {
                keysPressed.left  = true;
                keysPressed.right = false;
            }

            return(keysPressed);
        }
Esempio n. 6
0
        private KeysPressed turnIfOnAnEdge(KeysPressed keysPressed,
                                           float minimalSpaceBetweenTileBelow, AICharacter character)
        {
            IGravityClient gravityClient = character.getEntity().getGravityClient();
            RayHitboxes    rayHitboxes   = gravityClient.getRayHitboxes();

            if (gravityClient.isFlipped() && rayHitboxes.HitLeftBelow.distance > 1.0f)
            {
                keysPressed.left  = false;
                keysPressed.right = true;
            }
            else if (gravityClient.isFlipped() &&
                     rayHitboxes.HitLeftBelow.distance <= minimalSpaceBetweenTileBelow)
            {
                keysPressed.left  = true;
                keysPressed.right = false;
            }

            if (!gravityClient.isFlipped() &&
                rayHitboxes.HitRightBelow.distance > 1.0f)
            {
                keysPressed.left  = true;
                keysPressed.right = false;
            }
            else if (!gravityClient.isFlipped() &&
                     rayHitboxes.HitRightBelow.distance <= minimalSpaceBetweenTileBelow)
            {
                keysPressed.left  = false;
                keysPressed.right = true;
            }

            return(keysPressed);
        }
Esempio n. 7
0
        public bool checkLeftRayBelowForSlope(IGravityClient gameObject, float yAangle, float zAngle, int layersToIgnore = 0)
        {
            RaycastHit2D hitLeftBelow;

            checkRay(gameObject, PosRayLeftBelow, 1000.0f, yAangle, zAngle, out hitLeftBelow, Color.gray, layersToIgnore + (1 << slopeLayerNumber));

            return(hitLeftBelow.collider.tag.CompareTo("Slope") == 0);
        }
Esempio n. 8
0
        public override void update(IEntity entity)
        {
            Gravity        gravity       = entity.getGravity();
            KeysPressed    keysPressed   = entity.getKeysPressed();
            IGravityClient gravityClient = entity.getGravityClient();

            moveEntity(entity, keysPressed, gravity, entity.getMovementSpeed());

            switchState(entity, keysPressed, gravity, gravityClient);
        }
Esempio n. 9
0
        public bool moveEntityDown(IEntity entity, KeysPressed keysPressed, Gravity gravity, float movementSpeed)
        {
            IGravityClient gravityClient = entity.getGravityClient();
            bool           moving        = false;

#if USE_3D_RAYS
            RayHitboxes3D rayHitboxes = gravityClient.getRayHitboxes3D();
#else
            RayHitboxes rayHitboxes = gravityClient.getRayHitboxes();
#endif
            Vector3 angles = new Vector3(entity.getTransform().eulerAngles.x,
                                         entity.getTransform().eulerAngles.y,
                                         entity.getTransform().eulerAngles.z);
#if USE_3D_RAYS
            RayInformation3D rayInformation = gravityClient.getRayInformation3D();
#else
            RayInformation rayInformation = gravityClient.getRayInformation();
#endif
            if (!keysPressed.up && keysPressed.down)
            {
                rayInformation.checkRaysBelow(gravityClient, 0.0f, angles.z + 270.0f, layermask);
            }
            bool  isWalking     = !entity.getGravity().isFalling() && !entity.getGravity().Jumping;
            float frontDistance = rayHitboxes.DistanceBelow;

            if (frontDistance > rayInformation.MinimalSpaceBetweenTileBelow)
            {
                if (!keysPressed.up && keysPressed.down)
                {
                    moving = true;

                    if (!entity.getRotateHorizontalMovement())
                    {
                        Vector3 pos = entity.getTransform().position;

                        if (angles.z > 90.0f && angles.z < 270.0f)
                        {
                            pos.y -= ((frontDistance - rayInformation.MinimalSpaceBetweenTileBelow) < movementSpeed * Time.fixedDeltaTime) ?
                                     (frontDistance - rayInformation.MinimalSpaceBetweenTileBelow) : movementSpeed * Time.fixedDeltaTime;
                        }
                        else
                        {
                            pos.y -= ((frontDistance - rayInformation.MinimalSpaceBetweenTileBelow) < movementSpeed * Time.fixedDeltaTime) ?
                                     (frontDistance - rayInformation.MinimalSpaceBetweenTileBelow) : movementSpeed * Time.fixedDeltaTime;
                        }
                        entity.getTransform().position = pos;
                    }

                    gravity.Reset = false;
                }
            }
            return(moving);
        }
Esempio n. 10
0
        public virtual void moveEntity(IGravityClient object_, float moveDistance)
        {
            Vector3 newPosition = object_.getTransform().position;

            Vector3 distance = Quaternion.Euler(
                new Vector3(object_.getTransform().eulerAngles.x,
                            object_.getTransform().eulerAngles.y,
                            object_.getTransform().eulerAngles.z)) * new Vector3(0.0f, moveDistance, 0.0f);

            distanceTravelled += distance;
            newPosition       += distance;
            object_.getTransform().position = newPosition;
        }
Esempio n. 11
0
        public float checkRaysFront(IGravityClient gameObject, float yAangle, float zAngle, int layerMask = 0, bool ignoreSlope = false)
        {
            RaycastHit2D hitTopFront;
            RaycastHit2D hitMiddleFront;
            RaycastHit2D hitBelowFront;

            float distance = (gameObject.isFlipped()) ? -1000.0f : 1000.0f;

            float distanceFront = (!gameObject.isFlipped()) ? checkRay(gameObject, posRayTopFront,
                                                                       distance, yAangle, zAngle, out hitTopFront, Color.green, layerMask + ((ignoreSlope)? 0 : (1 << slopeLayerNumber))) :
                                  checkRayFlipped(gameObject, posRayTopFront,
                                                  distance, yAangle, zAngle, out hitTopFront, Color.green, layerMask + ((ignoreSlope) ? 0 : (1 << slopeLayerNumber)));

            float tmpDistanceFront = (!gameObject.isFlipped()) ? checkRay(gameObject, posRayMiddleFront,
                                                                          distance, yAangle, zAngle, out hitMiddleFront, Color.green, layerMask + ((ignoreSlope) ? 0 : (1 << slopeLayerNumber))) :
                                     checkRayFlipped(gameObject, posRayMiddleFront,
                                                     distance, yAangle, zAngle, out hitMiddleFront, Color.green, layerMask + ((ignoreSlope) ? 0 : (1 << slopeLayerNumber)));

            distanceFront = (distanceFront < tmpDistanceFront) ? distanceFront : tmpDistanceFront;

            RayHitboxes rayHitboxes = gameObject.getRayHitboxes();

            if (rayHitboxes.HitMiddleFront.collider != null &&
                rayHitboxes.HitMiddleFront.collider.tag.CompareTo("Slope") != 0)
            {
                tmpDistanceFront = (!gameObject.isFlipped()) ? checkRay(gameObject, posRayBelowFront,
                                                                        distance, yAangle, zAngle, out hitBelowFront, Color.green, layerMask) :
                                   checkRayFlipped(gameObject, posRayBelowFront,
                                                   distance, yAangle, zAngle, out hitBelowFront, Color.green, layerMask);

                rayHitboxes.HitBelowFront = hitBelowFront;

                if (rayHitboxes.HitBelowFront.collider != null &&
                    rayHitboxes.HitBelowFront.collider.tag.CompareTo("Slope") != 0)
                {
                    distanceFront = (distanceFront < tmpDistanceFront) ? distanceFront : tmpDistanceFront;
                }
            }
            else
            {
                hitBelowFront             = new RaycastHit2D();
                hitBelowFront.distance    = -1.0f;
                rayHitboxes.HitBelowFront = hitBelowFront;
            }
            rayHitboxes.HitMiddleFront = hitMiddleFront;
            rayHitboxes.HitTopFront    = hitTopFront;
            rayHitboxes.DistanceFront  = distanceFront;
            gameObject.setRayHitboxes(rayHitboxes);

            return(distanceFront);
        }
Esempio n. 12
0
        public override void update(IEntity entity)
        {
            Gravity     gravity     = entity.getGravity();
            KeysPressed keysPressed = entity.getKeysPressed();

            if (keysPressed.attack)
            {
                Player player = entity.getTransform().gameObject.GetComponent <Player>();
                IBehaviourStateFactory behaviourStateFactory = entity.getBehaviourStateFactory();

                if (player != null && player.IsNearShop)
                {
                    if (keysPressed.actionButtonOne)
                    {
                        entity.setState(((BehaviourStateFactory)behaviourStateFactory).getShopState(entity));
                    }
                }
                else
                {
                    int direction = (!keysPressed.left && !keysPressed.right && !keysPressed.up && !keysPressed.down) ? -1 : getDirection(keysPressed);

                    entity.setState(((BehaviourStateFactory)behaviourStateFactory).getAttackState(entity, direction));
                }
            }
            else
            {
                IGravityClient gravityClient = entity.getGravityClient();
                bool           moving        = false;

                moving = moveEntityUp(entity, keysPressed, gravity, entity.getMovementSpeed());
                if (!moving)
                {
                    moving = moveEntityDown(entity, keysPressed, gravity, entity.getMovementSpeed());
                }
                if (moveEntity(entity, keysPressed, gravity, entity.getMovementSpeed()))
                {
                    moving = true;
                }

                entity.setMoving(moving);

                if (!keysPressed.left && !keysPressed.right && !keysPressed.up && !keysPressed.down)
                {
                    goIdle(entity);
                }
            }
        }
Esempio n. 13
0
        public float checkAttackRay(IGravityClient gameObject, Vector3 startPosRay, Vector3 endPosRay, string tag)
        {
            float        result          = -1.0f;
            RaycastHit2D attackRayResult = Physics2D.Raycast(startPosRay, endPosRay);

            if (attackRayResult.collider.tag.CompareTo(tag) == 0)
            {
                result = attackRayResult.distance;
            }

            RayHitboxes rayHitboxes = gameObject.getRayHitboxes();

            rayHitboxes.AttackRayResult = attackRayResult;
            gameObject.setRayHitboxes(rayHitboxes);

            return(result);
        }
Esempio n. 14
0
        public float checkRaysFront(IGravityClient gameObject, float yAangle, float zAngle, int layersToIgnore = 0)
        {
            RaycastHit hitTopFront;
            RaycastHit hitMiddleFront;
            RaycastHit hitBelowFront;

            float distance = (gameObject.isFlipped()) ? -1000.0f : 1000.0f;

            float distanceFront = (!gameObject.isFlipped()) ? checkRay(gameObject, posRayTopFront,
                                                                       distance, yAangle, zAngle, out hitTopFront, Color.green, layersToIgnore) :
                                  checkRayFlipped(gameObject, posRayTopFront,
                                                  distance, yAangle, zAngle, out hitTopFront, Color.green, layersToIgnore);

            float tmpDistanceFront = (!gameObject.isFlipped()) ? checkRay(gameObject, posRayMiddleFront,
                                                                          distance, yAangle, zAngle, out hitMiddleFront, Color.green, layersToIgnore) :
                                     checkRayFlipped(gameObject, posRayMiddleFront,
                                                     distance, yAangle, zAngle, out hitMiddleFront, Color.green, layersToIgnore);

            distanceFront = (distanceFront < tmpDistanceFront) ? distanceFront : tmpDistanceFront;

            RayHitboxes3D rayHitboxes = gameObject.getRayHitboxes3D();

            if (rayHitboxes.HitMiddleFront.collider != null &&
                rayHitboxes.HitMiddleFront.collider.tag.CompareTo("Slope") != 0)
            {
                tmpDistanceFront = (!gameObject.isFlipped()) ? checkRay(gameObject, posRayBelowFront,
                                                                        distance, yAangle, zAngle, out hitBelowFront, Color.green, layersToIgnore) :
                                   checkRayFlipped(gameObject, posRayBelowFront,
                                                   distance, yAangle, zAngle, out hitBelowFront, Color.green, layersToIgnore);

                rayHitboxes.HitBelowFront = hitBelowFront;

                if (rayHitboxes.HitBelowFront.collider != null &&
                    rayHitboxes.HitBelowFront.collider.tag.CompareTo("Slope") != 0)
                {
                    distanceFront = (distanceFront < tmpDistanceFront) ? distanceFront : tmpDistanceFront;
                }
            }
            rayHitboxes.HitMiddleFront = hitMiddleFront;
            rayHitboxes.HitTopFront    = hitTopFront;
            rayHitboxes.DistanceFront  = distanceFront;
            gameObject.setRayHitboxes3D(rayHitboxes);

            return(distanceFront);
        }
Esempio n. 15
0
        public bool moveEntityUp(IEntity entity, KeysPressed keysPressed, Gravity gravity, float movementSpeed)
        {
            IGravityClient gravityClient = entity.getGravityClient();
            bool           moving        = false;

#if USE_3D_RAYS
            RayHitboxes3D rayHitboxes = gravityClient.getRayHitboxes3D();
#else
            RayHitboxes rayHitboxes = gravityClient.getRayHitboxes();
#endif
            Vector3 angles = new Vector3(entity.getTransform().eulerAngles.x,
                                         entity.getTransform().eulerAngles.y,
                                         entity.getTransform().eulerAngles.z);
#if USE_3D_RAYS
            RayInformation3D rayInformation = gravityClient.getRayInformation3D();
#else
            RayInformation rayInformation = gravityClient.getRayInformation();
#endif
            if (keysPressed.up && !keysPressed.down)
            {
                rayInformation.checkRaysTop(gravityClient, 0.0f, angles.z + 90.0f, layermask);
            }
            bool isWalking = !entity.getGravity().isFalling() && !entity.getGravity().Jumping;

            float frontDistance = rayHitboxes.DistanceTop;

            if (frontDistance > rayInformation.MinimalSpaceBetweenTileTop)
            {
                if (keysPressed.up && !keysPressed.down)
                {
                    moving = true;

                    Vector3 pos = entity.getTransform().position;

                    pos.y += ((frontDistance - rayInformation.MinimalSpaceBetweenTileTop) < movementSpeed * Time.fixedDeltaTime) ?
                             (frontDistance - rayInformation.MinimalSpaceBetweenTileTop) : movementSpeed * Time.fixedDeltaTime;

                    entity.getTransform().position = pos;

                    gravity.Reset = false;
                }
            }
            return(moving);
        }
Esempio n. 16
0
        public float checkRaysBelow(IGravityClient gameObject, float yAangle, float zAngle, int layersToIgnore, bool doIgnoreSlope = true)
        {
            RaycastHit2D hitMiddleBelow;
            RaycastHit2D hitLeftBelow;
            RaycastHit2D hitRightBelow;

            float distanceBelow = checkRay(gameObject, posRayMiddleBelow,
                                           1000.0f, yAangle, zAngle, out hitMiddleBelow, Color.blue, layersToIgnore + (1 << slopeLayerNumber));

            float belowTolerance = ((hitMiddleBelow.collider.tag.CompareTo("Slope") == 0) ? this.belowTolerance : 1.0f);

            bool rightRayOnSlope = checkRightRayBelowForSlope(gameObject, yAangle, zAngle, out hitRightBelow, layersToIgnore);
            bool leftRayOnSlope  = checkLeftRayBelowForSlope(gameObject, yAangle, zAngle, out hitLeftBelow, layersToIgnore);

            float leftDistanceBelow = checkRay(gameObject, posRayLeftBelow, 1000.0f, yAangle,
                                               zAngle, out hitLeftBelow, Color.gray, layersToIgnore + ((doIgnoreSlope) ? 0 : (1 << slopeLayerNumber)));

            float rightDistanceBelow = checkRay(gameObject, posRayRightBelow, 1000.0f, yAangle,
                                                zAngle, out hitRightBelow, Color.green, layersToIgnore + ((doIgnoreSlope) ? 0 : (1 << slopeLayerNumber)));

            if (!doIgnoreSlope ||
                (doIgnoreSlope && distanceBelow >= (minimalSpaceBetweenTileBelow * belowTolerance)))
            {
                if (leftDistanceBelow < distanceBelow)
                {
                    distanceBelow = leftDistanceBelow;
                }
                if (distanceBelow > rightDistanceBelow)
                {
                    distanceBelow = rightDistanceBelow;
                }
            }

            RayHitboxes rayHitboxes = gameObject.getRayHitboxes();

            rayHitboxes.HitMiddleBelow = hitMiddleBelow;
            rayHitboxes.HitLeftBelow   = hitLeftBelow;
            rayHitboxes.HitRightBelow  = hitRightBelow;
            rayHitboxes.DistanceBelow  = distanceBelow;
            gameObject.setRayHitboxes(rayHitboxes);

            return(distanceBelow);
        }
Esempio n. 17
0
        //https://docs.unity3d.com/ScriptReference/Physics.Raycast.html?_ga=2.69651992.960042701.1515280206-1316818202.1483563338
        public float checkRayFlipped(IGravityClient gameObject, Vector3 positionRay, float distance,
                                     float yAngle, float zAngle, out RaycastHit hit, Color color, int layersToIgnore = 0)
        {
            float   result   = float.MaxValue;
            Vector3 startRay = new Vector2(positionRay.x, positionRay.y);
            Vector3 endRay   = new Vector2(positionRay.x + distance, positionRay.y);
            Vector3 dir      = Vector3.left;

            Vector3 eulerVector = new Vector3(0.0f, 0.0f, 0.0f);

            startRay = Quaternion.Euler(eulerVector) * (startRay);
            endRay   = Quaternion.Euler(eulerVector) * (endRay);
            dir      = Quaternion.Euler(eulerVector) * (dir);

            eulerVector.z = zAngle;
            startRay      = Quaternion.Euler(eulerVector) * (startRay);
            endRay        = Quaternion.Euler(eulerVector) * (endRay);
            dir           = Quaternion.Euler(eulerVector) * (dir);

            startRay += gameObject.getPosition();
            endRay   += gameObject.getPosition();

            int layerMask = ~(1 << gameObject.getLayer() | layersToIgnore);

            if (yAngle > 0.0f)
            {
                dir = Vector3.back;
            }
            if (yAngle < 0.0f)
            {
                dir = Vector3.forward;
            }
            if (Physics.Raycast(startRay, dir, out hit, 1000000.0f, layerMask))
            {
                result = hit.distance;
            }

            Debug.DrawRay(startRay, dir, color, 0.2f, false);

            return(result);
        }
Esempio n. 18
0
        public virtual float checkRay(IGravityClient gameObject, Vector3 positionRay, float distance, float yAngle, float zAngle, out RaycastHit2D hit, Color color, int layersToIgnore = 0)
        {
            float   result   = float.MaxValue;
            Vector3 startRay = new Vector2(positionRay.x, positionRay.y);
            Vector3 endRay   = new Vector2(positionRay.x + distance, positionRay.y);
            Vector2 dir      = Vector2.right;

            Vector3 eulerVector = new Vector3(0.0f, 0.0f, 0.0f);

            startRay = Quaternion.Euler(eulerVector) * (startRay);
            endRay   = Quaternion.Euler(eulerVector) * (endRay);
            dir      = Quaternion.Euler(eulerVector) * (dir);

            eulerVector.y = yAngle;
            eulerVector.z = zAngle;
            startRay      = Quaternion.Euler(eulerVector) * (startRay);
            endRay        = Quaternion.Euler(eulerVector) * (endRay);
            dir           = Quaternion.Euler(eulerVector) * (dir);

            startRay += gameObject.getPosition();
            endRay   += gameObject.getPosition();

            int layerMask = layersToIgnore;

            hit = Physics2D.Raycast(startRay, dir, 1000000.0f, layerMask);

            if (hit.collider != null)
            {
                result = hit.distance;
                Debug.DrawLine(startRay, hit.point, color);
            }

            else
            {
                Debug.DrawLine(startRay, endRay, color);
            }

            return(result);
        }
Esempio n. 19
0
        public override void update(IEntity entity)
        {
            Gravity        gravity       = entity.getGravity();
            KeysPressed    keysPressed   = entity.getKeysPressed();
            IGravityClient gravityClient = entity.getGravityClient();

#if USE_3D_RAYS
            gravityClient.getRayInformation3D().checkRaysFront(gravityClient, 0.0f, entity.getTransform().eulerAngles.z + 0.0f, entity.getGravityClient().getLayerToIgnore());
#else
            gravityClient.getRayInformation().checkRaysFront(gravityClient, 0.0f, entity.getTransform().eulerAngles.z + 0.0f, layermask);
#endif
            if (keysPressed.jump && (gravity.isStanding() ||
#if USE_3D_RAYS
                                     (gravityClient.getRayHitboxes().DistanceBelow <= (gravityClient.getRayInformation3D().MinimalSpaceBetweenTileBelow))) &&
#else
                                     (gravityClient.getRayHitboxes().DistanceBelow <= (gravityClient.getRayInformation().MinimalSpaceBetweenTileBelow))) &&
#endif
                entity.getJumpedReleased())
            {
                IBehaviourStateFactory behaviourStateFactory = entity.getBehaviourStateFactory();
                entity.setState(behaviourStateFactory.getJumpUpState(entity));
                moveEntity(entity, keysPressed, gravity, entity.getMovementSpeed());
            }
Esempio n. 20
0
        public float checkRaysBelow(IGravityClient gameObject, float yAangle, float zAngle, int layersToIgnore = 0)
        {
            RaycastHit hitMiddleBelow;
            RaycastHit hitLeftBelow;
            RaycastHit hitRightBelow;

            float distanceBelow = checkRay(gameObject, posRayMiddleBelow,
                                           1000.0f, yAangle, zAngle, out hitMiddleBelow, Color.blue, layersToIgnore);

            float leftDistanceBelow = checkRay(gameObject, posRayLeftBelow,
                                               1000.0f, yAangle, zAngle, out hitLeftBelow, Color.gray, layersToIgnore);

            float rightDistanceBelow = checkRay(gameObject, posRayRightBelow,
                                                1000.0f, yAangle, zAngle, out hitRightBelow, Color.blue, layersToIgnore);

            if (checkDistanceBetweenRays(hitLeftBelow, hitMiddleBelow))
            {
                distanceBelow = leftDistanceBelow;
            }
            if (leftDistanceBelow > rightDistanceBelow)
            {
                if (checkDistanceBetweenRays(hitRightBelow, hitMiddleBelow))
                {
                    distanceBelow = rightDistanceBelow;
                }
            }

            RayHitboxes3D rayHitboxes = gameObject.getRayHitboxes3D();

            rayHitboxes.HitMiddleBelow = hitMiddleBelow;
            rayHitboxes.HitLeftBelow   = hitLeftBelow;
            rayHitboxes.HitRightBelow  = hitRightBelow;
            rayHitboxes.DistanceBelow  = distanceBelow;
            gameObject.setRayHitboxes3D(rayHitboxes);
            return(distanceBelow);
        }
Esempio n. 21
0
        protected virtual void init()
        {
            currectZ = transform.localRotation.eulerAngles.z;

            IGravityFactory gravityFactory = new GravityFactory();

#if USE_3D_RAYS
            rayHitboxes3D = gravityFactory.getRayHitboxes3D();
#else
            rayHitboxes = gravityFactory.getRayHitboxes();
#endif
            setGravity();

            gravityClient = gravityFactory.getGravityClient(this);

            if (castsShadows)
            {
                spriteRenderer.shadowCastingMode = ShadowCastingMode.TwoSided;
                spriteRenderer.receiveShadows    = true;
            }

            LayersLookup layersLookup = GameObject.FindGameObjectWithTag("GameManager").GetComponent <LayersLookup>();
            layermask = (1 << layersLookup.giveLayerNumber("Tile") | 1 << layersLookup.giveLayerNumber("Default"));
        }
Esempio n. 22
0
        public virtual bool checkObjectHitsPlatform(float yModifier, IGravityClient object_)
        {
#if USE_3D_RAYS
            RayInformation3D rayInformation = object_.getRayInformation3D();
            RayHitboxes3D    rayHitboxes    = object_.getRayHitboxes3D();
#else
            RayInformation rayInformation = object_.getRayInformation();
            RayHitboxes    rayHitboxes    = object_.getRayHitboxes();
#endif
            rayInformation.checkRaysTop(object_, 0.0f, object_.getTransform().eulerAngles.z + 90.0f, layermask);
            bool objectHitTop = (rayHitboxes.DistanceTop <
                                 rayInformation.MinimalSpaceBetweenTileTop) ? true :
                                (yModifier > (rayHitboxes.DistanceTop -
                                              rayInformation.MinimalSpaceBetweenTileTop)) ? true : false;

            if (objectHitTop)
            {
                float correction = -(rayHitboxes.DistanceTop -
                                     rayInformation.MinimalSpaceBetweenTileTop);
                moveEntity(object_, correction);
                checkObjectHitsFloor(object_);
            }
            return(objectHitTop);
        }
Esempio n. 23
0
        // Update is called once per frame
        public override void update(IGravityClient object_)
        {
#if (DEBUG)
            // Debug.Log("Update method is empty!");
#endif
        }
Esempio n. 24
0
 public virtual bool checkForCollision(IGravityClient object_)
 {
     return((yFallDistance > 0.0f) ? checkObjectHitsPlatform(yFallDistance, object_) : checkObjectHitsFloor(object_));
 }
Esempio n. 25
0
 public virtual void _reset(IGravityClient object_)
 {
     y_velocity = (jumping) ? object_.getJumpForce() : y_velocity_reset;
 }
Esempio n. 26
0
 protected virtual void switchState(IEntity entity, KeysPressed keysPressed, Gravity gravity, IGravityClient gravityClient)
 {
     if (!keysPressed.jump)
     {
         if (gravity.Y_velocity >= 0.0f && (gravityClient.getJumpForce() * 0.85f) > gravity.Y_velocity)
         {
             gravity.Y_velocity = -0.01f;
         }
     }
     if (gravity.isFalling() || gravity.isStanding())
     {
         gravity.Jumping = false;
         IBehaviourStateFactory behaviourStateFactory = entity.getBehaviourStateFactory();
         entity.setState(behaviourStateFactory.getFallState(entity));
     }
 }