Skip to content

Commit

Permalink
game map improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
RafaelBarbosatec committed Apr 21, 2024
1 parent ee2f8ec commit 9bb0de1
Show file tree
Hide file tree
Showing 13 changed files with 75 additions and 44 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -86,3 +86,5 @@ example/macos/Pods/Pods.xcodeproj/xcuserdata/rafaelbarbosa.xcuserdatad/xcschemes
example/macos/Pods/Pods.xcodeproj/xcuserdata/rafaelbarbosa.xcuserdatad/xcschemes/xcschememanagement.plist
example/macos/Pods/Target Support Files/FlutterMacOS/FlutterMacOS.debug.xcconfig
example/macos/Pods/Target Support Files/FlutterMacOS/FlutterMacOS.release.xcconfig

.fvm
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# NEXT
- `GameMap` Improvements. Now you can access the layers

# 3.7.1
- Fix keyboard param. [#500](https://github.com/RafaelBarbosatec/bonfire/pull/500). Thanks [jakobodman123](https://github.com/jakobodman123)

Expand Down
3 changes: 2 additions & 1 deletion example/lib/shared/interface/knight_interface.dart
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ class KnightInterface extends GameInterface {
selectable: false,
onTapComponent: (selected) {
// _animateColorFilter();
gameRef.map.layers[0].visible = !gameRef.map.layers[0].visible;
gameRef.map.layers[0]
.add(OpacityEffect.fadeOut(EffectController(duration: 1)));
},
));
await add(TextInterfaceComponent(
Expand Down
2 changes: 1 addition & 1 deletion example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ packages:
path: ".."
relative: true
source: path
version: "3.6.2"
version: "3.7.1"
boolean_selector:
dependency: transitive
description:
Expand Down
2 changes: 1 addition & 1 deletion lib/bonfire.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export 'package:bonfire/joystick/joystick_directional.dart';
export 'package:bonfire/lighting/lighting.dart';
export 'package:bonfire/lighting/lighting_config.dart';
export 'package:bonfire/lighting/lighting_type.dart';
export 'package:bonfire/map/base/map_game.dart';
export 'package:bonfire/map/base/game_map.dart';
export 'package:bonfire/map/base/tile_component.dart';
export 'package:bonfire/map/base/tile.dart';
export 'package:bonfire/map/base/tile_with_collision.dart';
Expand Down
5 changes: 2 additions & 3 deletions lib/map/base/map_game.dart → lib/map/base/game_map.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ abstract class GameMap extends GameComponent {

Iterable<TileComponent> getRenderedTiles();

Future<void> updateLayers(List<TileLayerComponent> layers);

Vector2 getMapPosition();
Vector2 getMapSize();
void refreshMap();
Expand All @@ -26,8 +24,9 @@ abstract class GameMap extends GameComponent {
);
}

void removeLayer(String id);
void removeLayer(int id);
Future addLayer(TileLayerComponent layer);
Future<void> updateLayers(List<TileLayerComponent> layers);

@override
int get priority => LayerPriority.MAP;
Expand Down
9 changes: 9 additions & 0 deletions lib/map/base/tile_component.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:ui';

import 'package:bonfire/bonfire.dart';
import 'package:bonfire/util/controlled_update_animation.dart';
Expand Down Expand Up @@ -97,6 +98,14 @@ class TileComponent extends GameComponent with UseAssetsLoader {
}
}

@override
Paint get paint {
if (parent is HasPaint) {
return (parent as HasPaint).paint;
}
return super.paint;
}

@override
void update(double dt) {
super.update(dt);
Expand Down
26 changes: 13 additions & 13 deletions lib/map/base/tile_layer_component.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,18 @@ import 'package:bonfire/util/quadtree.dart' as tree;

class TileLayerComponent extends PositionComponent with HasPaint {
final int id;
final List<Tile> _tiles;
final String? name;
final String? layerClass;
final Map<String, dynamic>? properties;
List<Tile> _tiles;
bool _isVisible = true;
double _tileSize = 0.0;

Vector2? _lastGameSize;
Vector2? _lastScreenSize;

double get tileSize => _tileSize;
tree.QuadTree<Tile>? _quadTree;

double get left => (position.x * size.x);
double get right => (position.x * size.x) + size.x;
double get top => (position.y * size.y);
double get bottom => (position.y * size.y) + size.y;

bool get visible => _isVisible;

set visible(bool value) {
Expand Down Expand Up @@ -74,8 +68,7 @@ class TileLayerComponent extends PositionComponent with HasPaint {
Vector2 screenSize, {
bool force = false,
}) {
if (_lastGameSize == mapSize && !force) return;
_lastGameSize = mapSize.clone();
if (_lastScreenSize == screenSize && !force) return;
_lastScreenSize = screenSize.clone();
Vector2 treeSize = Vector2(
mapSize.x / tileSize,
Expand All @@ -102,10 +95,17 @@ class TileLayerComponent extends PositionComponent with HasPaint {
}

void updateTiles(List<Tile> tiles) {
_tiles;
_tiles = tiles;
removeAll(children);
_quadTree?.clear();
_updateSizeAndPosition();
if (_lastGameSize != null) {
_createQuadTree(_lastGameSize!, _lastScreenSize!, force: true);

for (var tile in _tiles) {
_quadTree?.insert(
tile,
Point(tile.x, tile.y),
id: tile.id,
);
}
refresh();
}
Expand Down Expand Up @@ -191,7 +191,7 @@ class TileLayerComponent extends PositionComponent with HasPaint {
}

Iterable<TileComponent> getRendered() {
return children.cast();
return children.query<TileComponent>();
}

factory TileLayerComponent.fromTileModel(LayerModel e) {
Expand Down
47 changes: 24 additions & 23 deletions lib/map/world_map.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ import 'dart:async';

import 'package:bonfire/bonfire.dart';
import 'package:bonfire/map/empty_map.dart';
import 'package:bonfire/util/extensions/position_component_ext.dart';
import 'package:bonfire/util/quadtree.dart' as tree;

class WorldMap extends GameMap {
Vector2 lastCamera = Vector2.zero();
Vector2 lastCameraWindow = Vector2.zero();
double lastMinorZoom = 1.0;
Vector2? lastSizeScreen;
bool _buildingTiles = false;
Expand All @@ -24,9 +25,7 @@ class WorldMap extends GameMap {
}) : super(
layers,
sizeToUpdate: tileSizeToUpdate,
) {
enabledCheckIsVisible = false;
}
);

@override
void update(double dt) {
Expand All @@ -39,11 +38,9 @@ class WorldMap extends GameMap {

void _searchTilesToRender() async {
final rectCamera = gameRef.camera.cameraRectWithSpacing;

for (var layer in layers) {
await layer.onMoveCamera(rectCamera);
}

_buildingTiles = false;
}

Expand Down Expand Up @@ -77,7 +74,7 @@ class WorldMap extends GameMap {
void _confMap(Vector2 sizeScreen, {bool calculateSize = false}) {
lastSizeScreen = sizeScreen;
if (calculateSize) {
lastCamera = Vector2.zero();
lastCameraWindow = Vector2.zero();
lastMinorZoom = gameRef.camera.zoom;
_calculatePositionAndSize();
for (var layer in layers) {
Expand All @@ -91,14 +88,6 @@ class WorldMap extends GameMap {
gameRef.camera.updateSpacingVisibleMap(sizeToUpdate * 1.5);
}

@override
Future<void> updateLayers(List<TileLayerComponent> layers) async {
this.layers = layers;
removeAll(children);
await addAll(this.layers);
_confMap(gameRef.size, calculateSize: true);
}

void _calculatePositionAndSize() {
if (layers.isNotEmpty) {
tileSize = layers.first.tileSize;
Expand Down Expand Up @@ -140,32 +129,38 @@ class WorldMap extends GameMap {
_confMap(gameRef.size, calculateSize: true);
await addAll(layers);
_searchTilesToRender();
updateLastCamera(null);
}

bool _checkNeedUpdateTiles() {
final camera = _getCameraTileUpdate();
if (lastCamera != camera || lastMinorZoom != gameRef.camera.zoom) {
updateLastCamera(camera);

final window = _getCameraWindowUpdate();
if (lastCameraWindow != window || lastMinorZoom != gameRef.camera.zoom) {
updateLastCamera(window);
return true;
}
return false;
}

void updateLastCamera(Vector2? camera) {
lastCamera = camera ?? _getCameraTileUpdate();
lastCameraWindow = camera ?? _getCameraWindowUpdate();
lastMinorZoom = gameRef.camera.zoom;
}

Vector2 _getCameraTileUpdate() {
Vector2 _getCameraWindowUpdate() {
final camera = gameRef.camera;
return Vector2(
(camera.position.x / (sizeToUpdate / camera.zoom)).floorToDouble(),
(camera.position.y / (sizeToUpdate / camera.zoom)).floorToDouble(),
);
}

@override
Future<void> updateLayers(List<TileLayerComponent> layers) async {
this.layers = layers;
removeAll(children);
await addAll(this.layers);
_confMap(gameRef.size, calculateSize: true);
}

@override
Future addLayer(TileLayerComponent layer) async {
await layer.loadAssets();
Expand All @@ -175,9 +170,15 @@ class WorldMap extends GameMap {
}

@override
void removeLayer(String id) {
void removeLayer(int id) {
layers.removeWhere((l) => l.id == id);
removeWhere(
(component) => component is TileLayerComponent && component.id == id,
);
_confMap(lastSizeScreen!, calculateSize: true);
refreshMap();
}

@override
bool get enabledCheckIsVisible => false;
}
2 changes: 1 addition & 1 deletion lib/util/extensions/extensions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ extension SpriteFutureExt on Future<Sprite> {
extension NullableExt<T> on T? {
FutureOr<void> let(FutureOr<void> Function(T i) call) {
if (this != null) {
call(this as T);
return call(this as T);
}
}
}
Expand Down
8 changes: 8 additions & 0 deletions lib/util/extensions/position_component_ext.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'package:bonfire/bonfire.dart';

extension PositionComponentExt on PositionComponent{
double get left => (position.x * size.x);
double get right => (position.x * size.x) + size.x;
double get top => (position.y * size.y);
double get bottom => (position.y * size.y) + size.y;
}
8 changes: 8 additions & 0 deletions lib/util/quadtree.dart
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,14 @@ class QuadTree<T> extends Rectangle<num> {
}
}

void clear() {
_items.clear();
for (var element in _children) {
element.clear();
}
_children.clear();
}

void remove(T item) {
if (_children.isEmpty) {
_items.removeWhere((i) => i.item == item);
Expand Down
2 changes: 1 addition & 1 deletion lib/widgets/bonfire_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import 'package:bonfire/forces/forces_2d.dart';
import 'package:bonfire/game_interface/game_interface.dart';
import 'package:bonfire/input/keyboard/keyboard_config.dart';
import 'package:bonfire/input/player_controller.dart';
import 'package:bonfire/map/base/map_game.dart';
import 'package:bonfire/map/base/game_map.dart';
import 'package:bonfire/player/player.dart';
import 'package:flutter/material.dart';

Expand Down

0 comments on commit 9bb0de1

Please sign in to comment.