mirror of
https://github.com/flutter/samples.git
synced 2025-11-13 00:08:24 +00:00
Add game_template (#1180)
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
This commit is contained in:
119
game_template/lib/src/games_services/games_services.dart
Normal file
119
game_template/lib/src/games_services/games_services.dart
Normal file
@@ -0,0 +1,119 @@
|
||||
// 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');
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user