GUI Framework

Started by
-1 comments, last by Mybowlcut 16 years, 2 months ago
I've got a design issue... it's more of a block than anything. I have created several classes that allow me to do draw things to the screen in a nice simple way. I've also made these classes compatible with the Observer pattern, but I can't think of a way to use these in unison. I'd like to learn how to translate a button being clicked to increasing volume... or exiting the program... etc. But I want it to be handled neatly, not in some giant switch case in main...
class Screen : public Drawable, public Updateable, public Uncopyable, public Observer
{
public:
	Screen();
	Screen(const std::string& directory);
	virtual ~Screen();

	virtual void Draw(SDL_Surface* screen);
	virtual void Update(const SDL_Event& event_);
	virtual void Notify(Observable* observable, void* oe);
protected:
	virtual void Load(const std::string& directory);
	virtual void Load_Elements(const std::string& directory);
	virtual void Load_Observation(const std::string& directory);

	std::vector<Base_XImage*> elements;
};

class Base_XImage : public Drawable, public Updateable, public Cloneable, public Observable
{
public:
	typedef enum OBSERVABLE_EVENT
	{
		LMB_CLICK,
		RMB_CLICK,
		MOUSE_OVER
	};

	Base_XImage();
	Base_XImage(
		const std::string& name_,
		const std::string& file_name_,
		int position_x,
		int position_y,
		bool is_colour_key_,
		SDL_Colour colour_key_ = SDL_Wrappers::colour(0,0,0));
	Base_XImage(const Base_XImage& rhs);
	virtual ~Base_XImage();
	
	Base_XImage& operator=(const Base_XImage& rhs);

	const std::string& Get_Name() const;
	const std::string& Get_File_Name() const;
	const SDL_Rect& Get_Position() const;
	bool Is_Colour_Key() const;
	const SDL_Colour& Get_Colour_Key() const;
	
	virtual void Load();
	virtual void Draw(SDL_Surface* screen) = 0;
	virtual void Update(const SDL_Event& event_) = 0;
	virtual Base_XImage* Clone() const = 0;
protected:
	static void Check_Opening_Tag(const std::string& buffer);
	static void Check_Closing_Tag(const std::string& buffer);

	std::string name;
	std::string file_name;
	SDL_Rect position;
	bool is_colour_key;
	SDL_Colour colour_key;
	SDL_Surface* surface;
};


As you can see, I've only started to implement the Observer pattern. I don't know how I'm going to actually use it. This is a sample loop of a program using the Screen class:
Draw_Engine DE;
	DE.Initialise(640, 480, 24, "SDL Testing", "C:/WINDOWS/Fonts/Arial.ttf");
	Audio_Engine AE;
	AE.Initialise();

	Screen test_screen("Screens/Screen_Test_Screen/");

	SDL_Event event_;
	bool exit = false;

	while(!exit)
	{
		while(SDL_PollEvent(&event_))
		{
			if(event_.type == SDL_QUIT)
			{
				exit = true;
				break;
			}

			// Update screen elements.
			test_screen.Update(event_);
			// Draw(blit) elements to screen.
			test_screen.Draw(DE.Get_Screen());
			// Draw screen.
			DE.Draw_Screen();
		}
	}

	DE.Clean_Up();
	AE.Clean_Up();

The string parameter passed to the Screen constructor is the directory where all the info for the elements are. For each class (Image, Button, Audible_Button, Draggable_Button, etc.) I create a new .txt file with all the elements of that type that I want to be drawn to the screen:
Quote:< test1 1.png 10 10 0 >
Should I just use something like wxWidgets instead of doing this all on my own? I guess you could say that I'm looking to create a GUI framework.. or use an existing one so I can get on with finishing my game. :)

This topic is closed to new replies.

Advertisement