-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.lpr
150 lines (106 loc) · 3.77 KB
/
main.lpr
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
program main;
uses SDL2, SDL2_image, drawunit, sysutils, playerunit, hudunit, physiqueunit, enemiesunit, cameraunit;
var
window: PSDL_Window;
renderer: PSDL_Renderer;
Running: Boolean = True;
sdlEvent: PSDL_Event;
plate: Plateau;
p: Player;
nextTime, starting_tick : Uint32;
updateTimerId : TSDL_TimerID;
i, j : Integer;
function timeLeft(): Uint32;
var now : Uint32;
begin
now := SDL_GetTicks;
if(nextTime <= now) then
timeLeft := 0
else
timeLeft := nextTime - now;
end;
function updateTimer(intervalle: Uint32): Uint32;
begin
if not p.isOnExit then
if (plate.timeLeft > 0) then
plate.timeLeft -= 1;
updateTimer := intervalle;
end;
begin
//initilization of video subsystem
if SDL_Init(SDL_INIT_VIDEO or SDL_INIT_TIMER) < 0 then Halt;
// set-up window & renderer
window := SDL_CreateWindow('Boulder Dash', 100, 100, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);
SDL_SetWindowIcon(window, SDL_LoadBMP('images/icon.bmp'));
renderer := SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC or SDL_RENDERER_ACCELERATED);
if window = nil then Halt;
if renderer = nil then Halt;
// initialize the plateau & player
initializePlateau(renderer, plate, 1);
initializePlayer(renderer, p, plate);
initCamera(PLATEAU_WIDTH, PLATEAU_HEIGHT);
initializeHUD(renderer);
// update timer every second
updateTimerId := SDL_AddTimer(1000, TSDL_TimerCallback(@updateTimer), nil);
// program loop
new(sdlEvent);
nextTime := SDL_GetTicks() + TICK_INTERVAL;
while Running do
begin
starting_tick := SDL_GetTicks();
while SDL_PollEvent(sdlEvent) = 1 do
case sdlEvent^.type_ of
SDL_WINDOWEVENT:
case sdlEvent^.window.event of
SDL_WINDOWEVENT_CLOSE: Running := false;
end;
end;
handlePlayerMovement(SDL_GetKeyboardState(nil), p, plate);
for i:= Low(plate.cases) + 1 to PLATEAU_HEIGHT_TILE_NUMBER-1 do
for j:= Low(plate.cases) + 1 to PLATEAU_WIDTH_TILE_NUMBER-1 do
if (plate.cases[i, j].index = 'B') or (plate.cases[i, j].index = 'D') then
updateEntities(j, i, plate, p.absPosition)
else if (plate.cases[i, j].index = 'E') then
updateEnemy(j, i, plate);
if not p.isDeath then
begin
p.rect.x := (p.relPosition[0]-1) * TILE_SIZE;
p.rect.y := (p.relPosition[1]-1) * TILE_SIZE;
updateCamera(p.rect);
end;
// SET HUD VIEWPORT
SDL_RenderClear(renderer);
SDL_RenderSetViewport(renderer, @HUD_VIEWPORT);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
SDL_RenderFillRect(renderer, nil);
//drawInfos(renderer, p, plate.name);
// SET MAIN VIEWPORT
SDL_RenderSetViewport(renderer, @GAME_VIEWPORT);
if (p.level = 5) then
SDL_SetRenderDrawColor(renderer, 0, 0, 138, SDL_ALPHA_OPAQUE);
// DRAW ENTITIES
drawPlateau(renderer, plate);
drawPlayer(renderer, p);
drawHUD(renderer, plate, p);
checkPlayerDeath(renderer, p, plate);
checkLevelFinish(renderer, p, plate);
// draw to screen
SDL_RenderPresent(renderer);
//writeln(IntToStr(round(1000/(timeLeft + (SDL_GetTicks() - starting_tick)))));
// constant frame rate (8 FPS)
SDL_Delay(TICK_INTERVAL);
nextTime += TICK_INTERVAL;
end;
// clear events
dispose(sdlEvent);
// remove timer
SDL_RemoveTimer(updateTimerId);
// clear texture
SDL_DestroyTexture(p.texture);
destroyPlateTextures();
// clear memory
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
//closing SDL2
SDL_Quit;
end.