Henry Triff / Mbed 2 deprecated ELEC2645_Project_el18ht

Dependencies:   mbed

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 @@
 
 
 
-
-
-
-