mirror of
https://github.com/flame-engine/flame.git
synced 2025-11-01 19:12:31 +08:00
Moving size from BaseGame to Game
This commit is contained in:
@ -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
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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');
|
||||
|
||||
@ -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'));
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
|
||||
@ -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.
|
||||
///
|
||||
|
||||
@ -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();
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user