part of flutter_sprites; class VirtualJoystick extends NodeWithSize { VirtualJoystick() : super(new Size(160.0, 160.0)) { userInteractionEnabled = true; handleMultiplePointers = false; position = new Point(160.0, -20.0); pivot = new Point(0.5, 1.0); _center = new Point(size.width / 2.0, size.height / 2.0); _handlePos = _center; _paintHandle = new Paint() ..color=new Color(0xffffffff); _paintControl = new Paint() ..color=new Color(0xffffffff) ..strokeWidth = 1.0 ..setStyle(ui.PaintingStyle.stroke); } Point _value = Point.origin; Point get value => _value; bool _isDown = false; bool get isDown => _isDown; Point _pointerDownAt; Point _center; Point _handlePos; Paint _paintHandle; Paint _paintControl; bool handleEvent(SpriteBoxEvent event) { if (event.type == "pointerdown") { _pointerDownAt = event.boxPosition; actions.stopAll(); _isDown = true; } else if (event.type == "pointerup" || event.type == "pointercancel") { _pointerDownAt = null; _value = Point.origin; ActionTween moveToCenter = new ActionTween((a) => _handlePos = a, _handlePos, _center, 0.4, elasticOut); actions.run(moveToCenter); _isDown = false; } else if (event.type == "pointermove") { Offset movedDist = event.boxPosition - _pointerDownAt; _value = new Point( (movedDist.dx / 80.0).clamp(-1.0, 1.0), (movedDist.dy / 80.0).clamp(-1.0, 1.0)); _handlePos = _center + new Offset(_value.x * 40.0, _value.y * 40.0); } return true; } void paint(PaintingCanvas canvas) { applyTransformForPivot(canvas); canvas.drawCircle(_handlePos, 25.0, _paintHandle); canvas.drawCircle(_center, 40.0, _paintControl); } }