mirror of
https://github.com/flame-engine/flame.git
synced 2025-11-03 20:36: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
|
- 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
|
||||||
|
|||||||
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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');
|
||||||
|
|||||||
@ -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'));
|
||||||
|
|||||||
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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.
|
||||||
///
|
///
|
||||||
|
|||||||
@ -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();
|
||||||
|
},
|
||||||
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user