Skip to content

Commit

Permalink
fix: World component can now be queried with componentsAtPoint (#1739)
Browse files Browse the repository at this point in the history
The componentsAtPoint function allows us to find a component located at a specific position. Usually it is applied to the top-level Game, but there are instances when it could also be useful to apply this function to the World component. This PR enables such functionality.
  • Loading branch information
st-pasha authored Jun 19, 2022
1 parent 82e4be9 commit f750d70
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 15 deletions.
2 changes: 1 addition & 1 deletion packages/flame/lib/src/experimental/camera_component.dart
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ class CameraComponent extends Component {
if (viewport.containsLocalPoint(viewportPoint)) {
currentCameras.add(this);
final worldPoint = viewfinder.transform.globalToLocal(viewportPoint);
yield* world.componentsAtPointFromCamera(worldPoint, nestedPoints);
yield* world.componentsAtPoint(worldPoint, nestedPoints);
yield* viewfinder.componentsAtPoint(worldPoint, nestedPoints);
currentCameras.removeLast();
}
Expand Down
19 changes: 5 additions & 14 deletions packages/flame/lib/src/experimental/world.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:ui';

import 'package:flame/src/components/component.dart';
import 'package:flame/src/components/mixins/coordinate_transform.dart';
import 'package:flame/src/experimental/camera_component.dart';
import 'package:meta/meta.dart';
import 'package:vector_math/vector_math_64.dart';
Expand All @@ -10,7 +11,7 @@ import 'package:vector_math/vector_math_64.dart';
/// The primary feature of this component is that it disables regular rendering,
/// and allows itself to be rendered through a [CameraComponent] only. The
/// updates proceed through the world tree normally.
class World extends Component {
class World extends Component implements CoordinateTransform {
@override
void renderTree(Canvas canvas) {}

Expand All @@ -25,18 +26,8 @@ class World extends Component {
bool containsLocalPoint(Vector2 point) => true;

@override
Iterable<Component> componentsAtPoint(
Vector2 point, [
List<Vector2>? nestedPoints,
]) {
return const Iterable.empty();
}
Vector2? localToParent(Vector2 point) => null;

@internal
Iterable<Component> componentsAtPointFromCamera(
Vector2 point,
List<Vector2>? nestedPoints,
) {
return super.componentsAtPoint(point, nestedPoints);
}
@override
Vector2? parentToLocal(Vector2 point) => null;
}
11 changes: 11 additions & 0 deletions packages/flame/test/experimental/camera_component_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,17 @@ void main() {
expect(it.current, game);
expect(nested, [Vector2(400, 300)]);
expect(it.moveNext(), false);

// Check that `componentsAtPoint` is usable with non-top-level components
// also.
expect(
world.componentsAtPoint(Vector2(100, 100)).toList(),
[component, world],
);
expect(
component.componentsAtPoint(Vector2(100, 50)).toList(),
[component],
);
});
});
}

0 comments on commit f750d70

Please sign in to comment.