import 'dart:math' as math; import 'dart:ui'; import 'package:flame/components.dart'; import 'package:flame/game.dart'; import 'package:flame/gestures.dart'; import 'package:flame/palette.dart'; import 'package:flutter/material.dart'; void main() { runApp( GameWidget( game: MyGame(), ), ); } class Palette { static const PaletteEntry white = BasicPalette.white; static const PaletteEntry red = PaletteEntry(Color(0xFFFF0000)); static const PaletteEntry blue = PaletteEntry(Color(0xFF0000FF)); } class Square extends PositionComponent { static const speed = 0.25; static const squareSize = 128.0; static Paint white = Palette.white.paint; static Paint red = Palette.red.paint; static Paint blue = Palette.blue.paint; @override void render(Canvas c) { super.render(c); c.drawRect(size.toRect(), white); c.drawRect(const Rect.fromLTWH(0, 0, 3, 3), red); c.drawRect(Rect.fromLTWH(width / 2, height / 2, 3, 3), blue); } void update(double dt) { super.update(dt); angle += speed * t; angle %= 2 * math.pi; } @override void onMount() { super.onMount(); size = Vector2.all(squareSize); anchor = Anchor.center; } } class MyGame extends BaseGame with DoubleTapDetector, TapDetector { bool running = true; MyGame() { add(Square() ..x = 100 ..y = 100); } @override void onTapUp(TapUpDetails details) { final touchArea = Rect.fromCenter( center: details.localPosition, width: 20, height: 20, ); final handled = components.any((c) { if (c is PositionComponent && c.toRect().overlaps(touchArea)) { remove(c); return true; } return false; }); if (!handled) { add(Square() ..x = touchArea.left ..y = touchArea.top); } } @override void onDoubleTap() { if (running) { pauseEngine(); } else { resumeEngine(); } running = !running; } }