CSC3224_Computer_Games_Development / GameEngine / Engine_Physics / SpriteRectangle.h
SpriteRectangle.h
Raw
#pragma once
#include "../Engine_Messaging_System//MessageSystemEvent.h"
#include "../Engine_Json_System/json.h"
#include "../Engine_Resource_Management/ResourceManagement.h"
#include <SFML/Graphics/Sprite.hpp>
#include <string>
// Sprite Rectangle 
class SpriteRectangle : public MessageFromJsonSystemEvent<SpriteRectangle>, public sf::Sprite
{
public:
	static const MessageSystemEventType messageTypeID = MessageSystemEventType::SPRITE_RECTANGLE_TYPE;
	MessageSystemEventType getType() override { return messageTypeID; }
	int getTypeValue() override { return static_cast<int>(messageTypeID); }

	static SpriteRectangle* messageBuildFromJson(Json::Value Engine_PhysicsystemSource, ...);
	Json::Value convertToJson() override;

	SpriteRectangle(std::string spriteTextureID, sf::IntRect spriteRectangle) : _spriteTextureID(spriteTextureID)
	{
		setTextureRect(spriteRectangle);
	};

	std::string getSpriteTextureID() const { return _spriteTextureID; }

	void setSpriteZOrder(int spriteOrder) { _spriteZOrder = spriteOrder; };
	int getSpriteZOrder() const { return _spriteZOrder; };
private:
	int _spriteZOrder;
	std::string _spriteTextureID;
};
// Build Rectangle Sprite from Json (File IO)
inline SpriteRectangle* SpriteRectangle::messageBuildFromJson(Json::Value Engine_PhysicsystemSource, ...)
{
	std::string spriteTextureID = Engine_PhysicsystemSource.get("TextureID", "").asString();
	sf::IntRect spriteTextureRectangle = sf::IntRect(Engine_PhysicsystemSource.get("TextureRectLeft", 0).asInt(),
	                                       Engine_PhysicsystemSource.get("TextureRectTop", 0).asInt(),
	                                       Engine_PhysicsystemSource.get("TextureRectWidth", 32).asInt(),
	                                       Engine_PhysicsystemSource.get("TextureRectHeight", 32).asInt());
	float spritePosX = Engine_PhysicsystemSource.get("PosX", 0).asFloat();
	float spritePosY = Engine_PhysicsystemSource.get("PosY", 0).asFloat();
	auto spriteOriginX = Engine_PhysicsystemSource.get("OriginX", 0).asFloat();
	auto spriteOriginY = Engine_PhysicsystemSource.get("OriginY", 0).asFloat();
	float spriteScaleX = Engine_PhysicsystemSource.get("ScaleX", 1).asFloat();
	float spriteScaleY = Engine_PhysicsystemSource.get("ScaleY", 1).asFloat();
	int spriteZOrder = Engine_PhysicsystemSource.get("Z-Order", 0).asInt();

	SpriteRectangle* spriteRectangle = new SpriteRectangle(spriteTextureID, spriteTextureRectangle);
	spriteRectangle->setPosition(spritePosX, spritePosY);
	spriteRectangle->setOrigin(spriteOriginX, spriteOriginY);
	spriteRectangle->setScale(spriteScaleX, spriteScaleY);
	spriteRectangle->setSpriteZOrder(spriteZOrder);
	return spriteRectangle;
}
// Convert to Json format for parsing messages between the Game Engine and Level (.json files)
inline Json::Value SpriteRectangle::convertToJson()
{
	Json::Value engineSystemSource;
	engineSystemSource["EventType"] = static_cast<int>(this->getType());
	engineSystemSource["TextureID"] = _spriteTextureID;
	engineSystemSource["TextureRectLeft"] = getTextureRect().left;
	engineSystemSource["TextureRectTop"] = getTextureRect().top;
	engineSystemSource["TextureRectWidth"] = getTextureRect().width;
	engineSystemSource["TextureRectHeight"] = getTextureRect().height;
	engineSystemSource["PosX"] = getPosition().x;
	engineSystemSource["PosY"] = getPosition().y;
	engineSystemSource["OriginX"] = getOrigin().x;
	engineSystemSource["OriginY"] = getOrigin().y;
	engineSystemSource["ScaleX"] = getScale().x;
	engineSystemSource["ScaleY"] = getScale().y;
	engineSystemSource["Z-Order"] = getSpriteZOrder();
	return engineSystemSource;
}