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 );