Ejemplo n.º 1
0
    public float Movement(GameObject playerModel, Vector3 obstacleVelocity, float weakGravity, float strongGravity, float jumpSpeed)
    {
        if (Input.GetKey(KeyCode.DownArrow))
        {
            gravity   = strongGravity;
            thickness = 0.5f;
        }
        else
        {
            gravity   = weakGravity;
            thickness = 1f;
        }
        playerModel.transform.localScale = new Vector3(1, thickness);

        velocity += new Vector3(0.0f, gravity * Time.deltaTime, 0.0f);

        deltaPosition = velocity * Time.deltaTime;

        playerModel.transform.position += deltaPosition;

        CollisionOutcome collisionOutcome = obstacleBox.Collision(thickness, obstacleVelocity, velocity);

        bool landMemory = false;

        switch (collisionOutcome.outcome)
        {
        case -1:
            Debug.Log("player fail");
            break;

        case 0:
            Debug.Log("player no touch");
            break;

        case 1:
            Debug.Log("player touchdown");
            playerModel.transform.position = new Vector3(0f, collisionOutcome.obstacleHeight + 0.5f + thickness / 2f, 0f);
            velocity = new Vector3(0.0f, 0.0f, 0.0f);
            if (playedLastFrame == false)
            {
                landAudio.Play();
                playedLastFrame = true;
            }
            landMemory = true;

            break;

        case 2:
            Debug.Log("player jump");
            playerModel.transform.position = new Vector3(0f, collisionOutcome.obstacleHeight + 0.5f + thickness / 2f, 0f);
            if (jumpSpeed - collisionOutcome.previousHeaight * 2f * jumpSpeed > jumpSpeed)
            {
                velocity = new Vector3(0.0f, jumpSpeed, 0f);
            }
            else
            {
                velocity = new Vector3(0.0f, jumpSpeed - collisionOutcome.previousHeaight * 2f * jumpSpeed, 0f);
            }
            jumpAudio.Play();

            if (playedLastFrame == false)
            {
                landAudio.Play();
            }
            break;

        default:
            Debug.Log("player no touch");
            break;
        }
        if (landMemory == false)
        {
            playedLastFrame = false;
        }

        return(playerModel.transform.position.y);
    }
Ejemplo n.º 2
0
        /// <summary>
        /// Process collisions - X first then Y.
        /// </summary>
        /// <param name="elapsedTime"></param>
        public void ProcessPlayerMovement(KeyboardState prevKeyState, KeyboardState keyState, double elapsedTime)
        {
            if (GameWon)
            {
                return;
            }

            if (EditorMode)
            {
                if (keyState.IsKeyDown(Key.F1) && !prevKeyState.IsKeyDown(Key.F1))
                {
                    SaveTilesToFile();
                }
                if (keyState.IsKeyDown(Key.F2) && !prevKeyState.IsKeyDown(Key.F2))
                {
                    LoadTilesFromFile();
                }
            }
            if (keyState.IsKeyDown(Key.F12) && !prevKeyState.IsKeyDown(Key.F12))
            {
                EditorMode = !EditorMode;
            }

            Vector2d newPosition = McPosition;

            bool moveLeft  = keyState.IsKeyDown(Key.Left) || keyState.IsKeyDown(Key.A);
            bool moveRight = keyState.IsKeyDown(Key.Right) || keyState.IsKeyDown(Key.D);

            if (moveLeft && !moveRight)
            {
                McRunning      = true;
                newPosition.X -= Constants.CHARACTER_MOVE_SPEED * elapsedTime;
                facing         = CharacterFacing.Left;
            }
            else if (moveRight && !moveLeft)
            {
                McRunning      = true;
                newPosition.X += Constants.CHARACTER_MOVE_SPEED * elapsedTime;
                facing         = CharacterFacing.Right;
            }
            else
            {
                McRunning = false;
            }
            if ((keyState.IsKeyDown(Key.Space) || keyState.IsKeyDown(Key.W)) && !(prevKeyState.IsKeyDown(Key.Space) || keyState.IsKeyDown(Key.W)))
            {
                if (McGrounded)
                {
                    McGrounded    = false;
                    McVelocity.Y += Constants.JUMP_SPEED;
                }
            }

            CollisionOutcome outcome = IsIntersectionWithLevel(newPosition.X, newPosition.Y);

            switch (outcome)
            {
            case CollisionOutcome.None:
                McPosition = newPosition;
                break;

            case CollisionOutcome.Victory:
                ResetLevel(LevelResetCause.Victory);
                return;

            default:
                break;
            }

            newPosition = McPosition;

            // collisions - process Y
            McVelocity.Y  -= Constants.GRAVITY * elapsedTime;
            newPosition.Y += McVelocity.Y * elapsedTime;

            outcome = IsIntersectionWithLevel(newPosition.X, newPosition.Y);
            switch (outcome)
            {
            case CollisionOutcome.None:
                McPosition = newPosition;
                McGrounded = false;
                break;

            case CollisionOutcome.Victory:
                ResetLevel(LevelResetCause.Victory);
                return;

            default:
                McVelocity = Vector2d.Zero;
                McGrounded = true;
                break;
            }

            if (IsLavaCollision(McPosition.Y))
            {
                ResetLevel(LevelResetCause.Death);
                return;
            }
        }
