diff options
| -rw-r--r-- | Artist.cpp | 20 | ||||
| -rw-r--r-- | Artist.h | 10 | ||||
| -rw-r--r-- | Canvas.cpp | 6 | ||||
| -rw-r--r-- | Canvas.h | 5 | ||||
| -rw-r--r-- | Deserializer.cpp | 30 | ||||
| -rw-r--r-- | Deserializer.h | 9 | ||||
| -rw-r--r-- | FileReader.cpp | 8 | ||||
| -rw-r--r-- | FileReader.h | 3 | ||||
| -rw-r--r-- | HTTPFile.cpp | 2 | ||||
| -rw-r--r-- | LocalFile.cpp | 2 | ||||
| -rw-r--r-- | Museum.cpp | 8 | ||||
| -rw-r--r-- | Museum.h | 5 | ||||
| -rw-r--r-- | People.cpp | 4 | ||||
| -rw-r--r-- | People.h | 4 | ||||
| -rw-r--r-- | ViewController.cpp | 6 | ||||
| -rw-r--r-- | ViewController.h | 2 | ||||
| -rw-r--r-- | main.cpp | 53 | 
17 files changed, 97 insertions, 80 deletions
@@ -1,6 +1,24 @@  #include "Artist.h" +#include "Museum.h" -void Artist::update() { +void Artist::update(Museum & m) { +	this->update_edge_collision(m); +	this->update_movement(m); +} + +void Artist::update_edge_collision(Museum & museum) { +	float next_x = this->data.x + this->data.vx; +	float next_y = this->data.y + this->data.vy; + +	// +0.5 is for own size (the assignment explicitly defines the x,y position +	// of artists as the top-left corner) +	if ((next_x + 0.5) > museum.canvas.data.columns || next_x < 0) +		this->data.vx *= -1; +	if ((next_y + 0.5) > museum.canvas.data.rows || next_y < 0) +		this->data.vy *= -1; +} + +void Artist::update_movement(Museum & museum) {  	this->data.x += this->data.vx;  	this->data.y += this->data.vy;  } @@ -1,13 +1,21 @@  #pragma once  #include "ArtistData.h" +#include "Color.h" + +class Museum;  class Artist {  public: -	void update(); +	void update(Museum & m); + +private: +	void update_movement(Museum & m); +	void update_edge_collision(Museum & m);  public:  	ArtistData data; +	Color color;  }; @@ -22,7 +22,11 @@ size_t Canvas::pos_to_index(unsigned x, unsigned y) {  	return index;  } -void Canvas::update() { +void Canvas::update(Museum & museum) { +} + +void Canvas::set_data(CanvasData data) { +	this->data = data;  	this->tiles.resize(this->data.rows * this->data.columns);  	for (size_t i = 0; i < this->tiles.size(); i++) {  		if (this->tiles[i] != nullptr) continue; @@ -6,6 +6,8 @@  #include "CanvasData.h"  #include "Tile.h" +class Museum; +  class Canvas {  public:  	Canvas() = default; @@ -18,7 +20,8 @@ public:  public:  	CanvasData data; -	void update(); +	void update(Museum & m); +	void set_data(CanvasData data);  private:  	std::vector<Tile *> tiles; diff --git a/Deserializer.cpp b/Deserializer.cpp index b6f1cc3..3c1e580 100644 --- a/Deserializer.cpp +++ b/Deserializer.cpp @@ -1,40 +1,18 @@  #include "Deserializer.h" -#include "Exception.h"  #include "TileAppearance.h" -void Deserializer::set_target(Museum * museum) { -	this->museum = museum; -} - -Deserializer::~Deserializer() { -	this->finalize(); -} - -void Deserializer::finalize() { -	// TODO: remove artists outside the canvas -} - -Museum & Deserializer::get_target() { -	if (this->museum == nullptr) -		throw Exception("no museum given to Deserializer"); - -	return *this->museum; -} +Deserializer::Deserializer(Museum & museum) : museum(museum) { }  void Deserializer::add_artist(ArtistData data) { -	Museum & museum = this->get_target(); -	museum.people.add_artist(data); +	this->museum.people.add_artist(data);  }  void Deserializer::set_canvas(CanvasData data) { -	Museum & museum = this->get_target(); -	museum.canvas.data = data; -	museum.canvas.update(); +	this->museum.canvas.set_data(data);  }  void Deserializer::add_tile(unsigned int x, unsigned int y, TileData data) { -	Museum & museum = this->get_target(); -	museum.canvas.set_tile(x, y, data); +	this->museum.canvas.set_tile(x, y, data);  }  void Deserializer::add_type(std::string type, Color color, unsigned int weight) { diff --git a/Deserializer.h b/Deserializer.h index 655caca..bdbcde0 100644 --- a/Deserializer.h +++ b/Deserializer.h @@ -8,11 +8,9 @@  class Deserializer {  public: -	Deserializer() = default; -	virtual ~Deserializer(); +	Deserializer(Museum & m);  public: -	void set_target(Museum * m);  	void add_type(std::string type, Color color, unsigned int weight);  	void set_canvas(CanvasData); @@ -20,10 +18,7 @@ public:  	void add_tile(unsigned int x, unsigned int y, TileData);  	void add_artist(ArtistData); -	void finalize(); -  private: -	Museum & get_target(); -	Museum * museum = nullptr; +	Museum & museum;  }; diff --git a/FileReader.cpp b/FileReader.cpp index 2c7a50e..d2d888f 100644 --- a/FileReader.cpp +++ b/FileReader.cpp @@ -1,10 +1,14 @@ +#include <memory> +  #include "FileReader.h"  #include "FileStrategy.h" -FileStrategy & FileReader::open(const std::string url) { +using namespace std; + +unique_ptr<FileStrategy> FileReader::open(const std::string url) {  	FileStrategy * reader = find_reader(url)->clone();  	reader->open(url); -	return *reader; +	return unique_ptr<FileStrategy>(reader);  }  void FileReader::register_strategy(const std::string type, const FileStrategy * node) { diff --git a/FileReader.h b/FileReader.h index 90d5e32..1cf62ba 100644 --- a/FileReader.h +++ b/FileReader.h @@ -2,6 +2,7 @@  #include <string>  #include <map> +#include <memory>  #include "FileStrategy.h" @@ -9,7 +10,7 @@ using FactoryMap = std::map<std::string, const FileStrategy *>;  class FileReader {  public: -	static FileStrategy & open(const std::string url); +	static std::unique_ptr<FileStrategy> open(const std::string url);  private:  	FileReader() = default; diff --git a/HTTPFile.cpp b/HTTPFile.cpp index fded2d3..6da0919 100644 --- a/HTTPFile.cpp +++ b/HTTPFile.cpp @@ -15,7 +15,7 @@ const std::string HTTPFile::read() {  }  HTTPFile::~HTTPFile() { -	close(); +	this->close();  }  HTTPFile * HTTPFile::clone() const { diff --git a/LocalFile.cpp b/LocalFile.cpp index c21988e..bdc25ab 100644 --- a/LocalFile.cpp +++ b/LocalFile.cpp @@ -42,7 +42,7 @@ const std::string LocalFile::read() {  }  LocalFile::~LocalFile() { -	close(); +	this->close();  	if (this->file != nullptr) {  		delete this->file; @@ -16,8 +16,8 @@ Museum::~Museum() {  }  void Museum::update() { -	this->people.update(); -	// this->canvas.update(); +	this->people.update(*this); +	this->canvas.update(*this);  }  void Museum::work() { @@ -30,3 +30,7 @@ void Museum::work() {  	}  } +void Museum::set_pause(bool paused) { +	this->paused = paused; +} + @@ -18,10 +18,11 @@ public:  	Canvas canvas;  public: -	bool paused = false; +	void set_pause(bool paused); +	void update();  private: -	void update(); +	bool paused = false;  private:  	static constexpr std::chrono::milliseconds tick_interval = 10ms; @@ -38,10 +38,10 @@ string People::to_string() {  	return out;  } -void People::update() { +void People::update(Museum & museum) {  	for (Artist * artist : this->artists) {  		if (artist == nullptr) continue; -		artist->update(); +		artist->update(museum);  	}  } @@ -6,6 +6,8 @@  #include "Artist.h"  #include "ArtistData.h" +class Museum; +  class People {  public:  	People() = default; @@ -18,7 +20,7 @@ public:  	Artist & get_artist(size_t index);  	size_t artists_size(); -	void update(); +	void update(Museum & m);  private:  	std::vector<Artist *> artists; diff --git a/ViewController.cpp b/ViewController.cpp index e6ffe2e..ea84bb8 100644 --- a/ViewController.cpp +++ b/ViewController.cpp @@ -37,12 +37,12 @@ void ViewController::update_artists(View & view) {  	for (size_t i = 0; i < people.artists_size(); i++) {  		Artist & artist = people.get_artist(i);  		Rectangle rect = { -			.x = static_cast<unsigned int>(artist.data.x * scale - ((float) artist_size / 2)), -			.y = static_cast<unsigned int>(artist.data.y * scale - ((float) artist_size / 2)), +			.x = static_cast<unsigned int>(artist.data.x * scale), +			.y = static_cast<unsigned int>(artist.data.y * scale),  			.width = artist_size,  			.height = artist_size,  		}; -		view.draw_rect(rect, { 0, 0, 0 }); +		view.draw_rect(rect, artist.color);  	}  } diff --git a/ViewController.h b/ViewController.h index 8cf46d5..bffd0b2 100644 --- a/ViewController.h +++ b/ViewController.h @@ -20,7 +20,7 @@ private:  private:  	unsigned int scale = 16; -	unsigned int line_width = 1; +	unsigned int line_width = 0;  	unsigned int artist_size = (scale - line_width) / 2;  }; @@ -10,39 +10,37 @@  using namespace std; -void load_museum(Museum & museum, int argc, char** argv) { -	Deserializer d {}; -	d.set_target(&museum); - -	for (int i = 1; i < argc; i++) { -		char * url = argv[i]; -		FileStrategy * f = nullptr; -	 -		try { -			f = &FileReader::open(url); -		} catch (Exception & e) { -			printf("FileStrategy open error: %s\n", e.what()); -			exit(EXIT_FAILURE); -		} -	 -		try { -			Parser::parse(*f, d); -		} catch (Exception & e) { -			printf("Parser error: %s (%s)\n", e.what(), url); -			exit(EXIT_FAILURE); -		} -	 -		f->close(); +static unique_ptr<FileStrategy> open(const char * url) noexcept { +	try { +		unique_ptr<FileStrategy> file = FileReader::open(url); +		return file; +	} catch (Exception & e) { +		printf("FileStrategy open error: %s\n", e.what()); +		exit(EXIT_FAILURE);  	} +} -	d.finalize(); +static void parse(FileStrategy & file, Deserializer & deserializer, const char * url) noexcept { +	try { +		Parser::parse(file, deserializer); +	} catch (Exception & e) { +		printf("Parser error: %s (%s)\n", e.what(), url); +		exit(EXIT_FAILURE); +	}  }  int main(int argc, char** argv) {  	Museum museum {}; -	museum.paused = true; +	museum.set_pause(true); -	load_museum(museum, argc, argv); +	Deserializer deserializer { museum }; + +	for (int i = 1; i < argc; i++) { +		char * url = argv[i]; + +		unique_ptr<FileStrategy> file = open(url); +		parse(*file, deserializer, url); +	}  	// printf("%s", museum.canvas.to_string(true).c_str());  	// printf("%s", museum.people.to_string().c_str()); @@ -50,7 +48,8 @@ int main(int argc, char** argv) {  	ViewController controller { museum };  	View view { controller }; -	museum.paused = false; +	museum.set_pause(false); +  	while (view.open);  	return EXIT_SUCCESS;  |