Trigger input resetting between state changes.

This commit is contained in:
Luigi Rosso
2021-04-22 10:51:29 -07:00
parent ff57f57781
commit f963b9a42e
6 changed files with 36 additions and 6 deletions

View File

@ -5,6 +5,7 @@ import 'package:rive/src/rive_core/runtime/exceptions/rive_format_error_exceptio
export 'package:rive/src/animation_list.dart';
export 'package:rive/src/state_machine_components.dart';
export 'package:rive/src/state_transition_conditions.dart';
export 'package:rive/src/state_transitions.dart';
export 'package:rive/src/container_children.dart';
export 'package:rive/src/runtime_artboard.dart';
export 'package:rive/src/generated/rive_core_context.dart';

View File

@ -5,8 +5,8 @@ import 'package:rive/src/generated/animation/layer_state_base.dart';
export 'package:rive/src/generated/animation/layer_state_base.dart';
abstract class LayerState extends LayerStateBase {
final Set<StateTransition> _transitions = {};
Iterable<StateTransition> get transitions => _transitions;
final StateTransitions _transitions = StateTransitions();
StateTransitions get transitions => _transitions;
@override
void onAdded() {}
@override

View File

@ -18,7 +18,6 @@ class TransitionTriggerCondition extends TransitionTriggerConditionBase {
}
var triggerInput = input as StateMachineTrigger;
if (triggerInput.triggered) {
triggerInput.reset();
return true;
}
return false;

View File

@ -1,5 +1,6 @@
import 'dart:collection';
import 'package:rive/src/core/core.dart';
import 'package:flutter/foundation.dart';
import 'package:rive/src/rive_core/animation/animation_state.dart';
import 'package:rive/src/rive_core/animation/layer_state.dart';
import 'package:rive/src/rive_core/animation/linear_animation_instance.dart';
@ -32,8 +33,8 @@ class LayerController {
_changeState(null);
}
bool apply(CoreContext core, double elapsedSeconds,
HashMap<int, dynamic> inputValues) {
bool apply(StateMachineController machineController, CoreContext core,
double elapsedSeconds, HashMap<int, dynamic> inputValues) {
if (_animationInstance != null) {
_animationInstance!.advance(elapsedSeconds);
}
@ -53,6 +54,7 @@ class LayerController {
}
for (int i = 0; updateState(inputValues); i++) {
if (i == 100) {
machineController.advanceInputs();
print('StateMachineController.apply exceeded max iterations.');
return false;
}
@ -167,11 +169,13 @@ class StateMachineController extends RiveAnimationController<CoreContext> {
super.dispose();
}
@protected
void advanceInputs() {}
@override
void apply(CoreContext core, double elapsedSeconds) {
bool keepGoing = false;
for (final layerController in layerControllers) {
if (layerController.apply(core, elapsedSeconds, inputValues)) {
if (layerController.apply(this, core, elapsedSeconds, inputValues)) {
keepGoing = true;
}
}

View File

@ -167,4 +167,11 @@ class StateMachineController extends core.StateMachineController {
input.advance();
}
}
@override
void advanceInputs() {
for (final input in _inputs) {
input.advance();
}
}
}

View File

@ -0,0 +1,19 @@
import 'dart:collection';
import 'package:rive/src/rive_core/animation/state_transition.dart';
class StateTransitions extends ListBase<StateTransition> {
final List<StateTransition?> _values = [];
List<StateTransition> get values => _values.cast<StateTransition>();
@override
int get length => _values.length;
@override
set length(int value) => _values.length = value;
@override
StateTransition operator [](int index) => _values[index]!;
@override
void operator []=(int index, StateTransition value) => _values[index] = value;
}