Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: Mechanics/Mechanics.cpp
- Revision:
- 7:2ce6e90f6d47
- Parent:
- 6:5f76dd718dc3
- Child:
- 8:4503c92acaf6
--- a/Mechanics/Mechanics.cpp Wed Feb 19 21:40:21 2020 +0000 +++ b/Mechanics/Mechanics.cpp Sat Feb 22 23:13:25 2020 +0000 @@ -1,18 +1,61 @@ #include "Mechanics.h" +//********* +// SPEED +//********* + +float Mechanics::Get_Speed(float speed, float max_speed, float acceleration, float deceleration, float off_track_speed, Point_2D position, Square_2D *offtrack_square, Triangle_2D *offtrack_triangle, Square_2D *out_of_bounds_square, Triangle_2D *out_of_bounds_triangle, Triangle_2D *plates, Map_Data map_info, Gamepad &Device) +{ + bool offtrack = Is_Offtrack(position, offtrack_square, offtrack_triangle, map_info); + bool out_of_bounds = Is_Out_Of_Bounds(position, out_of_bounds_square, out_of_bounds_triangle, map_info); + + if(Device.X_held() == true && Device.B_held() == false) { + if(speed >= 0 && speed < max_speed) { + speed += acceleration; + } else if(speed < 0) { + speed = 0; + } + } else if(Device.B_held() == true && Device.X_held() == false) { + if(speed >= deceleration) { + speed -= deceleration; + } else if(speed <= 0) { + speed = -1; + } + } else if(Device.B_held() == false && Device.X_held() == false) { + if(speed > 0) { + speed -= 0.05; + } else { + speed = 0; + } + } + if(offtrack == true) { + if(speed > off_track_speed) { + speed -= 0.10; + } + } + + if(out_of_bounds == true) { + speed = 0; + } + + speed = Get_Boost_Speed(plates, map_info.number_of_boost_plates, position, speed); + + return speed; +} + +// COMBINING + bool Mechanics::Is_Offtrack(Point_2D position, Square_2D offtrack_square[], Triangle_2D offtrack_triangle[], Map_Data map_info) { return (Is_Offtrack_Square(offtrack_square, map_info.number_of_off_track_triangles, position) || Is_Offtrack_Triangle(offtrack_triangle, map_info.number_of_off_track_triangles, position)); } -bool Mechanics::Is_Out_Of_Bounds(Point_2D position, Square_2D offtrack_square[], Triangle_2D offtrack_triangle[], Map_Data map_info) +bool Mechanics::Is_Out_Of_Bounds(Point_2D position, Square_2D out_of_bounds_square[], Triangle_2D out_of_bounds_triangle[], Map_Data map_info) { - return (Is_Out_Of_Bounds_Square(offtrack_square, map_info.number_of_out_of_bounds_squares, position) || Is_Out_Of_Bounds_Triangle(offtrack_triangle, map_info.number_of_out_of_bounds_triangles, position)); + return (Is_Out_Of_Bounds_Square(out_of_bounds_square, map_info.number_of_out_of_bounds_squares, position) || Is_Out_Of_Bounds_Triangle(out_of_bounds_triangle, map_info.number_of_out_of_bounds_triangles, position)); } -//************* // OFF TRACK -//************* bool Mechanics::Is_Offtrack_Square(Square_2D offtrack[], int size, Point_2D position) { @@ -58,9 +101,7 @@ return false; } -//***************** // OUT OF BOUNDS -//***************** bool Mechanics::Is_Out_Of_Bounds_Square(Square_2D out_of_bounds[], int size, Point_2D position) { @@ -106,9 +147,21 @@ return false; } -//********* -// GATES -//********* +// BOOST PLATE + +float Mechanics::Get_Boost_Speed(Triangle_2D plates[], int number_of_plates, Point_2D position, float speed) +{ + for(int i = 0; i < number_of_plates; i++) { + if(position.x > plates[i].TL.x && position.x < plates[i].BR.x && position.y < plates[i].TL.y && position.y > plates[i].BR.y) { + speed = 6; + } + } + return speed; +} + +//****************** +// GATES AND LAPS +//****************** int Mechanics::Get_Gate(Square_2D gates[], int number_of_gates, Point_2D position, int current_gate) { @@ -144,6 +197,10 @@ return laps; } +//******** +// TIME +//******** + Time Mechanics::Convert_To_Time(int game_fps, int number_of_frames) { int total_seconds = float(number_of_frames) / float(game_fps); @@ -154,18 +211,159 @@ return {minuites, seconds, miliseconds}; } -//*************** -// BOOST PLATE -//*************** +//************* +// GET ANGLE +//************* -float Mechanics::Get_Boost_Speed(Triangle_2D plates[], int number_of_plates, Point_2D position, float speed) +int Mechanics::Get_Angle(int angle, int handling, bool gyro_enabled, FXOS8700CQ &Gyro, Gamepad &Device) +{ + if(gyro_enabled == false) { + int Stick_Position = Device.get_direction(); + if(Stick_Position == 2 || Stick_Position == 3 || Stick_Position == 4) { + angle += handling; + } else if(Stick_Position == 6 || Stick_Position == 7 || Stick_Position == 8) { + angle -= handling; + } + return angle; + } else { + Gyro_Data Gyro_Tilt = Gyro.get_values(); + float tilt = Gyro_Tilt.ay * 90; + if(tilt > 5) { + if(tilt < 40) { + angle += handling * (tilt/40); + } else { + angle += handling; + } + } else if(tilt < -5) { + if(tilt > -40) { + angle -= handling * (tilt/-40); + } else { + angle -= handling; + } + } + return angle; + } +} + +//******************* +// GET TRANSLATION +//******************* + +Point_2D Mechanics::Get_Translation(Point_2D in, float angle, float speed, Square_2D *out_of_bounds_square, Triangle_2D *out_of_bounds_triangle, Map_Data map_info, Gamepad &Device) +{ + float x = in.x; + float y = in.y; + bool out_of_bounds = Is_Out_Of_Bounds(in, out_of_bounds_square, out_of_bounds_triangle, map_info); + + if(out_of_bounds == true) { + float temp_speed = -4; + y += temp_speed * cos(-angle * PI / 180); + x -= temp_speed * sin(-angle * PI / 180); + } + y += speed * cos(-angle * PI / 180); + x -= speed * sin(-angle * PI / 180); + + return {x,y}; +} + +//************** +// CAR MODELS +//************** + +float Mechanics::Get_Max_Speed(int car_model) { - for(int i = 0; i < number_of_plates; i++) { - if(position.x > plates[i].TL.x && position.x < plates[i].BR.x && position.y < plates[i].TL.y && position.y > plates[i].BR.y) { - speed = 6; - } + enum cars {Basic, Offroad, Drifter, Sportscar, Racecar, Stupid}; + + if(car_model == Stupid) { + return 8; + } else if(car_model == Racecar) { + return 6; + } else if(car_model == Sportscar) { + return 4; + } else if(car_model == Drifter) { + return 4; + } else if(car_model == Offroad) { + return 2; + } else if(car_model == Basic) { + return 3; + } +} + +float Mechanics::Get_Acceleration(int car_model) +{ + enum cars {Basic, Offroad, Drifter, Sportscar, Racecar, Stupid}; + + if(car_model == Stupid) { + return 0.15; + } else if(car_model == Racecar) { + return 0.1; + } else if(car_model == Sportscar) { + return 0.08; + } else if(car_model == Drifter) { + return 0.05; + } else if(car_model == Offroad) { + return 0.02; + } else if(car_model == Basic) { + return 0.03; } - return speed; + +} + +float Mechanics::Get_Deceleration(int car_model) +{ + enum cars {Basic, Offroad, Drifter, Sportscar, Racecar, Stupid}; + + if(car_model == Stupid) { + return 0.3; + } else if(car_model == Racecar) { + return 0.15; + } else if(car_model == Sportscar) { + return 0.1; + } else if(car_model == Drifter) { + return 0.03; + } else if(car_model == Offroad) { + return 0.03; + } else if(car_model == Basic) { + return 0.05; + } +} + +float Mechanics::Get_Off_Road_Speed(int car_model) +{ + enum cars {Basic, Offroad, Drifter, Sportscar, Racecar, Stupid}; + + if(car_model == Stupid) { + return 2; + } else if(car_model == Racecar) { + return 0.5; + } else if(car_model == Sportscar) { + return 0.8; + } else if(car_model == Drifter) { + return 0.3; + } else if(car_model == Offroad) { + return 2; + } else if(car_model == Basic) { + return 0.8; + } +} + +int Mechanics::Get_Handling(int car_model) +{ + enum cars {Basic, Offroad, Drifter, Sportscar, Racecar, Stupid}; + + if(car_model == Stupid) { + return 3; + } else if(car_model == Racecar) { + return 3; + } else if(car_model == Sportscar) { + return 2; + } else if(car_model == Drifter) { + return 2; + } else if(car_model == Offroad) { + return 1; + } else if(car_model == Basic) { + return 2; + } } @@ -174,7 +372,3 @@ - - - -