Merge branch 'develop' into particles

This commit is contained in:
Ivan Cherepanov
2019-12-01 17:17:12 +03:00
5 changed files with 123 additions and 11 deletions

View File

@ -1,4 +1,6 @@
## [next]
- Added default render function for Box2D ChainShape
- Adding TimerComponent
## 0.17.0
- Fixing FlareAnimation API to match convention

View File

@ -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);

View File

@ -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()
)
);
}
}
```

View File

@ -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();

View 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();
}