Intro :
Parfois nous avons besoin d’afficher un bouton pour rendre l’interface utilisateur (GUI) plus dynamique. Le bouton peut afficher une autre image lorsqu’il est reste cliqué dessus !
Prérequis :
– Avoir lu la classe GUIWidget
Contenu :
Voici le fichier GUIButton.h :
#ifndef GUI_BUTTON_H
#define GUI_BUTTON_H
#include <d3dx10math.h>
#include <iostream>
#include "Sprite2D.h"
#include "GUIImage.h"
#include "Defines.h"
class GUIButton : public GUIImage
{
public:
enum ButtonState
{
NON_ACTIVE,
HOVER,
CLICKED,
PUSHED_OUT
};
GUIButton(const std::string& sName, const std::string& sTextureName, const std::string& sTextureClickedName = NONE,
const std::string& sTextureHoverName = NONE);
virtual ~GUIButton();
virtual void Update(float fTimeSinceLastFrame);
ButtonState GetState();
void SetState(ButtonState state);
void SetHoverOnImage();
void SetClickedOnImage();
void SetNormalImage();
bool IsClickedOn();
bool IsPushedOut();
bool IsNonActive();
private:
ButtonState m_state;
std::string m_sNormalTextureFile;
std::string m_sClickedOnTextureFile;
std::string m_sHoverOnTextureFile;
bool m_bClickedOn;
bool m_bHover;
bool m_bHasClickedOnImage;
bool m_bHasHoverdOnImage;
bool m_bMouseButtonReleased;
};
#endif
Voici le fichier GUIButton.cpp :
#include "GUIButton.h"
#include "InputManager.h"
#include "GUIManager.h"
#include "Utils.h"
GUIButton::GUIButton(const std::string& sName, const std::string& sTextureName, const std::string& sTextureClickedName,
const std::string& sTextureHoverName) :
GUIImage(sName, sTextureName),
m_state(NON_ACTIVE),
m_sNormalTextureFile(sTextureName),
m_sClickedOnTextureFile(sTextureClickedName),
m_sHoverOnTextureFile(sTextureHoverName),
m_bClickedOn(false),
m_bHover(false),
m_bMouseButtonReleased(false),
m_bHasClickedOnImage(false),
m_bHasHoverdOnImage(false)
{
// Image quand on appuie
if (Utils::IsFileReadable(sTextureClickedName))
{
m_bHasClickedOnImage = true;
}
// Image quand on survole
if (Utils::IsFileReadable(sTextureHoverName))
{
m_bHasHoverdOnImage = true;
}
}
GUIButton::~GUIButton()
{
}
void GUIButton::Update(float fTimeSinceLastFrame)
{
if (!IsVisible())
{
return;
}
int x, y;
INPUT_MANAGER->GetAbsMouseLocation(x, y);
if (IsActive())
{
if (IsCollidingWithMousePointer(x, y)
&& GUI_MANAGER->IsWidgetFirstOverlapping(this))
{
SetState(ButtonState::HOVER);
m_bHover = true;
SetHoverOnImage();
if (INPUT_MANAGER->IsMouseButtonDown(MOUSE_LEFT_BUTTON_DOWN))
{
m_bClickedOn = true;
SetState(ButtonState::CLICKED);
GUIParameters param;
param << GetState();
SendEventToListeners(param);
SetClickedOnImage();
}
else if (m_bClickedOn)
{
SetNormalImage();
m_bClickedOn = false;
SetState(ButtonState::PUSHED_OUT);
}
}
else if (m_bHover)
{
SetState(ButtonState::NON_ACTIVE);
SetNormalImage();
m_bHover = false;
}
else
{
m_bClickedOn = false;
}
}
GUIImage::Update(fTimeSinceLastFrame);
}
GUIButton::ButtonState GUIButton::GetState()
{
return m_state;
}
void GUIButton::SetState(ButtonState state)
{
m_state = state;
}
bool GUIButton::IsClickedOn()
{
return GetState() == GUIButton::ButtonState::CLICKED && IsVisible();
}
bool GUIButton::IsPushedOut()
{
return GetState() == GUIButton::ButtonState::PUSHED_OUT && IsVisible();
}
bool GUIButton::IsNonActive()
{
return GetState() == GUIButton::ButtonState::NON_ACTIVE && IsVisible();
}
void GUIButton::SetClickedOnImage()
{
if (m_bHasClickedOnImage)
{
SetTextureImage(m_sClickedOnTextureFile);
}
}
void GUIButton::SetNormalImage()
{
SetTextureImage(m_sNormalTextureFile);
}
void GUIButton::SetHoverOnImage()
{
if (m_bHasHoverdOnImage)
{
SetTextureImage(m_sHoverOnTextureFile);
}
}
Résumé :
Voici une classe qui permet d’afficher un bouton cliquable.

