@@ -650,26 +650,28 @@ impl<T> Tweenable<T> for Sequence<T> {
650650
651651 fn tick (
652652 & mut self ,
653- mut delta : Duration ,
653+ delta : Duration ,
654654 target : & mut T ,
655655 entity : Entity ,
656656 event_writer : & mut EventWriter < TweenCompleted > ,
657657 ) -> TweenState {
658- self . time = ( self . time + delta) . min ( self . duration ) ;
659- while self . index < self . tweens . len ( ) {
658+ if self . index < self . tweens . len ( ) {
659+ let mut state = TweenState :: Active ;
660+ self . time = ( self . time + delta) . min ( self . duration ) ;
660661 let tween = & mut self . tweens [ self . index ] ;
661- let tween_remaining = tween. duration ( ) . mul_f32 ( 1.0 - tween. progress ( ) ) ;
662- if let TweenState :: Active = tween. tick ( delta, target, entity, event_writer) {
663- return TweenState :: Active ;
662+ let tween_state = tween. tick ( delta, target, entity, event_writer) ;
663+ if tween_state == TweenState :: Completed {
664+ tween. rewind ( ) ;
665+ self . index += 1 ;
666+ if self . index >= self . tweens . len ( ) {
667+ state = TweenState :: Completed ;
668+ self . times_completed = 1 ;
669+ }
664670 }
665-
666- tween. rewind ( ) ;
667- delta -= tween_remaining;
668- self . index += 1 ;
671+ state
672+ } else {
673+ TweenState :: Completed
669674 }
670-
671- self . times_completed = 1 ;
672- TweenState :: Completed
673675 }
674676
675677 fn times_completed ( & self ) -> u32 {
@@ -1263,45 +1265,6 @@ mod tests {
12631265 }
12641266 }
12651267
1266- /// Test crossing tween boundaries in one tick.
1267- #[ test]
1268- fn seq_tick_boundaries ( ) {
1269- let mut seq = Sequence :: new ( ( 0 ..3 ) . map ( |i| {
1270- Tween :: new (
1271- EaseMethod :: Linear ,
1272- TweeningType :: Once ,
1273- Duration :: from_secs ( 1 ) ,
1274- TransformPositionLens {
1275- start : Vec3 :: splat ( i as f32 ) ,
1276- end : Vec3 :: splat ( ( i + 1 ) as f32 ) ,
1277- } ,
1278- )
1279- } ) ) ;
1280- let mut transform = Transform :: default ( ) ;
1281-
1282- // Dummy world and event writer
1283- let mut world = World :: new ( ) ;
1284- world. insert_resource ( Events :: < TweenCompleted > :: default ( ) ) ;
1285- let mut system_state: SystemState < EventWriter < TweenCompleted > > =
1286- SystemState :: new ( & mut world) ;
1287- let mut event_writer = system_state. get_mut ( & mut world) ;
1288-
1289- // Tick halfway through the first tween, then in one tick:
1290- // - Finish the first tween
1291- // - Start and finish the second tween
1292- // - Start the third tween
1293- for delta in [ 0.5 , 2.0 ] {
1294- seq. tick (
1295- Duration :: from_secs_f32 ( delta) ,
1296- & mut transform,
1297- Entity :: from_raw ( 0 ) ,
1298- & mut event_writer,
1299- ) ;
1300- }
1301- assert_eq ! ( seq. index( ) , 2 ) ;
1302- assert ! ( transform. translation. abs_diff_eq( Vec3 :: splat( 2.5 ) , 1e-5 ) ) ;
1303- }
1304-
13051268 /// Sequence::new() and various Sequence-specific methods
13061269 #[ test]
13071270 fn seq_iter ( ) {
0 commit comments