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
122 | 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
Render.Kill;
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;
|