mirror of
https://github.com/flame-engine/flame.git
synced 2025-11-01 10:38:17 +08:00
I was playing around with the rule avoid-global-state While I don't think we should enable it, because we do have several totally legitimate cases of what the rule considers global state, it did help me find any current cases where the things just should be final constants. So this PR will mark semantically final variables as final (or const) proper, exclusively on examples (no violations on actual src code are legit).
85 lines
2.0 KiB
Dart
85 lines
2.0 KiB
Dart
import 'package:flame/components.dart';
|
|
import 'package:flame/extensions.dart';
|
|
import 'package:flame/game.dart';
|
|
import 'package:flame/input.dart';
|
|
import 'package:flame/palette.dart';
|
|
import 'package:flame_audio/flame_audio.dart';
|
|
import 'package:flutter/widgets.dart' hide Animation;
|
|
|
|
void main() {
|
|
runApp(GameWidget(game: AudioGame()));
|
|
}
|
|
|
|
/// This example game showcases three possible use cases:
|
|
///
|
|
/// 1. Use the static FlameAudio class to easily fire a sfx using the default
|
|
/// configs for the button tap.
|
|
/// 2. Uses a custom AudioPool for extremely efficient audio loading and pooling
|
|
/// for tapping elsewhere.
|
|
/// 3. Uses the Bgm utility for background music.
|
|
class AudioGame extends FlameGame with TapDetector {
|
|
static final Paint black = BasicPalette.black.paint();
|
|
static final Paint gray = const PaletteEntry(Color(0xFFCCCCCC)).paint();
|
|
static final TextPaint text = TextPaint(
|
|
style: TextStyle(color: BasicPalette.white.color),
|
|
);
|
|
|
|
late AudioPool pool;
|
|
|
|
@override
|
|
Future<void> onLoad() async {
|
|
pool = await FlameAudio.createPool(
|
|
'sfx/fire_2.mp3',
|
|
minPlayers: 3,
|
|
maxPlayers: 4,
|
|
);
|
|
startBgmMusic();
|
|
}
|
|
|
|
Rect get button => Rect.fromLTWH(20, size.y - 300, size.x - 40, 200);
|
|
|
|
void startBgmMusic() {
|
|
FlameAudio.bgm.initialize();
|
|
FlameAudio.bgm.play('music/bg_music.ogg');
|
|
}
|
|
|
|
void fireOne() {
|
|
FlameAudio.play('sfx/fire_1.mp3');
|
|
}
|
|
|
|
void fireTwo() {
|
|
pool.start();
|
|
}
|
|
|
|
@override
|
|
void render(Canvas canvas) {
|
|
super.render(canvas);
|
|
canvas.drawRect(size.toRect(), black);
|
|
|
|
text.render(
|
|
canvas,
|
|
'(click anywhere for 1)',
|
|
Vector2(size.x / 2, 200),
|
|
anchor: Anchor.topCenter,
|
|
);
|
|
|
|
canvas.drawRect(button, gray);
|
|
|
|
text.render(
|
|
canvas,
|
|
'click here for 2',
|
|
Vector2(size.x / 2, size.y - 200),
|
|
anchor: Anchor.bottomCenter,
|
|
);
|
|
}
|
|
|
|
@override
|
|
void onTapDown(TapDownInfo info) {
|
|
if (button.containsPoint(info.eventPosition.game)) {
|
|
fireTwo();
|
|
} else {
|
|
fireOne();
|
|
}
|
|
}
|
|
}
|