public void listen(Input input, int delta) {
    /*
    if (KeyboardUtils.isDownPressed(input)) {
      player.setY(player.getY() + delta);
    }
    */
    Rectangle belowPlayer =
        new Rectangle(
            player.getShape().getMinX(),
            player.getShape().getMaxY() + 2,
            player.getShape().getWidth(),
            0);
    Iterator<AbstractBlock> sb = blocks.intersects(belowPlayer);
    boolean flying = !sb.hasNext();
    if (KeyboardUtils.isUpPressed(input) && !flying) {
      player.getYMovement().setSpeed(-Player.JUMP_SPEED);
    } else {
      player.getYMovement().setAcceleration(Sizes.G);
    }
    if (KeyboardUtils.isLeftPressed(input)) {
      player.getXMovement().setAcceleration(-Player.X_ACCELERATION);
    }
    if (KeyboardUtils.isRightPressed(input)) {
      player.getXMovement().setAcceleration(Player.X_ACCELERATION);
    }

    float x = player.getXMovement().getPos();
    float y = player.getYMovement().getPos();
    player.update(delta);
    List<AbstractBlock> colliding_blocks =
        Collections3.getList(blocks.intersects(player.getShape()));

    for (AbstractBlock b : colliding_blocks) {
      HitResolver.resolve(
          player,
          player.getXMovement().getPos() - x,
          player.getYMovement().getPos() - y,
          b.getShape());
      player.updateShape();
    }
    for (AbstractBlock b : colliding_blocks) {
      Assert.assertThat(!player.getShape().intersects(b.getShape()));
    }
    pointOfView.setCenterX(Math.round(player.getShape().getCenterX()));
    pointOfView.setCenterY(Math.round(player.getShape().getCenterY()));
  }
  /** This is manually invoked by Game to make sure that level is created before. */
  public void init() {

    int x = (Sizes.MIN_X + Sizes.MAX_X) / 2;
    player.getXMovement().setPos(x);

    Rectangle rect =
        new Rectangle(
            player.getShape().getX(),
            Sizes.MIN_Y,
            player.getShape().getWidth(),
            Sizes.MAX_Y - Sizes.MIN_Y);
    // All blocks in the same column as player.
    Iterator<AbstractBlock> iter = blocks.intersects(rect);
    float minY = Sizes.MAX_Y;
    while (iter.hasNext()) {
      AbstractBlock b = iter.next();
      if (b.getShape().getMinY() < minY) {
        minY = b.getShape().getMinY();
      }
    }
    player.getYMovement().setPos(minY - Player.HEIGHT - 5);
  }