Moving size from BaseGame to Game

This commit is contained in:
Erick Zanardo
2020-12-11 11:45:23 -03:00
parent f917920f45
commit 11511b98a8
12 changed files with 55 additions and 75 deletions

View File

@ -14,6 +14,7 @@
- Creating new way of loading animations and sprites - Creating new way of loading animations and sprites
- Dragable mixin for components - Dragable mixin for components
- Fix update+render of component children - Fix update+render of component children
- Moving size to Game instead of BaseGame
## 1.0.0-rc2 ## 1.0.0-rc2
- Improve IsometricTileMap and Spritesheet classes - Improve IsometricTileMap and Spritesheet classes

View File

@ -1,7 +1,6 @@
import 'package:flame/game.dart'; import 'package:flame/game.dart';
import 'package:flame/gestures.dart'; import 'package:flame/gestures.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:flame/flame.dart';
import 'package:flame/extensions/vector2.dart'; import 'package:flame/extensions/vector2.dart';
import 'package:flame/sprite_animation.dart'; import 'package:flame/sprite_animation.dart';
import 'package:flame/components/sprite_animation_component.dart'; import 'package:flame/components/sprite_animation_component.dart';
@ -11,8 +10,7 @@ import 'dart:ui';
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
final Vector2 size = await Flame.util.initialDimensions(); final game = MyGame();
final game = MyGame(size);
runApp( runApp(
GameWidget( GameWidget(
game: game, game: game,
@ -81,8 +79,4 @@ class MyGame extends BaseGame with TapDetector {
void onTapDown(TapDownDetails evt) { void onTapDown(TapDownDetails evt) {
addAnimation(Vector2(evt.globalPosition.dx, evt.globalPosition.dy)); addAnimation(Vector2(evt.globalPosition.dx, evt.globalPosition.dy));
} }
MyGame(Vector2 screenSize) {
size.setFrom(screenSize);
}
} }

View File

@ -1,4 +1,3 @@
import 'package:flame/flame.dart';
import 'package:flame/game.dart'; import 'package:flame/game.dart';
import 'package:flame/sprite_animation.dart'; import 'package:flame/sprite_animation.dart';
import 'package:flame/extensions/vector2.dart'; import 'package:flame/extensions/vector2.dart';
@ -6,20 +5,14 @@ import 'package:flame/components/sprite_animation_component.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized();
final Vector2 size = await Flame.util.initialDimensions();
runApp( runApp(
GameWidget( GameWidget(
game: MyGame(size), game: MyGame(),
), ),
); );
} }
class MyGame extends BaseGame { class MyGame extends BaseGame {
MyGame(Vector2 screenSize) {
size = screenSize;
}
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
final image = await images.load('chopper.png'); final image = await images.load('chopper.png');

View File

@ -1,5 +1,4 @@
import 'package:flame/game.dart'; import 'package:flame/game.dart';
import 'package:flame/flame.dart';
import 'package:flame/nine_tile_box.dart'; import 'package:flame/nine_tile_box.dart';
import 'package:flame/sprite.dart'; import 'package:flame/sprite.dart';
import 'package:flame/extensions/vector2.dart'; import 'package:flame/extensions/vector2.dart';
@ -8,9 +7,8 @@ import 'package:flutter/material.dart';
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
final size = await Flame.util.initialDimensions();
final game = MyGame(size); final game = MyGame();
runApp( runApp(
GameWidget( GameWidget(
game: game, game: game,
@ -19,11 +17,8 @@ void main() async {
} }
class MyGame extends Game { class MyGame extends Game {
Vector2 size;
NineTileBox nineTileBox; NineTileBox nineTileBox;
MyGame(this.size);
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
final sprite = Sprite(await images.load('nine-box.png')); final sprite = Sprite(await images.load('nine-box.png'));

View File

@ -1,6 +1,5 @@
import 'package:flame/sprite_animation.dart'; import 'package:flame/sprite_animation.dart';
import 'package:flame/components/sprite_animation_component.dart'; import 'package:flame/components/sprite_animation_component.dart';
import 'package:flame/flame.dart';
import 'package:flame/game.dart'; import 'package:flame/game.dart';
import 'package:flame/extensions/vector2.dart'; import 'package:flame/extensions/vector2.dart';
import 'package:flutter/material.dart' hide Image; import 'package:flutter/material.dart' hide Image;
@ -8,8 +7,7 @@ import 'dart:ui';
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
final Vector2 size = await Flame.util.initialDimensions(); final game = MyGame();
final game = MyGame(size);
runApp( runApp(
GameWidget( GameWidget(
game: game, game: game,
@ -56,8 +54,4 @@ class MyGame extends BaseGame {
), ),
); );
} }
MyGame(Vector2 screenSize) {
size.setFrom(screenSize);
}
} }

View File

@ -1,6 +1,5 @@
import 'dart:math'; import 'dart:math';
import 'package:flame/flame.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flame/game.dart'; import 'package:flame/game.dart';
import 'package:flame/sprite_batch.dart'; import 'package:flame/sprite_batch.dart';
@ -9,8 +8,7 @@ import 'package:flame/components/sprite_batch_component.dart';
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
final Vector2 size = await Flame.util.initialDimensions(); final game = MyGame();
final game = MyGame(size);
runApp( runApp(
GameWidget( GameWidget(
game: game, game: game,
@ -21,13 +19,8 @@ void main() async {
class MyGame extends BaseGame { class MyGame extends BaseGame {
SpriteBatch spriteBatch; SpriteBatch spriteBatch;
MyGame(Vector2 screenSize) { @override
size = screenSize; Future<void> onLoad() async {
initData();
}
void initData() async {
spriteBatch = await SpriteBatch.withAsset('boom3.png'); spriteBatch = await SpriteBatch.withAsset('boom3.png');
spriteBatch.add( spriteBatch.add(

View File

@ -1,15 +1,13 @@
import 'dart:math'; import 'dart:math';
import 'package:flame/components/sprite_component.dart'; import 'package:flame/components/sprite_component.dart';
import 'package:flame/flame.dart';
import 'package:flame/game.dart'; import 'package:flame/game.dart';
import 'package:flame/extensions/vector2.dart'; import 'package:flame/extensions/vector2.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
final Vector2 size = await Flame.util.initialDimensions(); final game = MyGame();
final game = MyGame(size);
runApp( runApp(
GameWidget( GameWidget(
game: game, game: game,
@ -18,10 +16,6 @@ void main() async {
} }
class MyGame extends BaseGame { class MyGame extends BaseGame {
MyGame(Vector2 screenSize) {
size = screenSize;
}
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
final r = Random(); final r = Random();

View File

@ -3,18 +3,16 @@ import 'dart:ui';
import 'package:flame/anchor.dart'; import 'package:flame/anchor.dart';
import 'package:flame/components/text_box_component.dart'; import 'package:flame/components/text_box_component.dart';
import 'package:flame/components/text_component.dart'; import 'package:flame/components/text_component.dart';
import 'package:flame/flame.dart';
import 'package:flame/game.dart'; import 'package:flame/game.dart';
import 'package:flame/palette.dart'; import 'package:flame/palette.dart';
import 'package:flame/text_config.dart'; import 'package:flame/text_config.dart';
import 'package:flame/extensions/vector2.dart'; import 'package:flame/extensions/vector2.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
void main() async { void main() {
final Vector2 size = await Flame.util.initialDimensions();
runApp( runApp(
GameWidget( GameWidget(
game: MyGame(size), game: MyGame(),
), ),
); );
} }
@ -54,8 +52,8 @@ class MyTextBox extends TextBoxComponent {
} }
class MyGame extends BaseGame { class MyGame extends BaseGame {
MyGame(Vector2 screenSize) { @override
size = screenSize; Future<void> onLoad() async {
add(TextComponent('Hello, Flame', config: regular) add(TextComponent('Hello, Flame', config: regular)
..anchor = Anchor.topCenter ..anchor = Anchor.topCenter
..x = size.x / 2 ..x = size.x / 2

View File

@ -10,6 +10,11 @@ class ExampleGame extends Game with TapDetector {
@override @override
void update(double dt) {} void update(double dt) {}
@override
Future<void> onLoad() async {
print('game loaded');
}
@override @override
void render(Canvas canvas) { void render(Canvas canvas) {
canvas.drawRect( canvas.drawRect(

View File

@ -31,10 +31,6 @@ class BaseGame extends Game with FPSCounter {
/// Components to be removed on the next update /// Components to be removed on the next update
final Set<Component> _removeLater = {}; final Set<Component> _removeLater = {};
/// Current game viewport size, updated every resize via the [resize] method hook
final Vector2 size = Vector2.zero();
set size(Vector2 size) => this.size.setFrom(size);
/// Camera position; every non-HUD component is translated so that the camera position is the top-left corner of the screen. /// Camera position; every non-HUD component is translated so that the camera position is the top-left corner of the screen.
Vector2 camera = Vector2.zero(); Vector2 camera = Vector2.zero();
@ -142,7 +138,7 @@ class BaseGame extends Game with FPSCounter {
@override @override
@mustCallSuper @mustCallSuper
void onResize(Vector2 size) { void onResize(Vector2 size) {
this.size.setFrom(size); super.onResize(size);
components.forEach((c) => c.onGameResize(size)); components.forEach((c) => c.onGameResize(size));
} }

View File

@ -23,6 +23,9 @@ abstract class Game {
final assets = AssetsCache(); final assets = AssetsCache();
BuildContext buildContext; BuildContext buildContext;
/// Current game viewport size, updated every resize via the [resize] method hook
final Vector2 size = Vector2.zero();
bool get isAttached => buildContext != null; bool get isAttached => buildContext != null;
/// Returns the game background color. /// Returns the game background color.
@ -40,8 +43,11 @@ abstract class Game {
/// This is the resize hook; every time the game widget is resized, this hook is called. /// This is the resize hook; every time the game widget is resized, this hook is called.
/// ///
/// The default implementation does nothing; override to use the hook. /// The default implementation just sets the new size on the size field
void onResize(Vector2 size) {} @mustCallSuper
void onResize(Vector2 size) {
this.size.setFrom(size);
}
/// This is the lifecycle state change hook; every time the game is resumed, paused or suspended, this is called. /// This is the lifecycle state change hook; every time the game is resumed, paused or suspended, this is called.
/// ///

View File

@ -6,6 +6,7 @@ import 'game.dart';
import '../gestures.dart'; import '../gestures.dart';
import '../components/mixins/dragable.dart'; import '../components/mixins/dragable.dart';
import '../components/mixins/tapable.dart'; import '../components/mixins/tapable.dart';
import '../extensions/size.dart';
import 'game_render_box.dart'; import 'game_render_box.dart';
typedef GameLoadingWidgetBuilder = Widget Function( typedef GameLoadingWidgetBuilder = Widget Function(
@ -94,11 +95,14 @@ class GameWidget<T extends Game> extends StatefulWidget {
class _GameWidgetState extends State<GameWidget> { class _GameWidgetState extends State<GameWidget> {
Set<String> activeOverlays = {}; Set<String> activeOverlays = {};
Future<void> _gameLoaderFuture;
Future<void> get _memoizedGameLoaderFuture =>
_gameLoaderFuture ?? (_gameLoaderFuture = widget.game.onLoad());
@override @override
void initState() { void initState() {
super.initState(); super.initState();
addOverlaysListener(widget.game); addOverlaysListener(widget.game);
loadingFuture = widget.game.onLoad();
} }
@override @override
@ -107,8 +111,10 @@ class _GameWidgetState extends State<GameWidget> {
if (oldWidget.game != widget.game) { if (oldWidget.game != widget.game) {
removeOverlaysListener(oldWidget.game); removeOverlaysListener(oldWidget.game);
addOverlaysListener(widget.game); addOverlaysListener(widget.game);
// Reset the loader future
_gameLoaderFuture = null;
} }
loadingFuture = widget.game.onLoad();
} }
@override @override
@ -137,9 +143,6 @@ class _GameWidgetState extends State<GameWidget> {
}); });
} }
// loading future
Future<void> loadingFuture;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Widget internalGameWidget = _GameRenderObjectWidget(widget.game); Widget internalGameWidget = _GameRenderObjectWidget(widget.game);
@ -177,21 +180,29 @@ class _GameWidgetState extends State<GameWidget> {
final stackedWidgets = [internalGameWidget]; final stackedWidgets = [internalGameWidget];
_addBackground(context, stackedWidgets); _addBackground(context, stackedWidgets);
_addOverlays(context, stackedWidgets); _addOverlays(context, stackedWidgets);
final textDir = widget.textDirection ??
Directionality.maybeOf(context) ??
TextDirection.ltr;
return Directionality( return Directionality(
textDirection: widget.textDirection ?? textDirection: textDir,
Directionality.maybeOf(context) ??
TextDirection.ltr,
child: Container( child: Container(
color: widget.game.backgroundColor(), color: widget.game.backgroundColor(),
child: FutureBuilder( child: LayoutBuilder(
future: loadingFuture, builder: (_, BoxConstraints constraints) {
builder: (_, snapshot) { widget.game.onResize(constraints.biggest.toVector2());
if (snapshot.connectionState == ConnectionState.done) { return FutureBuilder(
return Stack(children: stackedWidgets); future: _memoizedGameLoaderFuture,
} builder: (_, snapshot) {
return widget.loadingBuilder != null if (snapshot.connectionState == ConnectionState.done) {
? widget.loadingBuilder(context, snapshot.hasError) return Stack(children: stackedWidgets);
: Container(); }
return widget.loadingBuilder != null
? widget.loadingBuilder(context, snapshot.hasError)
: Container();
},
);
}, },
), ),
), ),