Sign in to follow this  
Black Knight

Unity Basic event handling

Recommended Posts

After reading through this : Link I decided I should do something similar for the interface elements in my project. So I have come up with this :


#include <iostream>
#include <boost/shared_ptr.hpp>
#include <map>


//
// base gui event class
//
class IGUIBaseEvent
{
public :
	virtual void execute()=0;
};

//gui event class
template<class T>
class GUIEvent:public IGUIBaseEvent
{
public:
	GUIEvent(T& obj,void (T::*funcPtr)())
		: _obj(obj),func(funcPtr)
	{}
	
	virtual void execute(){(_obj.*func)();}
	
protected:
	T& _obj;
	void (T::*func)();
};

//
// base class for all interface items 
//
class GUIElement
{
public:
	GUIElement()
	{
		
	}
	boost::shared_ptr<IGUIBaseEvent> onClick;
	boost::shared_ptr<IGUIBaseEvent> onPressed;
	boost::shared_ptr<IGUIBaseEvent> onOver;
	
	//check input?
	virtual void update()
	{
		//if(clicked && onClick)
		 onClick->execute();

		//if(pressed && onPressed)
		// onClick->execute();

	    //if(over && onOver)
		// onOver->execute();
		
	}

};

//
class Interface
{
public:
	Interface()
	{
		m_EndTurnButton.reset(new GUIElement());
		m_EndTurnButton->onClick.reset(new GUIEvent<Interface>(*this,&Interface::onEndTurnClicked));
	}

	void update()
	{
		m_EndTurnButton->update();

		//iterate over all gui items and update them 
		//std::map<unsigned int,boost::shared_ptr<GUIElement>>::iterator it;
		//for(it = m_GUIElements.begin(); it!= m_GUIElements.end(); ++it){
		//	it->second->update();
		//}
	}
private:
	//called when the end turn button is clicked
	void onEndTurnClicked()
	{
		std::cout<<"end turn clicked event fired!\n";
	}
	
	//end turn button
	boost::shared_ptr<GUIElement> m_EndTurnButton;
	//store all interface items in a std::map later
	//std::map<unsigned int,boost::shared_ptr<GUIElement>> m_GUIElements;
};

int main()
{
	boost::shared_ptr<Interface> inter(new Interface());
	
	inter->update();

	return 0;
}

Eventually all gui elements will be store in a std::map and iterated over to check input and they will call the event handlers accordingly.Button states and cursor position will be sent as parameters to GUIElement::update but i left them out as this is just a test program.I haven't included anything into the actual program.Anyway here comes my questions : 1) On this line : virtual void execute(){(_obj.*func)();} _obj is used to call the pointer to member?So _obj.*func points to Interface::onEndTurnClicked?There is now way to call a pointer to member function without a object instance right? I mean _obj must be used to call func. 2) Would it be a problem to always check if the on* shared_ptrs are valid inside GUIElement::update? I guess not because if there isn't any handler assigned to them then even if the cursor is over the element the event will not be fired. Any other suggestions?

Share this post


Link to post
Share on other sites
Rewritten in boost::bind & boost::function
Neat!


#include <iostream>
#include <map>

#include <boost/shared_ptr.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>


//
// base class for all interface items
//
class GUIElement
{
public:
GUIElement()
{

}

boost::function<void()> onClick;
boost::function<void()> onPressed;
boost::function<void()> onOver;

//check input?
virtual void update()
{
if(onClick)
onClick();

if(onPressed)
onPressed();
if(onOver)
onOver();
}

};

//
class Interface
{
public:
Interface()
{
m_EndTurnButton.reset(new GUIElement());
m_EndTurnButton->onClick = boost::bind(&Interface::onEndTurnClicked,this);

}
void update()
{
m_EndTurnButton->update();

//iterate over all gui items and update them
//std::map<unsigned int,boost::shared_ptr<GUIElement>>::iterator it;
//for(it = m_GUIElements.begin(); it!= m_GUIElements.end(); ++it){
// it->second->update();
//}
}
private:
//called when the end turn button is clicked
void onEndTurnClicked()
{
std::cout<<"end turn clicked event fired!\n";
}

//end turn button
boost::shared_ptr<GUIElement> m_EndTurnButton;
//store all interface items in a std::map later
//std::map<unsigned int,boost::shared_ptr<GUIElement>> m_GUIElements;
};

int main()
{
boost::shared_ptr<Interface> inter(new Interface());

inter->update();

return 0;
}

Share this post


