@@ -102,7 +102,13 @@ internal class Overlapper : CollisionObject
102102 private CircleCollider circleCollider ;
103103
104104 private int overlapCount = 0 ;
105- private readonly ColorRgba [ ] overlapColors = [ Colors . Light , Colors . Text , Colors . Cold , Colors . Warm , Colors . Highlight , Colors . Special , Colors . Special2 ] ;
105+ private readonly ColorRgba basicColor = Colors . Special ;
106+ private readonly ColorRgba overlapColor = Colors . Special2 ;
107+
108+ private const float contactStartedDuration = 0.5f ;
109+ private const float contactEndedDuration = 0.5f ;
110+ private float contactStartedTimer = 0f ;
111+ private float contactEndedTimer = 0f ;
106112
107113 public Overlapper ( Vector2 pos ) : base ( new Transform2D ( pos , 0f , new Size ( 150 , 0 ) , 1f ) )
108114 {
@@ -129,52 +135,57 @@ internal class Overlapper : CollisionObject
129135 }
130136
131137
132- protected override void Collision ( List < CollisionInformation > info )
138+ protected override void Collision ( CollisionInformation info )
133139 {
134-
135- foreach ( var colInfo in info )
140+ if ( info . Count > 0 && info . FirstContact )
136141 {
137- if ( colInfo . Count > 0 )
142+ contactStartedTimer = contactStartedDuration ;
143+ overlapCount ++ ;
144+ if ( info . Other is BoundaryWall wall )
138145 {
139- foreach ( var collision in colInfo )
140- {
141- if ( ! collision . FirstContact ) continue ;
142-
143- if ( colInfo . Other is BoundaryWall wall )
144- {
145- overlapCount ++ ;
146- Velocity = - ( Transform . Position ) . Normalize ( ) * Velocity . Length ( ) ;
147- }
148- else
149- {
150- overlapCount ++ ;
151- }
152- }
146+ Velocity = - ( Transform . Position ) . Normalize ( ) * Velocity . Length ( ) ;
153147 }
154148 }
155149 }
156150
157- protected override void CollisionEnded ( List < OverlapInformation > info )
151+ protected override void ContactEnded ( CollisionObject other )
158152 {
159- foreach ( var overlapInfo in info )
153+ contactEndedTimer = contactEndedDuration ;
154+ overlapCount -- ;
155+ }
156+
157+ public override void Update ( GameTime time , ScreenInfo game , ScreenInfo gameUi , ScreenInfo ui )
158+ {
159+ base . Update ( time , game , gameUi , ui ) ;
160+ if ( contactStartedTimer > 0 )
160161 {
161- foreach ( var overlap in overlapInfo )
162- {
163- overlapCount -- ;
164- }
162+ contactStartedTimer -= time . Delta ;
163+ if ( contactStartedTimer <= 0 ) contactStartedTimer = 0 ;
164+ }
165+ if ( contactEndedTimer > 0 )
166+ {
167+ contactEndedTimer -= time . Delta ;
168+ if ( contactEndedTimer <= 0 ) contactEndedTimer = 0 ;
165169 }
166170 }
167-
171+
168172 public override void DrawGame ( ScreenInfo game )
169173 {
170174 var c = circleCollider . GetCircleShape ( ) ;
171- var colorIndex = 0 ;
172- if ( overlapCount >= overlapColors . Length ) colorIndex = overlapColors . Length - 1 ;
173- else if ( overlapCount < 0 ) colorIndex = 0 ;
174- else colorIndex = overlapCount ;
175-
176- var color = overlapColors [ colorIndex ] ;
177- c . DrawLines ( 8f , color ) ;
175+
176+ //animated radius
177+ var contactStartedF = contactStartedTimer / contactStartedDuration ;
178+ contactStartedF = ShapeTween . CircOut ( contactStartedF ) ;
179+ var radius = ShapeMath . LerpFloat ( c . Radius , c . Radius * 1.5f , contactStartedF ) ;
180+ c = c . SetRadius ( radius ) ;
181+
182+ //animate thickness
183+ var contactEndedF = contactEndedTimer / contactEndedDuration ;
184+ contactEndedF = ShapeTween . BounceIn ( contactEndedF ) ;
185+ var thickness = ShapeMath . LerpFloat ( 8 , 32 , contactEndedF ) ;
186+
187+ var color = overlapCount > 0 ? overlapColor : basicColor ;
188+ c . DrawLines ( thickness , color ) ;
178189 }
179190
180191 public override bool HasLeftBounds ( Rect bounds ) => ! bounds . OverlapShape ( circleCollider . GetCircleShape ( ) ) ;
@@ -184,10 +195,6 @@ public override void DrawGame(ScreenInfo game)
184195 public override void DrawGameUI ( ScreenInfo gameUi )
185196 {
186197 }
187- public override void FixedUpdate ( GameTime fixedTime , ScreenInfo game , ScreenInfo gameUi , ScreenInfo ui )
188- {
189-
190- }
191198 }
192199
193200 internal class Ball : CollisionObject
@@ -212,22 +219,18 @@ internal class Ball : CollisionObject
212219 Layer = SpawnAreaLayers . ObjectFlag ;
213220 }
214221
215- protected override void Collision ( List < CollisionInformation > info )
222+ protected override void Collision ( CollisionInformation info )
216223 {
217224 CollisionPoint p = new ( ) ;
218- foreach ( var colInfo in info )
225+ if ( info . Count > 0 )
219226 {
220- if ( colInfo . Count > 0 )
227+ foreach ( var collision in info )
221228 {
222- foreach ( var collision in colInfo )
229+ if ( ! collision . FirstContact ) continue ;
230+ if ( collision . Points == null ) continue ;
231+ if ( collision . Validate ( out CollisionPoint combined ) )
223232 {
224- if ( ! collision . FirstContact ) continue ;
225- if ( collision . Points == null ) continue ;
226- if ( collision . Validate ( out CollisionPoint combined ) )
227- {
228- // var cp = collision.Points.GetAverageCollisionPoint();
229- if ( combined . Valid ) p = p . Average ( combined ) ;
230- }
233+ if ( combined . Valid ) p = p . Average ( combined ) ;
231234 }
232235 }
233236 }
@@ -319,24 +322,21 @@ public override void FixedUpdate(GameTime fixedTime, ScreenInfo game, ScreenInfo
319322 }
320323
321324
322- protected override void Collision ( List < CollisionInformation > info )
325+ protected override void Collision ( CollisionInformation info )
323326 {
324327 CollisionPoint p = new ( ) ;
325- foreach ( var colInfo in info )
328+ if ( info . Count > 0 )
326329 {
327- if ( colInfo . Count > 0 )
330+ foreach ( var collision in info )
328331 {
329- foreach ( var collision in colInfo )
332+ if ( ! collision . FirstContact ) continue ;
333+ if ( collision . Points == null ) continue ;
334+ if ( collision . Validate ( out var combined , out var closest ) )
330335 {
331- if ( ! collision . FirstContact ) continue ;
332- if ( collision . Points == null ) continue ;
333- if ( collision . Validate ( out var combined , out var closest ) )
334- {
335- Transform = Transform . SetPosition ( closest . Point ) ;
336- Velocity = new ( ) ;
337- Enabled = false ;
338- deadTimer = 2f ;
339- }
336+ Transform = Transform . SetPosition ( closest . Point ) ;
337+ Velocity = new ( ) ;
338+ Enabled = false ;
339+ deadTimer = 2f ;
340340 }
341341 }
342342 }
@@ -481,22 +481,19 @@ private void OnEnteredGameArea()
481481 }
482482
483483
484- protected override void Collision ( List < CollisionInformation > info )
484+ protected override void Collision ( CollisionInformation info )
485485 {
486486 CollisionPoint p = new ( ) ;
487- foreach ( var colInfo in info )
487+ if ( info . Count > 0 )
488488 {
489- if ( colInfo . Count > 0 )
489+ foreach ( var collision in info )
490490 {
491- foreach ( var collision in colInfo )
491+ if ( ! collision . FirstContact ) continue ;
492+ if ( collision . Points == null ) continue ;
493+ if ( collision . Validate ( out var combined , out var closest ) )
492494 {
493- if ( ! collision . FirstContact ) continue ;
494- if ( collision . Points == null ) continue ;
495- if ( collision . Validate ( out var combined , out var closest ) )
496- {
497- // var cp = collision.Points.GetAverageCollisionPoint();
498- if ( combined . Valid ) p = p . Average ( combined ) ;
499- }
495+ // var cp = collision.Points.GetAverageCollisionPoint();
496+ if ( combined . Valid ) p = p . Average ( combined ) ;
500497 }
501498 }
502499 }
@@ -573,22 +570,19 @@ internal class Bird : CollisionObject
573570 Layer = SpawnAreaLayers . ObjectFlag ;
574571 }
575572
576- protected override void Collision ( List < CollisionInformation > info )
573+ protected override void Collision ( CollisionInformation info )
577574 {
578575 CollisionPoint p = new ( ) ;
579- foreach ( var colInfo in info )
576+ if ( info . Count > 0 )
580577 {
581- if ( colInfo . Count > 0 )
578+ foreach ( var collision in info )
582579 {
583- foreach ( var collision in colInfo )
580+ if ( ! collision . FirstContact ) continue ;
581+ if ( collision . Points == null ) continue ;
582+ if ( collision . Validate ( out CollisionPoint combined ) )
584583 {
585- if ( ! collision . FirstContact ) continue ;
586- if ( collision . Points == null ) continue ;
587- if ( collision . Validate ( out CollisionPoint combined ) )
588- {
589- // var cp = collision.Points.GetAverageCollisionPoint();
590- if ( combined . Valid ) p = p . Average ( combined ) ;
591- }
584+ // var cp = collision.Points.GetAverageCollisionPoint();
585+ if ( combined . Valid ) p = p . Average ( combined ) ;
592586 }
593587 }
594588 }
0 commit comments