void Start() { rb = GetComponent <Rigidbody2D>(); sr = GetComponent <SpriteRenderer>(); stateVertical = StateVertical.FALLING; stateHorizontal = StateHorizontal.STILL; startPosition = rb.position; }
public void Kill() { rb.position = startPosition; rb.velocity = Vector2.zero; stateVertical = StateVertical.FALLING; stateHorizontal = StateHorizontal.STILL; activeCollisions.Clear(); queuedActions.Clear(); }
public void ChangeVerticalState(StateVertical state) { stateVertical = state; }
// Apply physics updates based on the current state. Update state if necessary private void ApplyState() { switch (stateHorizontal) { case StateHorizontal.MOVING_RIGHT_ACCELERATING_RIGHT: if (rb.velocity.x < RUN_SPEED) { rb.velocity += MOVE_RIGHT_FORCE * Time.fixedDeltaTime; } else { stateHorizontal = StateHorizontal.MOVING_RIGHT; } break; case StateHorizontal.MOVING_LEFT_ACCELERATING_RIGHT: if (rb.velocity.x < 0.0f) { rb.velocity += MOVE_RIGHT_FORCE * Time.fixedDeltaTime; } else { stateHorizontal = StateHorizontal.MOVING_RIGHT_ACCELERATING_RIGHT; } break; case StateHorizontal.MOVING_RIGHT_ACCELERATING_LEFT: if (rb.velocity.x > 0.0f) { rb.velocity += MOVE_LEFT_FORCE * Time.fixedDeltaTime; } else { stateHorizontal = StateHorizontal.MOVING_LEFT_ACCELERATING_LEFT; } break; case StateHorizontal.MOVING_LEFT_ACCELERATING_LEFT: if (rb.velocity.x > -1.0f * RUN_SPEED) { rb.velocity += MOVE_LEFT_FORCE * Time.fixedDeltaTime; } else { stateHorizontal = StateHorizontal.MOVING_LEFT; } break; case StateHorizontal.MOVING_RIGHT_DECELERATING: if (rb.velocity.x + DECELERATION_RIGHT_FORCE.x * Time.fixedDeltaTime > 0) { rb.velocity += DECELERATION_RIGHT_FORCE * Time.fixedDeltaTime; } else { stateHorizontal = StateHorizontal.STILL; } break; case StateHorizontal.MOVING_LEFT_DECELERATING: if (rb.velocity.x + DECELERATION_LEFT_FORCE.x * Time.fixedDeltaTime < 0) { rb.velocity += DECELERATION_LEFT_FORCE * Time.fixedDeltaTime; } else { stateHorizontal = StateHorizontal.STILL; } break; default: break; } switch (stateVertical) { case StateVertical.JUMPING: if (rb.velocity.y < JUMP_SPEED) { rb.velocity += JUMP_FORCE * Time.fixedDeltaTime; } else { stateVertical = StateVertical.FALLING; } break; case StateVertical.FALLING: rb.velocity += GRAVITY * Time.fixedDeltaTime; break; default: break; } }
// Process state changes due to inputs recieved on this frame. Clear input queue private void ProcessQueuedActions() { if (queuedActions.Contains(Action.JUMP)) { if (stateVertical == StateVertical.GROUNDED) { stateVertical = StateVertical.JUMPING; } queuedActions.Remove(Action.JUMP); } if (queuedActions.Contains(Action.MOVE_RIGHT) && !queuedActions.Contains(Action.MOVE_LEFT)) { switch (stateHorizontal) { case StateHorizontal.MOVING_RIGHT_DECELERATING: case StateHorizontal.MOVING_RIGHT_ACCELERATING_LEFT: case StateHorizontal.STILL: stateHorizontal = StateHorizontal.MOVING_RIGHT_ACCELERATING_RIGHT; break; case StateHorizontal.MOVING_LEFT: case StateHorizontal.MOVING_LEFT_DECELERATING: case StateHorizontal.MOVING_LEFT_ACCELERATING_LEFT: stateHorizontal = StateHorizontal.MOVING_LEFT_ACCELERATING_RIGHT; break; default: break; } } else if (queuedActions.Contains(Action.MOVE_LEFT) && !queuedActions.Contains(Action.MOVE_RIGHT)) { switch (stateHorizontal) { case StateHorizontal.MOVING_LEFT_DECELERATING: case StateHorizontal.MOVING_LEFT_ACCELERATING_RIGHT: case StateHorizontal.STILL: stateHorizontal = StateHorizontal.MOVING_LEFT_ACCELERATING_LEFT; break; case StateHorizontal.MOVING_RIGHT: case StateHorizontal.MOVING_RIGHT_DECELERATING: case StateHorizontal.MOVING_RIGHT_ACCELERATING_RIGHT: stateHorizontal = StateHorizontal.MOVING_RIGHT_ACCELERATING_LEFT; break; default: break; } } else { switch (stateHorizontal) { case StateHorizontal.MOVING_RIGHT: case StateHorizontal.MOVING_RIGHT_ACCELERATING_RIGHT: case StateHorizontal.MOVING_RIGHT_ACCELERATING_LEFT: stateHorizontal = StateHorizontal.MOVING_RIGHT_DECELERATING; break; case StateHorizontal.MOVING_LEFT: case StateHorizontal.MOVING_LEFT_ACCELERATING_LEFT: case StateHorizontal.MOVING_LEFT_ACCELERATING_RIGHT: stateHorizontal = StateHorizontal.MOVING_LEFT_DECELERATING; break; default: break; } } }
private void ProcessCollisions() { bool ground = activeCollisions.ContainsValue(CollisionType.GROUND); bool ceiling = activeCollisions.ContainsValue(CollisionType.CEILING); bool wall = activeCollisions.ContainsValue(CollisionType.WALL); if (wall) { stateHorizontal = StateHorizontal.STILL; rb.velocity = new Vector2(0.0f, rb.velocity.y); } if (ground && ceiling) { switch (stateVertical) { case StateVertical.JUMPING: case StateVertical.FALLING: stateVertical = StateVertical.GROUNDED; rb.velocity = new Vector2(rb.velocity.x, 0.0f); break; default: break; } } else if (ground && !ceiling) { switch (stateVertical) { case StateVertical.FALLING: stateVertical = StateVertical.GROUNDED; rb.velocity = new Vector2(rb.velocity.x, 0.0f); break; default: break; } } else if (!ground && ceiling) { switch (stateVertical) { case StateVertical.JUMPING: case StateVertical.GROUNDED: stateVertical = StateVertical.FALLING; rb.velocity = new Vector2(rb.velocity.x, 0.0f); break; default: break; } } else if (!ground && !ceiling) { switch (stateVertical) { case StateVertical.GROUNDED: stateVertical = StateVertical.FALLING; break; default: break; } } }