Link to post
Share on other sites
Signals and slots are for broadcasting notifications with minimal coupling. Function and bind are for treating functions like proper objects. You may find yourself using them in similar areas of the code but they do different things.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Partner Spotlight

  • Forum Statistics

    • Total Topics
      627638
    • Total Posts
      2978327
  • Similar Content

    • By Strifexxx
      Hi guys, check out our new game about sticks. Feedback welcome!
      Download on Google Play: https://play.google.com/store/apps/details?id=com.stickman.annihilation.dismount
       
      Youtube: 

       
      Stickman Dismount 2 Annihilation is a sequel to the legendary game of survival, where to make incredible tricks, driving different transport and getting into different crash! The game is made in the best traditions of simulator games with ragdoll physics elements. Make incredible jumps and tricks and destroy the enemy! Your task is make the finish alive or dead! 
       





      Website: http://strifexxx.wixsite.com/cyberpony
      Facebook: https://www.facebook.com/groups/577850349043463/
      VK: https://vk.com/club122273704
    • By Knife Entertainment

      New indie game development studio Knife Entertainment expects to release their debut project My Little Story: Reborn.

      Reborn is the first-person horror containing the spirit of the occultism and mystery. We decided to give players something, which they miss so much in games of this genre: you don't have to hide in dark corners trying to escape from some invulnerable monster. It will be vice versa. We gave players everything to make even the most savage and malicious enemy tremble with fear. You'll face the cruel world full of danger, to expose dark secrets and to fight with ancient evil.

      Our principal credo is our great attention to various details. That's why there are a lot of easter eggs in the form of references and visual quoting of such cult films, games and art works, as The Evil Dead, True Detective, Silent Hill, etc. The release is scheduled for the end of this year.
      Contact us: knifeent@gmail.com
       
       






       
    • By ilovegames
      Have you ever dreamed of fighting with dinosaurs? If so, then this game is for you. Hold out against the bloodthirsty prehistoric lizards for as long as possible. Seize more weapons, including a shot gun, sword and other stuff. Good luck!
      Download https://falcoware.com/DinoSurvival.php



    • By INTwindwolf
      COMPANY AND THE PROJECT
       

      We are an indie game studio consisted of professional and friendly people. Additionally, we are a team of skilled artists and dedicated indie enthusiasts. Our current project is INT, developed on Unity Engine 5 for platforms Windows, Linux, and Mac.
      INT is a 3D Sci-fi RPG with a strong emphasis on story, role playing, and innovative RPG features such as randomized companions. The focus is on the journey through a war-torn world with fast-paced combat against hordes of enemies. The player must accomplish quests like a traditional RPG, complete objectives, and meet lively crew members who will aid in the player's survival. Throughout the game you can side and complete missions through criminal cartels, and the two major combatants, the UCE and ACP, of the Interstellar Civil War.
      Please note that all of our current positions are remote work. You will not be required to travel.
      For more information about us, follow the links listed below.
      INT Official website
      Steam Greenlight
      IndieDB page
      Also follow social media platforms for the latest news regarding our projects.
      Facebook
      Twitter
       
      TALENTS NEEDED
       
      Animation Rigger
      Community Manager
      Website Administrator
       
      REVENUE - SHARE
       
      This is the perfect opportunity to get into the game development industry. Being an Indie team we do not have the creative restrictions often imposed by publishers or other third parties. We are extremely conscientious of our work and continuously uphold a high level of quality throughout our project.
      We are unable to offer wages or per-item payments at this time. However revenue-sharing from crowd-funding is offered to team members who contribute 15-20 hours per week to company projects, as well as maintain constant communication and adhere to deadlines. Currently the crowd-funding campaign is scheduled for the year 2018. Your understanding is dearly appreciated.
       
      Thank you for your time! We look forward to hearing from you!
       
      John Shen
      HR Lead
      Starboard Games LLC
    • By Misantes
      Hey everyone
      I've hit a milestone for a side-project of mine I've been working on for some time. It's been a frustrating labor of love, but reached my version 1.0 mark recently
      The asset can be used to create procedural music configurations that are editable in real time in a game. You're able to edit dozens of variables like the scale, mode, tempo, instruments, effects and dozens of other settings to react and adapt to gameplay or other events (or just use it as an easy tool to custom make music for your game). 
      It's available on the unity asset store here: https://www.assetstore.unity3d.com/#!/content/99791
      A demo is available on my github page: https://stickandbindlegames.github.io
      Video Link-Main: https://youtu.be/kDLc6GFdZTk
      Video Link-Presets showcase: https://youtu.be/dcVjY5rkUqU
      Video Link-Features Overview: https://youtu.be/TGQM11iRRUQ
      Video Link-Chiptune example: https://youtu.be/P3BNIbOhSfU
      It's still in active development, despite this release, so I'd be very interested in any feedback ( good or bad), advice, or suggestions for what may make it more appealing to you as developers. It'd be useful to know what features would make it more useful to you as a developer, or feedback on any aspect of the player, really, as I have a few directions I can take the generator for future updates.
      Thanks for your time! I look forward to anyone's thoughts :).

  • Popular Now