calculate method

  1. @override
Offset calculate({
  1. required JoystickMode mode,
  2. required Offset startDragStickPosition,
  3. required Offset currentDragStickPosition,
  4. required Size baseSize,
})
override

Implementation

@override
Offset calculate({
  required JoystickMode mode,
  required Offset startDragStickPosition,
  required Offset currentDragStickPosition,
  required Size baseSize,
}) {
  double x = currentDragStickPosition.dx - startDragStickPosition.dx;
  double y = currentDragStickPosition.dy - startDragStickPosition.dy;
  final radius = baseSize.width / 2;

  final isPointInCircle = x * x + y * y < radius * radius;

  if (!isPointInCircle) {
    final mult = sqrt(radius * radius / (y * y + x * x));
    x *= mult;
    y *= mult;
  }

  final xOffset = x / radius;
  final yOffset = y / radius;

  switch (mode) {
    case JoystickMode.all:
      return Offset(xOffset, yOffset);
    case JoystickMode.vertical:
      return Offset(0.0, yOffset);
    case JoystickMode.horizontal:
      return Offset(xOffset, 0.0);
    case JoystickMode.horizontalAndVertical:
      return Offset(xOffset.abs() > yOffset.abs() ? xOffset : 0,
          yOffset.abs() > xOffset.abs() ? yOffset : 0);
  }
}