geste_1.1.0_55da4926/examples/platformer/src/game.adb

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
with Ada.Real_Time;

with Render;
with Keyboard;

with Levels;
with Player;

with GESTE;
with GESTE.Text;
with GESTE_Config;
with GESTE_Fonts.FreeMono5pt7b;

package body Game is

   package RT renames Ada.Real_Time;
   use type RT.Time;
   use type RT.Time_Span;

   Text : aliased GESTE.Text.Instance
     (GESTE_Fonts.FreeMono5pt7b.Font,
      15, 1,
      Render.Black,
      GESTE_Config.Transparent);

   Frame_Counter   : Natural := 0;
   Next_FPS_Update : RT.Time := RT.Clock + RT.Seconds (1);

   Period : constant RT.Time_Span := RT.Seconds (1) / 60;
   Next_Release : RT.Time := RT.Clock + Period;

   Lvl : Levels.Level_Id := Levels.Lvl_1;

   ---------------
   -- Game_Loop --
   ---------------

   procedure Game_Loop is
   begin
      loop
         if Player.Position.X > 320 - 3 then
            case Lvl is
               when Levels.Lvl_1 =>
                  Levels.Leave (Levels.Lvl_1);
                  Levels.Enter (Levels.Lvl_2);
                  Lvl := Levels.Lvl_2;
                  Player.Move ((3, 125));
               when Levels.Lvl_2 =>
                  Levels.Leave (Levels.Lvl_2);
                  Levels.Enter (Levels.Lvl_3);
                  Lvl := Levels.Lvl_3;
                  Player.Move ((3, 183));
               when Levels.Lvl_3 =>
                  Levels.Leave (Levels.Lvl_3);
                  Levels.Enter (Levels.Lvl_1);
                  Lvl := Levels.Lvl_1;
                  Player.Move ((3, 142));
            end case;
         elsif Player.Position.X < 2 then
            case Lvl is
               when Levels.Lvl_1 =>
                  Levels.Leave (Levels.Lvl_1);
                  Levels.Enter (Levels.Lvl_3);
                  Lvl := Levels.Lvl_3;
                  Player.Move ((320 - 4, 183));
               when Levels.Lvl_2 =>
                  Levels.Leave (Levels.Lvl_2);
                  Levels.Enter (Levels.Lvl_1);
                  Lvl := Levels.Lvl_1;
                  Player.Move ((320 - 4, 120));
               when Levels.Lvl_3 =>
                  Levels.Leave (Levels.Lvl_3);
                  Levels.Enter (Levels.Lvl_2);
                  Lvl := Levels.Lvl_2;
                  Player.Move ((320 - 4, 25));
            end case;
         end if;

         Keyboard.Update;
         if Keyboard.Pressed (Keyboard.Up) then
            Player.Jump;
         end if;
         if Keyboard.Pressed (Keyboard.Left) then
            Player.Move_Left;
         end if;
         if Keyboard.Pressed (Keyboard.Right) then
            Player.Move_Right;
         end if;
         if Keyboard.Pressed (Keyboard.Esc) then
            return;
         end if;

         Player.Update;

         Frame_Counter := Frame_Counter + 1;

         if Next_FPS_Update <= RT.Clock then
            Next_FPS_Update := RT.Clock + RT.Seconds (1);

            Text.Clear;
            Text.Cursor (1, 1);
            Text.Put ("FPS:" & Frame_Counter'Img);
            Frame_Counter := 0;
         end if;

         Render.Render_Dirty (Render.Dark_Cyan);

         delay until Next_Release;
         Next_Release := RT.Clock + Period;
      end loop;
   end Game_Loop;

begin
   Levels.Enter (Levels.Lvl_1);
   Player.Move ((3, 142));

   Text.Move ((0, 0));
   GESTE.Add (Text'Access, 10);
   Render.Render_All (Render.Dark_Cyan);

end Game;