Dependencies:   mbed

main.cpp

Committer:
HenryWTriff
Date:
2020-02-11
Revision:
5:2d9f3c36bcb9
Parent:
4:9f41fc1c2ad1
Child:
6:5f76dd718dc3

File content as of revision 5:2d9f3c36bcb9:

/*
ELEC2645 Embedded Systems Project
School of Electronic & Electrical Engineering
University of Leeds
2019/20

Name: Henry Triff
Username: el18ht
Student ID Number: 201224295
Date: 10/02/2020
*/

//LIBRARIES
#include "mbed.h"
#include "Gamepad.h"
#include "N5110.h"
#include "Graphics.h"
#include "Controls.h"

//OBJECTS
Gamepad Device;
N5110 LCD;
Graphics Graphics;
Controls Controls;
Mechanics Mechanics;

#ifndef STRUCTS
#define STRUCTS

//STRUCTS
struct Point_2D {
    float x;
    float y;
};
struct Line_2D {
    Point_2D from;
    Point_2D to;
};

struct Square_2D {
    Point_2D TL;
    Point_2D BR;
};
struct Triangle_2D {
    Point_2D TL;
    Point_2D BR;
    int Type;
};

struct Map_Data {
    int number_of_track_lines;
    int number_of_dotted_lines;
    int number_of_flags;
    int number_of_walls;
    int number_of_off_track_squares;
    int number_of_off_track_triangles;
    int number_of_out_of_bounds_squares;
    int number_of_out_of_bounds_triangles;
    int number_of_gates;
};

#endif

//MAP - 1
Map_Data Map_1 = {36,1,2,16,14,19,8,5,12};

//Lines
const Line_2D Map_1_Track_Lines[36] = {
    //Inside Line
    {{-20,0},{-20,80}},
    {{-20,80},{-40,100}},
    {{-40,100},{-80,100}},
    {{-80,100},{-100,80}},
    {{-100,80},{-100,40}},
    {{-100,40},{-140,0}},
    {{-140,0},{-220,0}},
    {{-220,0},{-260,40}},
    {{-260,40},{-260,80}},
    {{-260,80},{-280,100}},
    {{-280,100},{-320,100}},
    {{-320,100},{-360,60}},
    {{-360,60},{-360,-100}},
    {{-360,-100},{-300,-160}},
    {{-300,-160},{-220,-80}},
    {{-220,-80},{-100,-80}},
    {{-100,-80},{-20,0}},
    //Outside Line
    {{20,-20},{20,100}},
    {{20,100},{-20,140}},
    {{-20,140},{-100,140}},
    {{-100,140},{-140,100}},
    {{-140,100},{-140,60}},
    {{-140,60},{-160,40}},
    {{-160,40},{-200,40}},
    {{-200,40},{-220,60}},
    {{-220,60},{-220,100}},
    {{-220,100},{-260,140}},
    {{-260,140},{-340,140}},
    {{-340,140},{-400,80}},
    {{-400,80},{-400,-120}},
    {{-400,-120},{-320,-200}},
    {{-320,-200},{-280,-200}},
    {{-280,-200},{-200,-120}},
    {{-200,-120},{-80,-120}},
    {{-80,-120},{20,-20}},
};

//Dotted Lines
const Line_2D Map_1_Track_Dotted_Lines[1] = {
    {{-20,0},{20,0}},
};

//Flags
Point_2D Map_1_Flags[2] = {
    {-20,0},
    {24,0}
};

//Walls
Line_2D Map_1_Walls[16] = {
    //Inside
    {{-40,80},{-40,0}},
    {{-40,0},{-100,-60}},
    {{-100,-60},{-240,-60}},
    {{-240,-60},{-300,-120}},
    {{-300,-120},{-340,-60}},
    {{-340,-60},{-340,60}},
    {{-340,60},{-280,60}},
    {{-280,60},{-280,-20}},
    {{-280,-20},{-100,-20}},
    {{-100,-20},{-80,0}},
    {{-80,0},{-80,80}},
    {{-80,80},{-40,80}},
    //Outside
    {{40,160},{40,-220}},
    {{40,-220},{-420,-220}},
    {{-420,-220},{-420,160}},
    {{-420,160},{40,160}},
};

//Off track? objects
Square_2D Map_1_Off_Track_Square[14] = {
    //Inside
    {{-100,80},{-20,0}},
    {{-80,100},{-40,80}},
    {{-260,0},{-100,-80}},
    {{-360,60},{-260,-100}},
    {{-320,100},{-280,60}},
    {{-280,80},{-260,60}},
    {{-300,-100},{-260,-120}},
    {{-200,60},{-60,40}},
    {{-220,140},{-140,60}},
    {{-200,-120},{20,-200}},
    {{-400,200},{20,140}},
    {{-500,200},{-400,-300}},
    {{20,200},{100,-300}},
    {{-400,-200},{20,-300}}
};

