Skip to content
This repository has been archived by the owner on Mar 6, 2024. It is now read-only.

Commit

Permalink
feat: hazard collision behaviors
Browse files Browse the repository at this point in the history
  • Loading branch information
marcossevilla committed Oct 25, 2023
1 parent 8537aac commit 9b98f45
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 25 deletions.
30 changes: 29 additions & 1 deletion lib/game/components/item.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,40 @@ import 'package:flame/components.dart';
import 'package:flame_tiled/flame_tiled.dart';
import 'package:leap/leap.dart';

enum ItemType {
egg,
wings,
feather,
goldenFeather;

static ItemType fromGid(int gid) {
return switch (gid) {
740 => ItemType.egg,
741 => ItemType.feather,
742 => ItemType.goldenFeather,
743 => ItemType.wings,
_ => throw Exception('Invalid item gid: $gid'),
};
}

int get points {
return switch (this) {
ItemType.egg => 1000,
ItemType.feather => 10,
ItemType.goldenFeather => 0,
ItemType.wings => 0,
};
}
}

class Item extends PhysicalEntity<DashRunGame> {
Item({
required this.sprite,
required this.tiledObject,
}) : super(static: true, collisionType: CollisionType.standard);
}) : type = ItemType.fromGid(tiledObject.gid!),
super(static: true, collisionType: CollisionType.standard);

final ItemType type;
late final Sprite sprite;
late final TiledObject tiledObject;

Expand Down
18 changes: 16 additions & 2 deletions lib/game/components/player.dart
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,11 @@ class Player extends JumperCharacter<DashRunGame> {
super.health = initialHealth,
});

static const initialHealth = 3;
static const initialHealth = 1;

final Vector2 levelSize;
final Vector2 cameraViewport;
final List<Item> items = [];
late final Vector2 spawn;
late final SimpleCombinedInput input;
late final PlayerCameraAnchor cameraAnchor;
Expand Down Expand Up @@ -115,17 +116,30 @@ class Player extends JumperCharacter<DashRunGame> {

if (isDead) {
walking = false;
health = initialHealth;
game.gameOver();
}

if (collisionInfo.downCollision?.isHazard ?? false) {
if (items.isEmpty) game.gameOver();
items.removeLast().removeFromParent();
}

final collisions = collisionInfo.otherCollisions ?? const [];

if (collisions.isEmpty) return;

for (final collision in collisions) {
if (collision is Item) {
switch (collision.type) {
case ItemType.egg:
case ItemType.feather:
game.score += collision.type.points;
case ItemType.goldenFeather:
case ItemType.wings:
items.add(collision);
}
collision.removeFromParent();
game.score++;
}

if (collision is Enemy) {
Expand Down
4 changes: 3 additions & 1 deletion lib/game/components/score_label.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ class ScoreLabel extends TextComponent with HasGameRef<DashRunGame> {
void update(double dt) {
super.update(dt);

_current = '${gameRef.score} - 💙 ${gameRef.player.health}';
_current = '${gameRef.score} '
'💙 ${gameRef.player.health} '
'🚀 ${gameRef.player.items.length}';
text = _current;
}
}
4 changes: 2 additions & 2 deletions lib/game/components/sprite_object_group_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ typedef SpriteObjectGroupComponentBuilder = Component Function({
/// A component that given a tileset and object group, creates its components.
class SpriteObjectGroupBuilder extends Component with HasGameRef<DashRunGame> {
SpriteObjectGroupBuilder({
required this.tileset,
required this.tileLayerName,
required this.tilesetPath,
required this.tileset,
required this.componentBuilder,
});

final Tileset tileset;
final String tileLayerName;
final String tilesetPath;
final Tileset tileset;
final SpriteObjectGroupComponentBuilder componentBuilder;

@override
Expand Down
54 changes: 35 additions & 19 deletions lib/game/dash_run_game.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:dash_run/game/game.dart';
import 'package:flame/cache.dart';
import 'package:flame/components.dart';
import 'package:flame/events.dart';
import 'package:flame_tiled/flame_tiled.dart';
import 'package:flutter/material.dart';
import 'package:leap/leap.dart';

Expand All @@ -18,9 +19,25 @@ class DashRunGame extends LeapGame

late final Player player;
late final SimpleCombinedInput input;
late final SpriteObjectGroupBuilder items;
late final ObjectGroupProximityBuilder enemies;

int score = 0;

List<Tileset> get tilesets => leapMap.tiledMap.tileMap.map.tilesets;

Tileset get itemsTileset {
return tilesets.firstWhere(
(tileset) => tileset.name == 'tile_items_v2',
);
}

Tileset get enemiesTileset {
return tilesets.firstWhere(
(tileset) => tileset.name == 'tile_enemies_v2',
);
}

@override
Future<void> onLoad() async {
await super.onLoad();
Expand Down Expand Up @@ -51,24 +68,14 @@ class DashRunGame extends LeapGame
);
world.add(player);

final tilesets = leapMap.tiledMap.tileMap.map.tilesets;

final itemsTileset = tilesets.firstWhere(
(tileset) => tileset.name == 'tile_items_v2',
);

final enemiesTileset = tilesets.firstWhere(
(tileset) => tileset.name == 'tile_enemies_v2',
);

final items = SpriteObjectGroupBuilder(
tileset: itemsTileset,
tileLayerName: 'items',
items = SpriteObjectGroupBuilder(
tilesetPath: 'objects/tile_items_v2.png',
tileLayerName: 'items',
tileset: itemsTileset,
componentBuilder: Item.new,
);

final enemies = ObjectGroupProximityBuilder(
enemies = ObjectGroupProximityBuilder(
proximity: _cameraViewport.x * 1.5,
tilesetPath: 'objects/tile_enemies_v2.png',
tileLayerName: 'enemies',
Expand All @@ -83,15 +90,24 @@ class DashRunGame extends LeapGame
void gameOver() {
score = 0;
world.firstChild<Player>()?.removeFromParent();
world.remove(items);

Future<void>.delayed(
const Duration(seconds: 1),
() => world.add(
Player(
levelSize: leapMap.tiledMap.size.clone(),
cameraViewport: _cameraViewport,
() => world
..add(
Player(
levelSize: leapMap.tiledMap.size.clone(),
cameraViewport: _cameraViewport,
)..add(
SpriteObjectGroupBuilder(
tilesetPath: 'objects/tile_items_v2.png',
tileLayerName: 'items',
tileset: itemsTileset,
componentBuilder: Item.new,
),
),
),
),
);
}

Expand Down
3 changes: 3 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import 'package:dash_run/app/app.dart';
import 'package:dash_run/bootstrap.dart';
import 'package:flutter/widgets.dart';

void main() {
WidgetsFlutterBinding.ensureInitialized();

bootstrap(() => const App());
}
3 changes: 3 additions & 0 deletions lib/main_tester.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import 'package:dash_run/app/app.dart';
import 'package:dash_run/bootstrap.dart';
import 'package:flutter/widgets.dart';

void main() {
WidgetsFlutterBinding.ensureInitialized();

bootstrap(() => const App(isTesting: true));
}

0 comments on commit 9b98f45

Please sign in to comment.