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
- Dragable mixin for components
- Fix update+render of component children
- Moving size to Game instead of BaseGame
## 1.0.0-rc2
- Improve IsometricTileMap and Spritesheet classes

View File

@ -1,7 +1,6 @@
import 'package:flame/game.dart';
import 'package:flame/gestures.dart';
import 'package:flutter/gestures.dart';
import 'package:flame/flame.dart';
import 'package:flame/extensions/vector2.dart';
import 'package:flame/sprite_animation.dart';
import 'package:flame/components/sprite_animation_component.dart';
@ -11,8 +10,7 @@ import 'dart:ui';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final Vector2 size = await Flame.util.initialDimensions();
final game = MyGame(size);
final game = MyGame();
runApp(
GameWidget(
game: game,
@ -81,8 +79,4 @@ class MyGame extends BaseGame with TapDetector {
void onTapDown(TapDownDetails evt) {
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/sprite_animation.dart';
import 'package:flame/extensions/vector2.dart';
@ -6,20 +5,14 @@ import 'package:flame/components/sprite_animation_component.dart';
import 'package:flutter/material.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final Vector2 size = await Flame.util.initialDimensions();
runApp(
GameWidget(
game: MyGame(size),
game: MyGame(),
),
);
}
class MyGame extends BaseGame {
MyGame(Vector2 screenSize) {
size = screenSize;
}
@override
Future<void> onLoad() async {
final image = await images.load('chopper.png');

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -31,10 +31,6 @@ class BaseGame extends Game with FPSCounter {
/// Components to be removed on the next update
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.
Vector2 camera = Vector2.zero();
@ -142,7 +138,7 @@ class BaseGame extends Game with FPSCounter {
@override
@mustCallSuper
void onResize(Vector2 size) {
this.size.setFrom(size);
super.onResize(size);
components.forEach((c) => c.onGameResize(size));
}

View File

@ -23,6 +23,9 @@ abstract class Game {
final assets = AssetsCache();
BuildContext buildContext;
/// Current game viewport size, updated every resize via the [resize] method hook
final Vector2 size = Vector2.zero();
bool get isAttached => buildContext != null;
/// 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.
///
/// The default implementation does nothing; override to use the hook.
void onResize(Vector2 size) {}
/// The default implementation just sets the new size on the size field
@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.
///

View File

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