diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1abcaa2..50b73d8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -44,6 +44,8 @@ set(ASSETS_cg
assets-cg/billboard/rightturn.png
assets-cg/billboard/uphill.png
assets-cg/billboard/downhill.png
+ assets-cg/fonts/speedfont.png
+ assets-cg/hud/speedhud.png
)
fxconv_declare_assets(${ASSETS_cg} WITH_METADATA)
diff --git a/CppOutRun.layout b/CppOutRun.layout
index 730afab..e429c85 100644
--- a/CppOutRun.layout
+++ b/CppOutRun.layout
@@ -2,41 +2,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -47,29 +12,44 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -77,19 +57,39 @@
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets-cg/fonts/createfont.py b/assets-cg/fonts/createfont.py
new file mode 100644
index 0000000..cdb3342
--- /dev/null
+++ b/assets-cg/fonts/createfont.py
@@ -0,0 +1,3 @@
+from make_grid import *
+
+make_grid(16, 18)
diff --git a/assets-cg/fonts/fxconv-metadata.txt b/assets-cg/fonts/fxconv-metadata.txt
new file mode 100644
index 0000000..c2fc03c
--- /dev/null
+++ b/assets-cg/fonts/fxconv-metadata.txt
@@ -0,0 +1,9 @@
+speedfont.png:
+ name: speedfont
+ type: font
+ charset: print
+ grid.size: 16x18
+ grid.padding: 1
+ grid.border: 0
+ proportional: true
+ height: 18
diff --git a/assets-cg/fonts/make_grid.py b/assets-cg/fonts/make_grid.py
new file mode 100644
index 0000000..8e93d69
--- /dev/null
+++ b/assets-cg/fonts/make_grid.py
@@ -0,0 +1,28 @@
+from PIL import Image, ImageDraw
+
+
+def make_grid(char_w, char_h):
+ """
+ Arguments
+ char_w : character's width (int)
+ char_h : character's height (int)
+
+ Description
+ Make a grid with 1 pxl of padding and boxes around each character in order to make easier the font creation.
+
+ Usage
+ Just enter :
+ >>> make_grid(char_width, char_height)
+ An image will be create in the same folder that this programm in *.png format and the name starts by : 'grid_'.
+ """
+ width, height = 16 * (char_w + 2), 6 * (char_h + 2)
+ grid = Image.new('RGB', (width, height), 'white')
+ draw = ImageDraw.Draw(grid)
+
+ for x in range(0, width, char_w + 2):
+ for y in range(0, height, char_h + 2):
+ if (x // (char_w + 2) - y // (char_h + 2)) % 2: color = 'blue'
+ else: color = 'orange'
+ draw.rectangle((x, y, x + char_w + 1, y + char_h + 1), fill=None, outline=color)
+
+ grid.save(f"grid_{char_w}—{char_h}.png")
diff --git a/assets-cg/fonts/speedfont.png b/assets-cg/fonts/speedfont.png
new file mode 100644
index 0000000..85032dd
Binary files /dev/null and b/assets-cg/fonts/speedfont.png differ
diff --git a/assets-cg/hud/fxconv-metadata.txt b/assets-cg/hud/fxconv-metadata.txt
new file mode 100644
index 0000000..7e05b58
--- /dev/null
+++ b/assets-cg/hud/fxconv-metadata.txt
@@ -0,0 +1,5 @@
+*.png:
+ type: bopti-image
+ profile: p4
+ name_regex: (.*)\.png \1
+
diff --git a/assets-cg/hud/speedhud.png b/assets-cg/hud/speedhud.png
new file mode 100644
index 0000000..dd6ab4a
Binary files /dev/null and b/assets-cg/hud/speedhud.png differ
diff --git a/src/main.cc b/src/main.cc
index 323a1d0..b83098b 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -30,8 +30,8 @@ extern bopti_image_t leftturn, rightturn, uphill, downhill;
extern bopti_image_t player;
extern bopti_image_t sky1, sky2, sky3;
extern bopti_image_t mountain, treeline;
-
-
+extern font_t speedfont;
+extern bopti_image_t speedhud;
std::vector circuit;
int MAX_SEGMENT=0;
@@ -58,9 +58,9 @@ bool BDrawRoad = true;
uint16_t currentcurve=0;
uint8_t shiftcolor=0;
-float speed = 0;
-float maxspeedforward = 5;
-float maxspeedbackward = 2;
+float speed = 0.0;
+float maxspeedforward = 5.0;
+float maxspeedbackward = 2.0;
int direction = 1;
bool speedcontrol = false;
@@ -246,6 +246,7 @@ int main(void)
#endif
prof_t perf_update, perf_create, perf_project, perf_render;
+ int32_t start_time = 99000000;
uint32_t time_update=0, time_create=0, time_project=0, time_render=0;
prof_init();
@@ -278,6 +279,7 @@ int main(void)
uint32_t dt=0;
uint16_t l=0;
+ uint32_t remaining_time;
while (!stop)
{
@@ -286,8 +288,13 @@ int main(void)
prof_enter(perf_update);
get_inputs( dt, indexstart );
+
dt = ((float) (time_update+time_render+time_project) / 1000.0);
+ start_time -= (time_update+time_render+time_project);
+ if (start_time<0) start_time=0;
+ remaining_time = ((float) (start_time) / 1000000.0);
+
//--------------
if (fround(cam->cZ)<=0) cam->cZ=fixdouble(0.0);
if (fround(cam->cZ)>=maxDistance) cam->cZ=fixdouble(maxDistance);
@@ -422,7 +429,32 @@ int main(void)
//dprint( 1, 30, C_RED, "Rdr=%.3D ms", time_render );
//dprint( 1, 45, C_RED, "Upd=%.3D ms", time_update );
- dprint( 1, 1, C_BLACK, "Dt=%.3D ms", dt );
+ //dprint( 1, 1, C_BLACK, "Dt=%.3D ms", dt );
+
+
+ float drawspeed = (float) (speed*5.0f);
+
+ dsubimage( 5, 5, &speedhud, 0, 117, 37, 13, DIMAGE_NONE); // speed logo
+ dsubimage( 155, 5, &speedhud, 0, 130, 37, 13, DIMAGE_NONE); // timer logo
+
+
+ dfont(&speedfont);
+ dprint_opt(122,3, C_RGB(0,0,0), C_NONE, DTEXT_RIGHT, DTEXT_TOP, "%.1f :", drawspeed );
+ dprint_opt(120,1, C_RGB(255,0,0), C_NONE, DTEXT_RIGHT, DTEXT_TOP, "%.1f :", drawspeed ); //the ':' char corresponds to "Km/h"
+
+ dprint_opt(253,3, C_RGB(0,0,0), C_NONE, DTEXT_RIGHT, DTEXT_TOP, "%.3D ;", remaining_time );
+ dprint_opt(250,1, C_RGB(255,255,0), C_NONE, DTEXT_RIGHT, DTEXT_TOP, "%.3D ;", remaining_time ); // the ';' char corresponds to "s"
+
+
+ if (drawspeed==0.0) dsubimage( 48, 25, &speedhud, 0, 0, 76, 13, DIMAGE_NONE);
+ else if (drawspeed<3.30) dsubimage( 48, 25, &speedhud, 0, 13, 76, 13, DIMAGE_NONE);
+ else if (drawspeed<6.70) dsubimage( 48, 25, &speedhud, 0, 26, 76, 13, DIMAGE_NONE);
+ else if (drawspeed<10.0) dsubimage( 48, 25, &speedhud, 0, 39, 76, 13, DIMAGE_NONE);
+ else if (drawspeed<13.3) dsubimage( 48, 25, &speedhud, 0, 52, 76, 13, DIMAGE_NONE);
+ else if (drawspeed<16.7) dsubimage( 48, 25, &speedhud, 0, 65, 76, 13, DIMAGE_NONE);
+ else if (drawspeed<20.0) dsubimage( 48, 25, &speedhud, 0, 78, 76, 13, DIMAGE_NONE);
+ else if (drawspeed<23.3) dsubimage( 48, 25, &speedhud, 0, 91, 76, 13, DIMAGE_NONE);
+ else dsubimage( 48, 25, &speedhud, 0, 104, 76, 13, DIMAGE_NONE);
//dprint( 1, 1, C_BLACK, "FPS=%.3D ms", 1000/dt );