mirror of https://github.com/flutter/pinball.git
parent
24edc0118a
commit
39fea823e8
@ -0,0 +1,81 @@
|
||||
import 'package:flame_forge2d/flame_forge2d.dart';
|
||||
import 'package:pinball/game/game.dart';
|
||||
|
||||
enum RampType { all, jetpack, sparky }
|
||||
|
||||
extension RampTypeX on RampType {
|
||||
int get maskBits => _getRampMaskBits(this);
|
||||
|
||||
int _getRampMaskBits(RampType type) {
|
||||
switch (type) {
|
||||
case RampType.all:
|
||||
return Filter().maskBits;
|
||||
case RampType.jetpack:
|
||||
return 0x010;
|
||||
case RampType.sparky:
|
||||
return 0x0100;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
abstract class RampArea extends BodyComponent {
|
||||
RampArea({
|
||||
required Vector2 position,
|
||||
required int maskBits,
|
||||
}) : _position = position,
|
||||
_maskBits = maskBits;
|
||||
|
||||
final Vector2 _position;
|
||||
final int _maskBits;
|
||||
|
||||
int get maskBits => _maskBits;
|
||||
Shape get shape;
|
||||
|
||||
@override
|
||||
Body createBody() {
|
||||
final fixtureDef = FixtureDef(shape)..isSensor = true;
|
||||
|
||||
final bodyDef = BodyDef()
|
||||
..userData = this
|
||||
..position = _position
|
||||
..type = BodyType.static;
|
||||
|
||||
final body = world.createBody(bodyDef);
|
||||
body.createFixture(fixtureDef).filterData
|
||||
..categoryBits = Filter().maskBits
|
||||
..maskBits = Filter().maskBits;
|
||||
|
||||
return body;
|
||||
}
|
||||
}
|
||||
|
||||
abstract class RampAreaCallback<Area extends RampArea>
|
||||
extends ContactCallback<Ball, Area> {
|
||||
Set get ballsInside;
|
||||
|
||||
@override
|
||||
void begin(
|
||||
Ball ball,
|
||||
Area area,
|
||||
Contact _,
|
||||
) {
|
||||
if (!ballsInside.contains(ball)) {
|
||||
ball.body.fixtures.first
|
||||
..filterData.categoryBits = area.maskBits
|
||||
..filterData.maskBits = area.maskBits;
|
||||
ballsInside.add(ball);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void end(Ball ball, Area area, Contact ___) {
|
||||
int maskBits;
|
||||
if (ballsInside.contains(ball)) {
|
||||
ball.body.fixtures.first
|
||||
..filterData.categoryBits = RampType.all.maskBits
|
||||
..filterData.maskBits = RampType.all.maskBits;
|
||||
|
||||
ballsInside.remove(ball);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in new issue