Ejemplo n.º 3
0
    public CollisionOutcome Collision(float thickness, Vector3 obstacleVelocity, Vector3 velocity)
    {
        float playerModelY = playerModell.transform.position.y;

        CollisionOutcome outcome = new CollisionOutcome(0, 0, 0);

        foreach (GameObject obstacle in obstacleBoxArray)
        {
            float   thicknessCombined = playerModell.transform.localScale.y / 2 + obstacle.transform.localScale.y / 2;
            Vector3 obstaclePosition  = obstacle.transform.position;

            if (obstaclePosition.x < 1 &&
                obstaclePosition.x > -1 &&
                obstaclePosition.y < playerModelY + thicknessCombined &&
                obstaclePosition.y > playerModelY - thicknessCombined)
            {
                //Debug.Log("collision");
                if (thickness > previousThickness)
                {
                    float vRatio = -velocity.y / obstacleVelocity.x;
                    float dRatio = ((playerModelY - 0.25f) - (obstaclePosition.y + obstacle.transform.localScale.y / 2f))
                                   / ((playerModell.transform.position.x + playerModell.transform.localScale.x / 2f) - (obstaclePosition.x - obstacle.transform.localScale.x / 2f));
                    // Debug.Log("vRatio: " + vRatio + "    dRatio: " + dRatio);

                    if (vRatio <= dRatio)
                    {
                        outcome = new CollisionOutcome(obstaclePosition.y, playerModelY - obstaclePosition.y - obstacle.transform.localScale.y / 2f - 0.25f, 2);
                    }
                    else
                    {
                        outcome = new CollisionOutcome(obstaclePosition.y, 0, -1);
                    }
                }
                else
                {
                    float vRatio = -velocity.y / obstacleVelocity.x;
                    float dRatio = ((playerModelY - playerModell.transform.localScale.y / 2f) - (obstaclePosition.y + obstacle.transform.localScale.y / 2f))
                                   / ((playerModell.transform.position.x + playerModell.transform.localScale.x / 2f) - (obstaclePosition.x - obstacle.transform.localScale.x / 2f));



                    /* Debug.Log("playerY: " + playerModelY + "    playerScaleY: " + playerModell.transform.localScale.y / 2 + "    obstacleY: " + obstaclePosition.y
                     + "    obstacleScaleY: " + obstacle.transform.localScale.y / 2 + "    playerX: " + playerModell.transform.position.x + "    playerScaleX: "
                     + playerModell.transform.localScale.x / 2 + "    obstacleX: " + obstaclePosition.x + "    obstacleScaleX: " + obstacle.transform.localScale.x / 2);
                     + Debug.Log("distanceY: " + ((playerModelY - playerModell.transform.localScale.y / 2) - (obstaclePosition.y + obstacle.transform.localScale.y / 2)));
                     + Debug.Log("distanceX: " + ((playerModell.transform.position.x + playerModell.transform.localScale.x / 2) - (obstaclePosition.x - obstacle.transform.localScale.x / 2)));
                     */
                    //  Debug.Log("no jump:   vRatio: " + vRatio + "    dRatio: " + dRatio);

                    if (vRatio <= dRatio)
                    {
                        outcome = new CollisionOutcome(obstaclePosition.y, playerModelY - obstaclePosition.y - obstacle.transform.localScale.y / 2f - 0.25f, 1);
                    }
                    else
                    {
                        outcome = new CollisionOutcome(obstaclePosition.y, 0, -1);
                    }
                }
            }
        }
        previousThickness = thickness;
        return(outcome);
    }