unit Physics; interface uses Math, Math3D, Sons, Vars; const MAX_PLAYERS = 4; type TMarbles = class Items: array[1..MAX_PLAYERS] of TMarble; Count: integer; CollisionQueue: PCollisionQueue; constructor Create; procedure Update(Time: single); procedure RunCollisions; end; var Marbles: TMarbles; implementation // all TMarble definitions... // all TCollisionQueue definitions... constructor TMarbles.Create; begin Count := 0; CollisionQueue := nil; end; procedure TMarbles.Update(Time: single); var i,j: integer; begin with Self do begin for i:=1 to Count do begin for j:=1 to Count do begin if IsCollision(Items[i],Items[j]) then begin CollisionQueue.Add(i,j); end; end; end; CollisionQueue.MixUp(0); RunCollisions; for i:=1 to Count do Items[i].Update(Time); end; end; procedure TMarbles.RunCollisions; var p: PCollisionQueue; begin p := Self.CollisionQueue; while p<>nil do begin Self.Items[p.i].DoCollision(Self.Items[p.j],true); PlaySample(samp); end; end; end.