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.
Map/Map.cpp
- Committer:
- evanso
- Date:
- 2020-04-28
- Revision:
- 15:90b6821bcf64
- Parent:
- 14:7419c680656f
- Child:
- 18:11068b98e261
File content as of revision 15:90b6821bcf64:
#include "Map.h"
#define MAP_TERRAIN_Y_POSITION 42
#define MAP_TERRAIN_X_POSITION -84
#define MAP_TERRAIN_X_LENGTH 0
Map::Map() {
}
Map::~Map() {
}
void Map::init(Gamepad &pad) {
map_length_ = MAP_TERRAIN_X_LENGTH;
position_x_map_ = MAP_TERRAIN_X_POSITION;
position_y_map_ = MAP_TERRAIN_Y_POSITION;
// Initialises random arrays to make random map
fill_random_arrays(pad);
}
void Map::fill_random_arrays(Gamepad &pad){
srand(pad.read_adc()*64000);
for(int i = 0; i < 11; i++){
rand_heights_[i]= rand() % 8 + 5;
rand_lengths_[i]= rand() % 16 + 15;
}
//To to check random numbers generated are actaully random
#ifdef RANDOM_NUMBER_DEBUG
for (int i = 0; i < 11; i++){
printf("map height random array = %d\n", rand_heights_[i]);
}
#endif
}
void Map::draw_triangle(N5110 &lcd,int triangle_height){
// draws triangle by drawing two lines with one line having negative gadient
lcd.drawLine(position_x_map_, position_y_map_, position_x_map_ + triangle_height, position_y_map_ - triangle_height,1);
lcd.drawLine(position_x_map_ + triangle_height, position_y_map_ - triangle_height,position_x_map_ + 2*triangle_height,position_y_map_,1);
// changes the position of the map next draw line starts at the end of the drawn triangle
position_x_map_ = position_x_map_ + 2*triangle_height,position_y_map_;
}
void Map::draw_line(N5110 &lcd,int line_length){
lcd.drawLine(position_x_map_, position_y_map_, position_x_map_ + line_length, position_y_map_,1);
// changes the position of the map next draw triangle starts at the end of the drawn line
position_x_map_ += line_length;
}
void Map::draw_map(N5110 &lcd, int move_map){
//usb.printf("position_x_map_ = %d\n", position_x_map_);
//usb.printf("move map = %d\n", move_map);
reset_position_x_map_to_origonal_ = position_x_map_;
int map_length_ = 0;
//prints main part of map
for(int i = 0; i < 11; i++){
draw_triangle(lcd,rand_heights_[i]);
draw_line(lcd,rand_lengths_[i]);
final_random_element_used_ = i;
// calculates the length of the random map produced
map_length_ += rand_lengths_[i] + 2*rand_heights_[i];
// stops random maps lengths being to large only want it about 3 screen widths
if (map_length_ >252){
break;
}
}
//checks is map need duplicating on forward and backwards loop and fills gap
check_duplicates_map_forward(lcd);
check_duplicates_map_backwards(lcd);
// Resets postion of map and moves it
position_x_map_ = reset_position_x_map_to_origonal_ + move_map;
// Moves map to different persition so make it look like its looping
if(position_x_map_+ map_length_ < 0){
position_x_map_ = 0;
} else if(position_x_map_ > 84){
position_x_map_ = 84 - map_length_;
}
}
void Map::check_duplicates_map_forward(N5110 &lcd){
// Prints 1st part of map to fill gap wear map isn't present just befor its about to loop round it's self
if(reset_position_x_map_to_origonal_ + map_length_ <84 ){
for(int i = 0; i < 4; i++){
draw_triangle(lcd,rand_heights_[i]);
draw_line(lcd,rand_lengths_[i]);
}
}
}
void Map::check_duplicates_map_backwards(N5110 &lcd){
// Prints last part of map to fill gap wear map isn't present just befor its about to loop round it's self
if(reset_position_x_map_to_origonal_ > 0 ){
int print_reverse_position = 0;
// prints the last 4 parts of map to fill gap
for(int i = final_random_element_used_ ; i > final_random_element_used_ - 4; i--){
position_x_map_ = reset_position_x_map_to_origonal_ - rand_lengths_[i] - print_reverse_position;
draw_line(lcd,rand_lengths_[i]);
print_reverse_position += rand_lengths_[i];
position_x_map_ = reset_position_x_map_to_origonal_ - 2*rand_heights_[i] - print_reverse_position;
draw_triangle(lcd,rand_heights_[i]);
print_reverse_position += 2*rand_heights_[i];
}
}
}
int Map::get_position_x_map(){
return position_x_map_;
}