mirror of
https://github.com/rive-app/rive-flutter.git
synced 2025-06-29 19:28:32 +08:00
Trigger input resetting between state changes.
This commit is contained in:
@ -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/animation_list.dart';
|
||||||
export 'package:rive/src/state_machine_components.dart';
|
export 'package:rive/src/state_machine_components.dart';
|
||||||
export 'package:rive/src/state_transition_conditions.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/container_children.dart';
|
||||||
export 'package:rive/src/runtime_artboard.dart';
|
export 'package:rive/src/runtime_artboard.dart';
|
||||||
export 'package:rive/src/generated/rive_core_context.dart';
|
export 'package:rive/src/generated/rive_core_context.dart';
|
||||||
|
@ -5,8 +5,8 @@ import 'package:rive/src/generated/animation/layer_state_base.dart';
|
|||||||
export 'package:rive/src/generated/animation/layer_state_base.dart';
|
export 'package:rive/src/generated/animation/layer_state_base.dart';
|
||||||
|
|
||||||
abstract class LayerState extends LayerStateBase {
|
abstract class LayerState extends LayerStateBase {
|
||||||
final Set<StateTransition> _transitions = {};
|
final StateTransitions _transitions = StateTransitions();
|
||||||
Iterable<StateTransition> get transitions => _transitions;
|
StateTransitions get transitions => _transitions;
|
||||||
@override
|
@override
|
||||||
void onAdded() {}
|
void onAdded() {}
|
||||||
@override
|
@override
|
||||||
|
@ -18,7 +18,6 @@ class TransitionTriggerCondition extends TransitionTriggerConditionBase {
|
|||||||
}
|
}
|
||||||
var triggerInput = input as StateMachineTrigger;
|
var triggerInput = input as StateMachineTrigger;
|
||||||
if (triggerInput.triggered) {
|
if (triggerInput.triggered) {
|
||||||
triggerInput.reset();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import 'dart:collection';
|
import 'dart:collection';
|
||||||
import 'package:rive/src/core/core.dart';
|
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/animation_state.dart';
|
||||||
import 'package:rive/src/rive_core/animation/layer_state.dart';
|
import 'package:rive/src/rive_core/animation/layer_state.dart';
|
||||||
import 'package:rive/src/rive_core/animation/linear_animation_instance.dart';
|
import 'package:rive/src/rive_core/animation/linear_animation_instance.dart';
|
||||||
@ -32,8 +33,8 @@ class LayerController {
|
|||||||
_changeState(null);
|
_changeState(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool apply(CoreContext core, double elapsedSeconds,
|
bool apply(StateMachineController machineController, CoreContext core,
|
||||||
HashMap<int, dynamic> inputValues) {
|
double elapsedSeconds, HashMap<int, dynamic> inputValues) {
|
||||||
if (_animationInstance != null) {
|
if (_animationInstance != null) {
|
||||||
_animationInstance!.advance(elapsedSeconds);
|
_animationInstance!.advance(elapsedSeconds);
|
||||||
}
|
}
|
||||||
@ -53,6 +54,7 @@ class LayerController {
|
|||||||
}
|
}
|
||||||
for (int i = 0; updateState(inputValues); i++) {
|
for (int i = 0; updateState(inputValues); i++) {
|
||||||
if (i == 100) {
|
if (i == 100) {
|
||||||
|
machineController.advanceInputs();
|
||||||
print('StateMachineController.apply exceeded max iterations.');
|
print('StateMachineController.apply exceeded max iterations.');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -167,11 +169,13 @@ class StateMachineController extends RiveAnimationController<CoreContext> {
|
|||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@protected
|
||||||
|
void advanceInputs() {}
|
||||||
@override
|
@override
|
||||||
void apply(CoreContext core, double elapsedSeconds) {
|
void apply(CoreContext core, double elapsedSeconds) {
|
||||||
bool keepGoing = false;
|
bool keepGoing = false;
|
||||||
for (final layerController in layerControllers) {
|
for (final layerController in layerControllers) {
|
||||||
if (layerController.apply(core, elapsedSeconds, inputValues)) {
|
if (layerController.apply(this, core, elapsedSeconds, inputValues)) {
|
||||||
keepGoing = true;
|
keepGoing = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -167,4 +167,11 @@ class StateMachineController extends core.StateMachineController {
|
|||||||
input.advance();
|
input.advance();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void advanceInputs() {
|
||||||
|
for (final input in _inputs) {
|
||||||
|
input.advance();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
19
lib/src/state_transitions.dart
Normal file
19
lib/src/state_transitions.dart
Normal 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;
|
||||||
|
}
|
Reference in New Issue
Block a user