From a7fe765b38b01bce4f3d84e380e5e17713b17f70 Mon Sep 17 00:00:00 2001 From: Slyvtt Date: Sun, 13 Mar 2022 11:32:00 +0100 Subject: [PATCH] V0.4 - added HUD --- CMakeLists.txt | 2 + CppOutRun.layout | 100 ++++++++++++++-------------- assets-cg/fonts/createfont.py | 3 + assets-cg/fonts/fxconv-metadata.txt | 9 +++ assets-cg/fonts/make_grid.py | 28 ++++++++ assets-cg/fonts/speedfont.png | Bin 0 -> 12016 bytes assets-cg/hud/fxconv-metadata.txt | 5 ++ assets-cg/hud/speedhud.png | Bin 0 -> 17087 bytes src/main.cc | 44 ++++++++++-- 9 files changed, 135 insertions(+), 56 deletions(-) create mode 100644 assets-cg/fonts/createfont.py create mode 100644 assets-cg/fonts/fxconv-metadata.txt create mode 100644 assets-cg/fonts/make_grid.py create mode 100644 assets-cg/fonts/speedfont.png create mode 100644 assets-cg/hud/fxconv-metadata.txt create mode 100644 assets-cg/hud/speedhud.png 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 0000000000000000000000000000000000000000..85032dd469acab5a8619a08336a505177b055870 GIT binary patch literal 12016 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 L6veAV-v<6KI(c7M literal 0 HcmV?d00001 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 );