Une classe GUIButton pour représenter un bouton cliquable

8HcZT

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *