Skip to content

Commit 1d7d377

Browse files
authored
Merge pull request #52 from DaveGreen-Games/contact-ended-system
Contact Ended System Overhaul
2 parents 86178e2 + 064ffbb commit 1d7d377

File tree

12 files changed

+675
-849
lines changed

12 files changed

+675
-849
lines changed

Examples/Scenes/ExampleScenes/EndlessSpaceCollision.cs

Lines changed: 38 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -483,23 +483,20 @@ public Bullet(Vector2 pos, Vector2 dir, BulletStats stats, ColorRgba color)
483483

484484
}
485485

486-
protected override void Collision(List<CollisionInformation> info)
486+
protected override void Collision(CollisionInformation info)
487487
{
488-
foreach (var i in info)
489-
{
490-
if (i.Count <= 0) continue;
488+
if (info.Count <= 0) return;
491489

492-
if (i.Other is AsteroidObstacle asteroid)
490+
if (info.Other is AsteroidObstacle asteroid)
491+
{
492+
foreach (var collision in info)
493493
{
494-
foreach (var collision in i)
495-
{
496-
if(!collision.FirstContact) continue;
497-
asteroid.Damage(Transform.Position, stats.Damage, new Vector2(0f));
498-
effectTimer = effectDuration;
499-
collider.Enabled = false;
500-
Velocity = new(0f);
501-
return;
502-
}
494+
if(!collision.FirstContact) continue;
495+
asteroid.Damage(Transform.Position, stats.Damage, new Vector2(0f));
496+
effectTimer = effectDuration;
497+
collider.Enabled = false;
498+
Velocity = new(0f);
499+
return;
503500
}
504501
}
505502
}
@@ -617,32 +614,28 @@ public Ship(Vector2 pos, float shipSize)
617614
Health = MaxHp;
618615
}
619616

620-
protected override void Collision(List<CollisionInformation> info)
617+
protected override void Collision(CollisionInformation info)
621618
{
622-
foreach (var i in info)
623-
{
624-
if(i.Count <= 0 || i.Other is not AsteroidObstacle a) continue;
625-
if(!i.Validate(out CollisionPoint combined)) continue;
619+
if(info.Count <= 0 || info.Other is not AsteroidObstacle a) return;
620+
if(!info.Validate(out CollisionPoint combined)) return;
626621

627-
a.Cut(GetCutShape());
622+
a.Cut(GetCutShape());
628623

629-
if (collisionStunTimer <= 0f)
630-
{
631-
Health--;
632-
if (Health <= 0)
633-
{
634-
collider.Enabled = false;
635-
Kill();
636-
OnKilled?.Invoke();
637-
}
638-
}
639-
if (combined.Valid)
624+
if (collisionStunTimer <= 0f)
625+
{
626+
Health--;
627+
if (Health <= 0)
640628
{
641-
Velocity = combined.Normal * 3500;
642-
collisionStunTimer = CollisionStunTime;
643-
collisionRotationDirection = Rng.Instance.RandDirF();
629+
collider.Enabled = false;
630+
Kill();
631+
OnKilled?.Invoke();
644632
}
645-
633+
}
634+
if (combined.Valid)
635+
{
636+
Velocity = combined.Normal * 3500;
637+
collisionStunTimer = CollisionStunTime;
638+
collisionRotationDirection = Rng.Instance.RandDirF();
646639
}
647640
}
648641

@@ -926,19 +919,15 @@ public void Damage(Vector2 pos, float amount, Vector2 force)
926919
}
927920
}
928921

929-
protected override void Collision(List<CollisionInformation> info)
922+
protected override void Collision(CollisionInformation info)
930923
{
931-
foreach (var i in info)
924+
if(info.Count <= 0) return;
925+
if(!info.Validate(out CollisionPoint combined)) return;
926+
foreach (var collision in info)
932927
{
933-
if(i.Count <= 0) continue;
934-
if(!i.Validate(out CollisionPoint combined)) continue;
935-
foreach (var collision in i)
936-
{
937-
if(collision.Points == null || collision.Points.Count <= 0 || !collision.FirstContact)continue;
928+
if(collision.Points == null || collision.Points.Count <= 0 || !collision.FirstContact)continue;
938929

939-
Velocity = Velocity.Reflect(combined.Normal);
940-
}
941-
930+
Velocity = Velocity.Reflect(combined.Normal);
942931
}
943932
}
944933
public void MoveTo(Vector2 newPosition)
@@ -1864,18 +1853,14 @@ public Destructor(Vector2 position, Vector2 direction, ColorRgba color)
18641853
Drag = 0f;
18651854
}
18661855

1867-
protected override void Collision(List<CollisionInformation> info)
1856+
protected override void Collision(CollisionInformation info)
18681857
{
18691858
if (info.Count <= 0) return;
1870-
foreach (var collisionInfo in info)
1859+
if (info.Other is AsteroidObstacle asteroid)
18711860
{
1872-
if(collisionInfo.Count <= 0) continue;
1873-
if (collisionInfo.Other is AsteroidObstacle asteroid)
1861+
if (info.FirstContact)
18741862
{
1875-
if (collisionInfo[0].FirstContact)
1876-
{
1877-
asteroid.Damage(Transform.Position, 10000000, Vector2.Zero);
1878-
}
1863+
asteroid.Damage(Transform.Position, 10000000, Vector2.Zero);
18791864
}
18801865
}
18811866

Examples/Scenes/ExampleScenes/GameObjectHandlerExample.cs

Lines changed: 77 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)