From 03c94fe48c36c9a76994ecead3a31225c23d72f1 Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Sun, 19 Jan 2020 14:12:11 +0100 Subject: [PATCH] Add coins to game This adds a new asset, a new component and some new game mechanics. Coins will appear every one to two minutes and can be collected by tapping them. --- art/coin.svg | 146 +++++++++++++++++++++++++++++++++++++++ assets/images/coin.png | Bin 0 -> 3248 bytes lib/components/coin.dart | 75 ++++++++++++++++++++ lib/game.dart | 36 ++++++++++ pubspec.yaml | 1 + 5 files changed, 258 insertions(+) create mode 100644 art/coin.svg create mode 100644 assets/images/coin.png create mode 100644 lib/components/coin.dart diff --git a/art/coin.svg b/art/coin.svg new file mode 100644 index 0000000..cd20859 --- /dev/null +++ b/art/coin.svg @@ -0,0 +1,146 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/coin.png b/assets/images/coin.png new file mode 100644 index 0000000000000000000000000000000000000000..34c7bf8305b9faf7dab2e28e5e3af63bbf5c07a1 GIT binary patch literal 3248 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 1.0) { + flight = 1.0; + flying = false; + shouldDestroy = true; + } + + x = lerpDouble(position.x, target.x, Curves.easeIn.transform(flight)); + y = lerpDouble(position.y, target.y, Curves.easeInBack.transform(flight)); + } + } + + @override + bool destroy() => shouldDestroy; + + @override + int priority() => 25000; +} diff --git a/lib/game.dart b/lib/game.dart index dcb4474..c10e66d 100644 --- a/lib/game.dart +++ b/lib/game.dart @@ -9,6 +9,7 @@ import 'package:flutter/widgets.dart'; import 'package:vector_math/vector_math_64.dart'; import 'components/cat.dart'; +import 'components/coin.dart'; import 'components/tree.dart'; import 'localizations.dart'; @@ -30,6 +31,7 @@ class Cell { Tree tree; Cat cat; + Coin coin; Cell(this.x, this.y); } @@ -65,6 +67,7 @@ class ChristmasCats extends BaseGame with Tapable { bool gameOver = false; Timer nextCatTimer; + Timer coinTimer; Timer scoreTimer; List cells; List treeCells; @@ -98,6 +101,12 @@ class ChristmasCats extends BaseGame with Tapable { } } + Vector2 getCoinPosition(Cell cell) { + final x = marginLRB + (cell.x + 0.5) * cellWidth; + final y = marginTop + (cell.y + 0.5) * cellHeight; + return Vector2(x, y); + } + void updateCat(int oldCellIndex, Cat cat) { int newCellIndex; @@ -150,6 +159,26 @@ class ChristmasCats extends BaseGame with Tapable { nCats++; } + void createCoin() { + coinTimer = Timer(60.0 + random.nextInt(60), callback: () { + final cellIndex = emptyCells.pick(); + final cell = cells[cellIndex]; + final coin = Coin( + getCoinPosition(cell), + Vector2(size.width / 2, -cellHeight), + () { + cell.coin = null; + }, + ); + + add(coin); + cell.coin = coin; + + createCoin(); + }); + coinTimer.start(); + } + void reset() { paused = true; nCats = 0; @@ -208,6 +237,7 @@ class ChristmasCats extends BaseGame with Tapable { } createCat(); + createCoin(); for (final tree in trees) { add(tree); @@ -238,6 +268,7 @@ class ChristmasCats extends BaseGame with Tapable { void update(double t) { if (!paused) { nextCatTimer?.update(t); + coinTimer?.update(t); scoreTimer?.update(t); final List oldTimers = []; @@ -285,6 +316,11 @@ class ChristmasCats extends BaseGame with Tapable { } onScoreChanged(score); + } else if (cell?.coin != null) { + cell.coin.tap(); + if (cell.cat == null) { + emptyCells.add(cellIndex); + } } } } diff --git a/pubspec.yaml b/pubspec.yaml index 61764e1..f536a97 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -35,6 +35,7 @@ flutter: - assets/images/cat6s.png - assets/images/cat7r.png - assets/images/cat7s.png + - assets/images/coin.png - assets/images/tree1.png - assets/images/tree2.png - assets/images/tree3.png