I try follow a single object but does not work, i read other examples and posts like as Camera doesn’t follow player in Flutter Flame but does not work in my code:
import 'package:flame/game.dart' show Vector2;
import 'package:flame/events.dart' show TapCallbacks, TapDownEvent;
import 'package:flame/camera.dart' show FixedResolutionViewport, CameraComponent;
import 'package:flame_forge2d/flame_forge2d.dart' show Forge2DGame;
import '../objects/ball.dart' show BallBody;
import '../objects/ground.dart' show GroundBody;
class PlayScreen extends Forge2DGame with TapCallbacks {
PlayScreen() :
super(
gravity: Vector2(0, 100),
camera: CameraComponent.withFixedResolution(width: 2400 / 2, height: 1080 / 2),
);
BallBody? _ballBody = null;
GroundBody? _groundBody = null;
CameraComponent? _cameraComponent = null;
@override
Future<void> onLoad() async {
super.onLoad();
/* // Add the camera
_cameraComponent = CameraComponent();
_cameraComponent!.viewport = FixedResolutionViewport(resolution: Vector2(size.x, size.y));
add(_cameraComponent!); */
// Create ground
_groundBody = GroundBody(
Vector2(0, size.y - 40), // Position XY
size.x,
40
);
add(_groundBody!);
// Create ball
_ballBody = BallBody(
Vector2((size.x / 2) - 20, (size.y / 2) - 20), // Position XY
20.0 // Radius size
);
add(_ballBody!);
// Camera follow the ball
camera.follow(_ballBody!);
}
@override
void onTapDown(TapDownEvent event) {
if(_ballBody != null)
_ballBody!.applyImpulse(Vector2(100, -200));
add(BallBody(event.localPosition, 20.0));
}
}
Where could be the problem of why the camera does not follow the ball after it appears and bounces?
The ball:
import 'package:flutter/material.dart' show Canvas, Offset;
import 'package:flame/game.dart' show Vector2;
import 'package:flame/palette.dart' show BasicPalette;
import 'package:flame_forge2d/flame_forge2d.dart' show BodyComponent, Body, BodyDef, FixtureDef, BodyType, CircleShape;
class BallBody extends BodyComponent {
final Vector2 position;
final double radius;
BallBody(this.position, this.radius);
@override
Body createBody() {
final shape = CircleShape()..radius = radius;
final fixtureDef = FixtureDef(shape)
..density = 5
..friction = .5
..restitution = .5;
final bodyDef = BodyDef()
..type = BodyType.dynamic
..position = position;
return world.createBody(bodyDef)..createFixture(fixtureDef);
}
void applyImpulse(Vector2 impulse) {
// body.applyForce(impulse);
// body.applyLinearImpulse(impulse);
body.linearVelocity = impulse;
}
@override
void renderCircle(Canvas canvas, Offset center, double radius) {
super.renderCircle(canvas, center, radius);
canvas.drawLine(center, center + Offset(0, radius), BasicPalette.blue.paint());
canvas.rotate(body.angle);
}
}