diff options
| -rw-r--r-- | src/crepe/api/Camera.h | 30 | ||||
| -rw-r--r-- | src/crepe/api/Texture.cpp | 2 | ||||
| -rw-r--r-- | src/crepe/api/Vector2.cpp | 12 | ||||
| -rw-r--r-- | src/crepe/api/Vector2.h | 7 | ||||
| -rw-r--r-- | src/crepe/facade/SDLContext.cpp | 45 | ||||
| -rw-r--r-- | src/example/rendering.cpp | 7 | 
6 files changed, 82 insertions, 21 deletions
| diff --git a/src/crepe/api/Camera.h b/src/crepe/api/Camera.h index e0cda34..73d4ef4 100644 --- a/src/crepe/api/Camera.h +++ b/src/crepe/api/Camera.h @@ -2,6 +2,7 @@  #include "Color.h"  #include "Component.h" +#include "api/Vector2.h"  namespace crepe { @@ -27,20 +28,35 @@ public:  	//! Background color of the camera view.  	Color bg_color; -	//! Aspect ratio height for the camera. -	double aspect_height = 480; +	Vector2 pos = {0,0}; -	//! Aspect ratio width for the camera. -	double aspect_width = 640; +	Vector2 screen = {640,480}; -	//! X-coordinate of the camera position. +	Vector2 viewport = {500,500}; + +	/* +	//! screen width in pixel coordinates +	double screen_w = 480; + +	//! screen height in pixel coordinates +	double screen_h = 640; + +	//! screen widht in world units +	double viewport_w = 500.0f; +	 +	//! screen height in world units  +	double viewport_h = 500.0f; + +	//! X-coordinate of the camera position. in world space  	double x = 0.0; -	//! Y-coordinate of the camera position. +	//! Y-coordinate of the camera position. in world space  	double y = 0.0; +	*/ +  	//! Zoom level of the camera view. -	double zoom = 1.0; +	double zoom = 1.0f;  public:  	/** diff --git a/src/crepe/api/Texture.cpp b/src/crepe/api/Texture.cpp index de0d0ea..734a5bb 100644 --- a/src/crepe/api/Texture.cpp +++ b/src/crepe/api/Texture.cpp @@ -35,5 +35,5 @@ int Texture::get_width() const {  }  int Texture::get_height() const {  	if (this->texture == nullptr) return 0; -	return SDLContext::get_instance().get_width(*this); +	return SDLContext::get_instance().get_height(*this);  } diff --git a/src/crepe/api/Vector2.cpp b/src/crepe/api/Vector2.cpp index 30b968e..c3a49b7 100644 --- a/src/crepe/api/Vector2.cpp +++ b/src/crepe/api/Vector2.cpp @@ -8,11 +8,19 @@ Vector2 Vector2::operator+(const Vector2 & other) const { return {x + other.x, y  Vector2 Vector2::operator*(double scalar) const { return {x * scalar, y * scalar}; } +Vector2 Vector2::operator*(const Vector2 & other) const{ +	return {this->x * other.x, this->y * other.y}; +}  Vector2 & Vector2::operator*=(const Vector2 & other) {  	x *= other.x;  	y *= other.y;  	return *this;  } +Vector2 & Vector2::operator*=(const double & other) { +	x *= other; +	y *= other; +	return *this; +}  Vector2 & Vector2::operator+=(const Vector2 & other) {  	x += other.x; @@ -26,6 +34,10 @@ Vector2 & Vector2::operator+=(double other) {  	return *this;  } +Vector2 Vector2::operator/(const Vector2 & other) const { +	return {this->x / other.x, this->y / other.y}; +} +  Vector2 Vector2::operator-() const { return {-x, -y}; }  bool Vector2::operator==(const Vector2 & other) const { return x == other.x && y == other.y; } diff --git a/src/crepe/api/Vector2.h b/src/crepe/api/Vector2.h index 2fb6136..2a5db1d 100644 --- a/src/crepe/api/Vector2.h +++ b/src/crepe/api/Vector2.h @@ -18,9 +18,16 @@ struct Vector2 {  	//! Multiplies this vector by a scalar and returns the result.  	Vector2 operator*(double scalar) const; +	Vector2 operator*(const Vector2 & other) const; +  	//! Multiplies this vector by another vector element-wise and updates this vector.  	Vector2 & operator*=(const Vector2 & other); +	//! Multiplies a scalar value to both components of this vector and updates this vector. +	Vector2 & operator*=(const double & other); + +	Vector2 operator/(const Vector2 & other) const; +  	//! Adds another vector to this vector and updates this vector.  	Vector2 & operator+=(const Vector2 & other); diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 83e91f8..5185adc 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -15,6 +15,7 @@  #include "../api/Texture.h"  #include "../api/Transform.h"  #include "../util/Log.h" +#include "api/Vector2.h"  #include "SDLContext.h" @@ -37,7 +38,7 @@ SDLContext::SDLContext() {  	}  	SDL_Window * tmp_window  		= SDL_CreateWindow("Crepe Game Engine", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, -						   this->viewport.w, this->viewport.h, 0); +						   this->viewport.w, this->viewport.h, SDL_WINDOW_RESIZABLE);  	if (!tmp_window) {  		// FIXME: throw exception  		std::cerr << "Window could not be created! SDL_Error: " << SDL_GetError() << std::endl; @@ -103,17 +104,30 @@ void SDLContext::handle_events(bool & running) {  void SDLContext::clear_screen() { SDL_RenderClear(this->game_renderer.get()); }  void SDLContext::present_screen() { SDL_RenderPresent(this->game_renderer.get()); } +  void SDLContext::draw(const Sprite & sprite, const Transform & transform, const Camera & cam) {  	SDL_RendererFlip render_flip  		= (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x)  							  | (SDL_FLIP_VERTICAL * sprite.flip.flip_y)); +	 +	double screen_aspect = cam.screen.x / cam.screen.y; +	double viewport_aspect = cam.viewport.x / cam.viewport.y; +	Vector2 scale; + +	if (screen_aspect > viewport_aspect) { +		scale.x = scale.y = cam.screen.x / cam.viewport.x; +	} else { +		scale.y = scale.x = cam.screen.y / cam.viewport.y; +	} + +	Vector2 zoomed_viewport = cam.viewport * cam.zoom; +	Vector2 pixel_coord = (transform.position - cam.pos) * scale; -	double adjusted_x = (transform.position.x - cam.x) * cam.zoom; -	double adjusted_y = (transform.position.y - cam.y) * cam.zoom; -	double adjusted_w = sprite.sprite_rect.w * transform.scale * cam.zoom; -	double adjusted_h = sprite.sprite_rect.h * transform.scale * cam.zoom; +	double pixel_w = sprite.sprite_rect.w * transform.scale * scale.x; +	double pixel_h = sprite.sprite_rect.h * transform.scale * scale.y; +	// decides which part of the sprite will be drawn  	SDL_Rect srcrect = {  		.x = sprite.sprite_rect.x,  		.y = sprite.sprite_rect.y, @@ -121,11 +135,12 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, const  		.h = sprite.sprite_rect.h,  	}; +	// decides where the clipped image is drawn  	SDL_Rect dstrect = { -		.x = static_cast<int>(adjusted_x), -		.y = static_cast<int>(adjusted_y), -		.w = static_cast<int>(adjusted_w), -		.h = static_cast<int>(adjusted_h), +		.x = static_cast<int>(pixel_coord.x), +		.y = static_cast<int>(pixel_coord.y), +		.w = static_cast<int>(pixel_w), +		.h = static_cast<int>(pixel_h),  	};  	SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image->texture.get(), &srcrect, @@ -133,11 +148,19 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, const  }  void SDLContext::camera(const Camera & cam) { -	this->viewport.w = static_cast<int>(cam.aspect_width); -	this->viewport.h = static_cast<int>(cam.aspect_height); + +	if (this->viewport.w != cam.screen.x && this->viewport.h != cam.screen.y) { +		this->viewport.w = cam.screen.x; +		this->viewport.h = cam.screen.y; +		SDL_SetWindowSize(this->game_window.get(), cam.screen.x	, cam.screen.y); +	} + +	/*  	this->viewport.x = static_cast<int>(cam.x) - (SCREEN_WIDTH / 2);  	this->viewport.y = static_cast<int>(cam.y) - (SCREEN_HEIGHT / 2); +	*/ +  	SDL_SetRenderDrawColor(this->game_renderer.get(), cam.bg_color.r, cam.bg_color.g,  						   cam.bg_color.b, cam.bg_color.a);  } diff --git a/src/example/rendering.cpp b/src/example/rendering.cpp index c9e62f1..3631c76 100644 --- a/src/example/rendering.cpp +++ b/src/example/rendering.cpp @@ -23,7 +23,7 @@ int main() {  	ComponentManager mgr{};  	RenderSystem sys{mgr}; -	GameObject obj = mgr.new_object("name", "tag", Vector2{0, 0}, 1, 1); +	GameObject obj = mgr.new_object("name", "tag", Vector2{250, 0}, 0, 1);  	GameObject obj1 = mgr.new_object("name", "tag", Vector2{500, 0}, 1, 0.1);  	GameObject obj2 = mgr.new_object("name", "tag", Vector2{800, 0}, 1, 0.1); @@ -32,13 +32,16 @@ int main() {  		Color color(0, 0, 0, 0);  		obj.add_component<Sprite>(make_shared<Texture>("../asset/texture/img.png"), color,  								  FlipSettings{false, false}); -		obj.add_component<Camera>(Color::get_red()); +		Camera & cam = obj.add_component<Camera>(Color::get_red()); +  	} +	/*  	{  		Color color(0, 0, 0, 0);  		obj1.add_component<Sprite>(make_shared<Texture>("../asset/texture/second.png"), color,  								   FlipSettings{true, true});  	} +	*/  	/*  	{ |