mirror of
https://github.com/flutter/samples.git
synced 2025-11-12 15:58:32 +00:00
Adds a template / sample for games built in Flutter, with all the bells and whistles, like ads, in-app purchases, audio, main menu, settings, and so on. Co-authored-by: Parker Lougheed Co-authored-by: Shams Zakhour
120 lines
3.5 KiB
Dart
120 lines
3.5 KiB
Dart
// Copyright 2022, the Flutter project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
import 'dart:async';
|
|
|
|
import 'package:games_services/games_services.dart' as gs;
|
|
import 'package:logging/logging.dart';
|
|
|
|
import 'score.dart';
|
|
|
|
/// Allows awarding achievements and leaderboard scores,
|
|
/// and also showing the platforms' UI overlays for achievements
|
|
/// and leaderboards.
|
|
///
|
|
/// A facade of `package:games_services`.
|
|
class GamesServicesController {
|
|
static final Logger _log = Logger('GamesServicesController');
|
|
|
|
final Completer<bool> _signedInCompleter = Completer();
|
|
|
|
Future<bool> get signedIn => _signedInCompleter.future;
|
|
|
|
/// Unlocks an achievement on Game Center / Play Games.
|
|
///
|
|
/// You must provide the achievement ids via the [iOS] and [android]
|
|
/// parameters.
|
|
///
|
|
/// Does nothing when the game isn't signed into the underlying
|
|
/// games service.
|
|
Future<void> awardAchievement(
|
|
{required String iOS, required String android}) async {
|
|
if (!await signedIn) {
|
|
_log.warning('Trying to award achievement when not logged in.');
|
|
return;
|
|
}
|
|
|
|
try {
|
|
await gs.GamesServices.unlock(
|
|
achievement: gs.Achievement(
|
|
androidID: android,
|
|
iOSID: iOS,
|
|
),
|
|
);
|
|
} catch (e) {
|
|
_log.severe('Cannot award achievement: $e');
|
|
}
|
|
}
|
|
|
|
/// Signs into the underlying games service.
|
|
Future<void> initialize() async {
|
|
try {
|
|
await gs.GamesServices.signIn();
|
|
// The API is unclear so we're checking to be sure. The above call
|
|
// returns a String, not a boolean, and there's no documentation
|
|
// as to whether every non-error result means we're safely signed in.
|
|
final signedIn = await gs.GamesServices.isSignedIn;
|
|
_signedInCompleter.complete(signedIn);
|
|
} catch (e) {
|
|
_log.severe('Cannot log into GamesServices: $e');
|
|
_signedInCompleter.complete(false);
|
|
}
|
|
}
|
|
|
|
/// Launches the platform's UI overlay with achievements.
|
|
Future<void> showAchievements() async {
|
|
if (!await signedIn) {
|
|
_log.severe('Trying to show achievements when not logged in.');
|
|
return;
|
|
}
|
|
|
|
try {
|
|
await gs.GamesServices.showAchievements();
|
|
} catch (e) {
|
|
_log.severe('Cannot show achievements: $e');
|
|
}
|
|
}
|
|
|
|
/// Launches the platform's UI overlay with leaderboard(s).
|
|
Future<void> showLeaderboard() async {
|
|
if (!await signedIn) {
|
|
_log.severe('Trying to show leaderboard when not logged in.');
|
|
return;
|
|
}
|
|
|
|
try {
|
|
await gs.GamesServices.showLeaderboards(
|
|
// TODO: When ready, change both these leaderboard IDs.
|
|
iOSLeaderboardID: "some_id_from_app_store",
|
|
androidLeaderboardID: "sOmE_iD_fRoM_gPlAy",
|
|
);
|
|
} catch (e) {
|
|
_log.severe('Cannot show leaderboard: $e');
|
|
}
|
|
}
|
|
|
|
/// Submits [score] to the leaderboard.
|
|
Future<void> submitLeaderboardScore(Score score) async {
|
|
if (!await signedIn) {
|
|
_log.warning('Trying to submit leaderboard when not logged in.');
|
|
return;
|
|
}
|
|
|
|
_log.info('Submitting $score to leaderboard.');
|
|
|
|
try {
|
|
await gs.GamesServices.submitScore(
|
|
score: gs.Score(
|
|
// TODO: When ready, change these leaderboard IDs.
|
|
iOSLeaderboardID: 'some_id_from_app_store',
|
|
androidLeaderboardID: 'sOmE_iD_fRoM_gPlAy',
|
|
value: score.score,
|
|
),
|
|
);
|
|
} catch (e) {
|
|
_log.severe('Cannot submit leaderboard score: $e');
|
|
}
|
|
}
|
|
}
|