with Events.Corrals; use Events.Corrals;
with Events.Listeners; use Events.Listeners;
with Objects; use Objects;
with Processes; use Processes;
private with Ada.Containers.Doubly_Linked_Lists;
private with Ada.Containers.Ordered_Maps;
private with Ada.Real_Time;
private with Entities;
private with Events;
private with Events.Entities;
private with Events.World;
private with Physics.Bodies;
private with Physics.Clip_Maps;
package Physics.Managers is
type Physics_Manager is new Object and Process and Event_Listener with private;
type A_Physics is access all Physics_Manager'Class;
function Create_Physics( corral : not null A_Corral ) return A_Physics;
pragma Postcondition( Create_Physics'Result /= null );
function Friction_X( this : not null access Physics_Manager'Class ) return Float;
function Friction_Y( this : not null access Physics_Manager'Class ) return Float;
function Gravity( this : not null access Physics_Manager'Class ) return Float;
function Max_VX( this : not null access Physics_Manager'Class ) return Float;
function Max_VY( this : not null access Physics_Manager'Class ) return Float;
procedure Delete( this : in out A_Physics );
pragma Postcondition( this = null );
private
use Ada.Real_Time;
use Entities;
use Events;
use Events.Entities;
use Events.World;
use Physics.Bodies;
use Physics.Clip_Maps;
package Corpus_Map is new
Ada.Containers.Ordered_Maps( Entity_Id, A_Corpus, "<", "=" );
package Corpus_Lists is new
Ada.Containers.Doubly_Linked_Lists( A_Corpus, "=" );
type Physics_Manager is new Object and Process and Event_Listener with
record
corral : A_Corral := null;
map : A_Clip_Map := null;
corps : Corpus_Map.Map;
grav : Float := 0.0;
fricX,
fricY : Float := 0.0;
maxVX,
maxVY : Float := 0.0;
end record;
procedure Clear_Corps( this : not null access Physics_Manager'Class );
procedure Construct( this : access Physics_Manager;
corral : not null A_Corral );
procedure Delete( this : in out Physics_Manager );
function Find( this : not null access Physics_Manager'Class;
id : Entity_Id ) return A_Corpus;
function Get_Process_Name( this : access Physics_Manager ) return String;
pragma Postcondition( Get_Process_Name'Result'Length > 0 );
procedure Handle( this : not null access Physics_Manager'Class;
evt : not null A_Accelerate_Event );
procedure Handle( this : not null access Physics_Manager'Class;
evt : not null A_Entity_Created_Event );
procedure Handle( this : not null access Physics_Manager'Class;
evt : not null A_Entity_Deleted_Event );
procedure Handle( this : not null access Physics_Manager'Class;
evt : not null A_Move_Entity_Event );
procedure Handle( this : not null access Physics_Manager'Class;
evt : not null A_New_World_Event );
procedure Handle( this : not null access Physics_Manager'Class;
evt : not null A_Resize_Entity_Event );
procedure Handle( this : not null access Physics_Manager'Class;
evt : not null A_Set_Entity_Attribute_Event );
procedure Handle( this : not null access Physics_Manager'Class;
evt : not null A_Tile_Changed_Event );
procedure Handle( this : not null access Physics_Manager'Class;
evt : not null A_World_Property_Changed_Event );
procedure Handle_Event( this : access Physics_Manager;
evt : in out A_Event;
resp : out Response_Type );
pragma Precondition( evt /= null );
procedure Tick( this : access Physics_Manager; upTime, dt : Time_Span );
end Physics.Managers;