flame 1.0.0-rc3 flame: ^1.0.0-rc3 copied to clipboard
A minimalist Flutter game engine, provides a nice set of somewhat independent modules you can choose from.
import 'dart:math' as math;
import 'dart:ui';
import 'package:flame/anchor.dart';
import 'package:flame/extensions/vector2.dart';
import 'package:flame/gestures.dart';
import 'package:flame/components/position_component.dart';
import 'package:flame/components/mixins/has_game_ref.dart';
import 'package:flame/game.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 with HasGameRef<MyGame> {
static const SPEED = 0.25;
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);
}
@override
void update(double t) {
super.update(t);
angle += SPEED * t;
angle %= 2 * math.pi;
}
@override
void onMount() {
size = Vector2.all(gameRef.squareSize);
anchor = Anchor.center;
}
}
class MyGame extends BaseGame with DoubleTapDetector, TapDetector {
final double squareSize = 128;
bool running = true;
MyGame() {
add(Square()
..x = 100
..y = 100);
}
@override
void onTapUp(details) {
final touchArea = Rect.fromCenter(
center: details.localPosition,
width: 20,
height: 20,
);
bool handled = false;
components.forEach((c) {
if (c is PositionComponent && c.toRect().overlaps(touchArea)) {
handled = true;
remove(c);
}
});
if (!handled) {
add(Square()
..x = touchArea.left
..y = touchArea.top);
}
}
@override
void onDoubleTap() {
if (running) {
pauseEngine();
} else {
resumeEngine();
}
running = !running;
}
}