//Off track? objects
Triangle_2D Map_1_Off_Track_Triangle[19] = {
    {{-40,100},{-20,80},1},
    {{-100,100},{-80,80},4},
    {{-140,40},{-100,0},4},
    {{-100,0},{-20,-80},2}, //
    {{-260,40},{-220,0},1},
    {{-260,-80},{-220,-120},2},
    {{-200,-120},{-260,-160},2},
    {{-280,100},{-260,80},1},
    {{-360,100},{-320,60},4},
    {{-360,-100},{-300,-160},3},
    //Outside
    {{-20,140},{20,100},3},
    {{-80,-20},{20,-120},4},
    {{-140,140},{-100,100},2},
    {{-160,60},{-140,40},2}, //
    {{-220,60},{-200,40},3},
    {{-280,-120},{-200,-200},4},
    {{-260,140},{-240,100},3},
    {{-400,140},{-340,80},2}, //
    {{-400,-120},{-320,-200},1}
};

Square_2D Map_1_Out_Of_Bounds_Square[8] = {
    //Inside
    {{-80,80},{-40,0}},
    {{-340,60},{-280,-60}},
    {{-280,-20},{-100,-60}},
    {{-80,0},{-60,-20}},
    //Outside
    {{40,160},{60,-220}},
    {{-420,-220},{40,-240}},
    {{-440,160},{-420,-220}},
    {{-420,180},{40,160}}
};

Triangle_2D Map_1_Out_Of_Bounds_Triangle[5] = {
    //Inside
    {{-60,0},{-40,-20},2},
    {{-100,0},{-80,-20},4},
    {{-100,-20},{-60,-60},2},
    {{-300,-60},{-240,-120},2},
    {{-340,-60},{-300,-120},3}
};

Square_2D Map_1_Gates[12] = {
    {{-40,0},{40,-10}},
    {{-40,80},{40,70}},
    {{-80,160},{-70,80}},
    {{-160,70},{-80,60}},
    {{-200,60},{-190,-20}},
    {{-310,160},{-300,60}},
    {{-420,10},{-340,0}},
    {{-420,-90},{-300, -100}},
    {{-300,-100},{-290,-220}},
    {{-200,-60},{-190,-220}},
    {{-110,-60},{-100,-220}},
    {{-100,-40},{40,-60}}
};

//GLOBAL VARIABLES

//Transform
int angle = 0;
Point_2D translation = {0,0};
float squish = 0.15;

//Vehicle parameters
float speed = 0;
float max_speed = 4;
int handling = 2;

//Mechanics
bool off_track = false;
bool out_of_bounds = false;
int lap_gate = 0;
int laps = 1;
bool direction = true;

//Game parameters
int game_fps = 50;

int main()
{
    LCD.init();
    Device.init();
    while(1) {

        //MECHANICS
        off_track = Mechanics.Is_Offtrack(translation, Map_1_Off_Track_Square, Map_1_Off_Track_Triangle, Map_1);
        out_of_bounds = Mechanics.Is_Out_Of_Bounds(translation, Map_1_Out_Of_Bounds_Square, Map_1_Out_Of_Bounds_Triangle, Map_1);
        laps = Mechanics.Get_Laps(laps, Map_1_Gates, Map_1.number_of_gates, translation, lap_gate);
        lap_gate = Mechanics.Get_Gate(Map_1_Gates, Map_1.number_of_gates, translation, lap_gate);

        //CONTROLS
        angle = Controls.Get_Angle(angle, handling, Device);
        translation = Controls.Get_Translation(translation, angle, speed, out_of_bounds, Device);
        speed = Controls.Get_Speed(speed, max_speed, off_track, out_of_bounds, Device);

        //GRAPHICS
        LCD.clear();
        Graphics.Change_Contrast(LCD,Device);
        Graphics.Draw_Map(
            translation,
            angle,
            squish,
            (Line_2D *) Map_1_Track_Lines,
            (Line_2D *)Map_1_Track_Dotted_Lines,
            (Line_2D *)Map_1_Walls,
            (Point_2D *)Map_1_Flags,
            Map_1,
            LCD
        );
        Graphics.Draw_Laps(laps, LCD);
        LCD.refresh();
        wait((1 / float(game_fps)));
    }


}