mirror of
https://github.com/flame-engine/flame.git
synced 2025-11-02 11:43:19 +08:00
Merge branch 'develop' into particles
This commit is contained in:
@ -1,4 +1,6 @@
|
||||
## [next]
|
||||
- Added default render function for Box2D ChainShape
|
||||
- Adding TimerComponent
|
||||
|
||||
## 0.17.0
|
||||
- Fixing FlareAnimation API to match convention
|
||||
|
||||
@ -1,22 +1,63 @@
|
||||
import 'package:flutter/gestures.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flame/flame.dart';
|
||||
import 'package:flame/game.dart';
|
||||
import 'package:flame/time.dart';
|
||||
import 'package:flame/text_config.dart';
|
||||
import 'package:flame/position.dart';
|
||||
import 'package:flame/gestures.dart';
|
||||
import 'package:flame/components/timer_component.dart';
|
||||
|
||||
void main() {
|
||||
final game = MyGame();
|
||||
runApp(game.widget);
|
||||
|
||||
Flame.util.addGestureRecognizer(TapGestureRecognizer()
|
||||
..onTapDown = (TapDownDetails evt) {
|
||||
game.countdown.start();
|
||||
});
|
||||
runApp(GameWidget());
|
||||
}
|
||||
|
||||
class MyGame extends Game {
|
||||
class GameWidget extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MaterialApp(routes: {
|
||||
'/': (BuildContext context) => Column(children: [
|
||||
RaisedButton(
|
||||
child: const Text("Game"),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pushNamed("/game");
|
||||
}),
|
||||
RaisedButton(
|
||||
child: const Text("BaseGame"),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pushNamed("/base_game");
|
||||
})
|
||||
]),
|
||||
'/game': (BuildContext context) => MyGame().widget,
|
||||
'/base_game': (BuildContext context) => MyBaseGame().widget
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
class RenderedTimeComponent extends TimerComponent {
|
||||
final TextConfig textConfig =
|
||||
const TextConfig(color: const Color(0xFFFFFFFF));
|
||||
|
||||
RenderedTimeComponent(Timer timer) : super(timer);
|
||||
|
||||
@override
|
||||
void render(Canvas canvas) {
|
||||
textConfig.render(
|
||||
canvas, "Elapsed time: ${timer.current}", Position(10, 150));
|
||||
}
|
||||
}
|
||||
|
||||
class MyBaseGame extends BaseGame with TapDetector, DoubleTapDetector {
|
||||
@override
|
||||
void onTapDown(_) {
|
||||
add(RenderedTimeComponent(Timer(1)..start()));
|
||||
}
|
||||
|
||||
@override
|
||||
void onDoubleTap() {
|
||||
add(RenderedTimeComponent(Timer(5)..start()));
|
||||
}
|
||||
}
|
||||
|
||||
class MyGame extends Game with TapDetector {
|
||||
final TextConfig textConfig =
|
||||
const TextConfig(color: const Color(0xFFFFFFFF));
|
||||
Timer countdown;
|
||||
@ -32,6 +73,11 @@ class MyGame extends Game {
|
||||
interval.start();
|
||||
}
|
||||
|
||||
@override
|
||||
void onTapDown(_) {
|
||||
countdown.start();
|
||||
}
|
||||
|
||||
@override
|
||||
void update(double dt) {
|
||||
countdown.update(dt);
|
||||
|
||||
21
doc/util.md
21
doc/util.md
@ -123,4 +123,25 @@ class MyGame extends Game {
|
||||
|
||||
```
|
||||
|
||||
Timer instances can also be used inside a `BaseGame` game by using the `TimerComponent` class.
|
||||
|
||||
__Timer Component__
|
||||
|
||||
```dart
|
||||
import 'package:flame/time.dart';
|
||||
import 'package:flame/components/timer_component.dart';
|
||||
import 'package:flame/game.dart';
|
||||
|
||||
class MyBaseGame extends BaseGame {
|
||||
MyBaseGame() {
|
||||
add(
|
||||
TimerComponent(
|
||||
Timer(10, repeat: true, callback: () {
|
||||
print("10 seconds elapsed");
|
||||
})
|
||||
..start()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@ -117,7 +117,7 @@ abstract class BodyComponent extends Component {
|
||||
fixture = fixture.getNext()) {
|
||||
switch (fixture.getType()) {
|
||||
case ShapeType.CHAIN:
|
||||
throw Exception('not implemented');
|
||||
_renderChain(canvas, fixture);
|
||||
break;
|
||||
case ShapeType.CIRCLE:
|
||||
_renderCircle(canvas, fixture);
|
||||
@ -134,6 +134,30 @@ abstract class BodyComponent extends Component {
|
||||
|
||||
Vector2 get center => body.worldCenter;
|
||||
|
||||
void _renderChain(Canvas canvas, Fixture fixture) {
|
||||
final ChainShape chainShape = fixture.getShape();
|
||||
final List<Vector2> vertices = Vec2Array().get(chainShape.getVertexCount());
|
||||
|
||||
for (int i = 0; i < chainShape.getVertexCount(); ++i) {
|
||||
body.getWorldPointToOut(chainShape.getVertex(i), vertices[i]);
|
||||
viewport.getWorldToScreen(vertices[i], vertices[i]);
|
||||
}
|
||||
|
||||
final List<Offset> points = [];
|
||||
for (int i = 0; i < chainShape.getVertexCount(); i++) {
|
||||
points.add(Offset(vertices[i].x, vertices[i].y));
|
||||
}
|
||||
|
||||
renderChain(canvas, points);
|
||||
}
|
||||
|
||||
void renderChain(Canvas canvas, List<Offset> points) {
|
||||
final Paint paint = Paint()
|
||||
..color = const Color.fromARGB(255, 255, 255, 255);
|
||||
final path = Path()..addPolygon(points, true);
|
||||
canvas.drawPath(path, paint);
|
||||
}
|
||||
|
||||
void _renderCircle(Canvas canvas, Fixture fixture) {
|
||||
final Vector2 center = Vector2.zero();
|
||||
final CircleShape circle = fixture.getShape();
|
||||
|
||||
19
lib/components/timer_component.dart
Normal file
19
lib/components/timer_component.dart
Normal file
@ -0,0 +1,19 @@
|
||||
import 'dart:ui';
|
||||
import './component.dart';
|
||||
import '../time.dart';
|
||||
|
||||
/// Simple component which wraps a [Timer] instance allowing it to be easily used inside a [BaseGame] game.
|
||||
class TimerComponent extends Component {
|
||||
Timer timer;
|
||||
|
||||
TimerComponent(this.timer);
|
||||
|
||||
@override
|
||||
void update(double dt) => timer.update(dt);
|
||||
|
||||
@override
|
||||
void render(Canvas canvas) {}
|
||||
|
||||
@override
|
||||
bool destroy() => timer.isFinished();
|
||||
}
|
||||
Reference in New Issue
Block a user