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); }
/// <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; } }
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); }