Skip to content

Commit

Permalink
create mixin MovePerCell
Browse files Browse the repository at this point in the history
  • Loading branch information
RafaelBarbosatec committed Nov 17, 2023
1 parent 89f07f7 commit e5be5b8
Show file tree
Hide file tree
Showing 3 changed files with 175 additions and 0 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
## Next
- Create mixin `MovePerCell`.

## 3.0.9
- adds new Pushable configurations. (`pushableFrom`,`pushPerCellEnabled`,`cellSize`,`pushPerCellDuration`,`pushPerCellCurve`)
- adds method `List<Vector2> getPathToPosition` in mixin `PathFinding`
Expand Down
1 change: 1 addition & 0 deletions lib/bonfire.dart
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ export 'package:bonfire/mixins/use_barlife.dart';
export 'package:bonfire/mixins/use_sprite.dart';
export 'package:bonfire/mixins/use_sprite_animation.dart';
export 'package:bonfire/mixins/vision.dart';
export 'package:bonfire/mixins/move_per_cell.dart';
export 'package:bonfire/npc/ally/ally.dart';
export 'package:bonfire/npc/enemy/enemy.dart';
export 'package:bonfire/npc/npc.dart';
Expand Down
171 changes: 171 additions & 0 deletions lib/mixins/move_per_cell.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
import 'package:bonfire/bonfire.dart';
import 'package:flutter/widgets.dart';

mixin MovePerCell on Movement {
bool _pushPerCellEnabled = false;
double _pushPerCellDuration = 0.5;
Curve _pushPerCellCurve = Curves.decelerate;
Vector2? _cellSize;
bool _perCellEnabled = true;
bool _perCellMoving = false;

void setupMovePerCell({
bool? enabled,
PushableFromEnum? pushableFrom,
bool? pushPerCellEnabled,
Vector2? cellSize,
double? pushPerCellDuration,
Curve? pushPerCellCurve,
}) {
_perCellEnabled = enabled ?? _perCellEnabled;
_pushPerCellEnabled = pushPerCellEnabled ?? _pushPerCellEnabled;
_cellSize = cellSize ?? _cellSize;
_pushPerCellDuration = pushPerCellDuration ?? _pushPerCellDuration;
_pushPerCellCurve = pushPerCellCurve ?? _pushPerCellCurve;
}

Vector2 get cellSize => _cellSize ?? size;

@override
void moveLeft({double? speed}) {
if (_perCellEnabled) {
if (_perCellMoving) return;
_perCellMoving = true;
add(
MoveEffect.by(
Vector2(-cellSize.x, 0),
EffectController(
duration: _pushPerCellDuration,
curve: _pushPerCellCurve,
),
onComplete: _perCeelMovecomplete,
),
);
} else {
super.moveLeft(speed: speed);
}
}

@override
void moveRight({double? speed}) {
if (_perCellEnabled) {
if (_perCellMoving) return;
_perCellMoving = true;
add(
MoveEffect.by(
Vector2(cellSize.x, 0),
EffectController(
duration: _pushPerCellDuration,
curve: _pushPerCellCurve,
),
onComplete: _perCeelMovecomplete,
),
);
} else {
super.moveRight(speed: speed);
}
}

@override
void moveDown({double? speed}) {
if (_perCellEnabled) {
if (_perCellMoving) return;
_perCellMoving = true;
add(
MoveEffect.by(
Vector2(0, cellSize.x),
EffectController(
duration: _pushPerCellDuration,
curve: _pushPerCellCurve,
),
onComplete: _perCeelMovecomplete,
),
);
} else {
super.moveDown(speed: speed);
}
}

@override
void moveUp({double? speed}) {
if (_perCellEnabled) {
if (_perCellMoving) return;
_perCellMoving = true;
add(
MoveEffect.by(
Vector2(0, -cellSize.x),
EffectController(
duration: _pushPerCellDuration,
curve: _pushPerCellCurve,
),
onComplete: _perCeelMovecomplete,
),
);
} else {
super.moveUp(speed: speed);
}
}

@override
void moveDownLeft({double? speed}) {
if (!_perCellEnabled) {
super.moveDownLeft(speed: speed);
} else {
stopMove();
}
}

@override
void moveDownRight({double? speed}) {
if (!_perCellEnabled) {
super.moveDownRight(speed: speed);
} else {
stopMove();
}
}

@override
void moveUpRight({double? speed}) {
if (!_perCellEnabled) {
super.moveUpRight(speed: speed);
} else {
stopMove();
}
}

@override
void moveUpLeft({double? speed}) {
if (!_perCellEnabled) {
super.moveUpLeft(speed: speed);
} else {
stopMove();
}
}

@override
void moveFromAngle(double angle, {double? speed}) {
if (_perCellEnabled) {
switch (BonfireUtil.getDirectionFromAngle(angle, directionSpace: 45)) {
case Direction.left:
moveLeft();
break;
case Direction.right:
moveRight();
break;
case Direction.up:
moveUp();
break;
case Direction.down:
moveDown();
break;
default:
}
} else {
super.moveFromAngle(angle, speed: speed);
}
}

void _perCeelMovecomplete() {
_perCellMoving = false;
}
}

0 comments on commit e5be5b8

Please sign in to comment.