'이벤트'에 해당되는 글 1건

  1. 2017.04.06 [C++] 이벤트 콜백 함수(Button)만들기!
2017. 4. 6. 13:21

안녕하세요. 게임 개발자 놀이터 입니다.


C#에서 자주썻던 이벤트 콜백 함수를 C++에서 사용하고 싶어서 알아봤습니다.


여러번 실패 끝에 성공해서 이곳에 공유하려고 합니다~


코드먼저 보시죠!


헤더 파일입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Button : public CSprite
{
public:
    Button();
    ~Button();
 
private:
    typedef std::function<void()> Event; //인수가 없는것
 
    short state;
    Event OnClick;
    Event OnMouseOver;
    Event OnMouseOut;
 
public:
 
    void SetOnClick(Event Function);
    void SetOnMouseOver(Event Function);
    void SetOnMouseOut(Event Function);
 
    virtual void MouseEvent(DIMOUSESTATE MouseState) override;
 
 
 
};
cs


여기서 상속받는 CSprite와 가상함수 MouseEvent는 무시하셔도됩니다. ( 제가 만든 엔진에 일부입니다..)


다음은 소스 코드입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Button::Button()
{
    state = 0;
    OnClick = NULL;
    OnMouseOver = NULL;
    OnMouseOut = NULL;
}
 
 
Button::~Button()
{
}
 
void Button::SetOnClick(Event Function)
{
    OnClick = std::move(Function);
}
void Button::SetOnMouseOver(Event Function)
{
    OnMouseOver = std::move(Function);
}
void Button::SetOnMouseOut(Event Function)
{
    OnMouseOut = std::move(Function);
}
 
void Button::MouseEvent(DIMOUSESTATE MouseState)
{
    CPoint mouse = Director::GetInstance()->Get_Mouse();
 
    if (this->GetBoundingBox().containsPoint(mouse) && state != 1)
    {
        //MouseOver
        if (OnMouseOver != NULL)
            OnMouseOver();
        state = 1;
    }
    else if (!this->GetBoundingBox().containsPoint(mouse) && state != 0)
    {
        //MouseOut
        if (OnMouseOut != NULL)
            OnMouseOut();
        state = 0;
    }
    else if (this->GetBoundingBox().containsPoint(mouse) && state == 1)
    {
        //MouseClick
        if (MouseState.rgbButtons[0& 0x80)
        {
            if (OnClick != NULL)
                OnClick();
            state = 2;
        }
    }
}
cs



음.. 소스는 딱히 볼게 없군요!


std::move로 넣어줘야 한다는것 정도!?


그럼 적용법을 알아볼까요.


1
2
3
4
5
6
7
8
9
10
11
12
void CTestScene::TestFunction()
{
    CCLog("버튼 테스트 함수 호출!");
}
 
void CTestScene::ButtonInit()
{
    ButtonTest = new Button();
    ButtonTest->SetOnClick(std::bind(&CTitleScene::TestFunction, this));
 
    m_default_Layer->AddChild(ButtonTest);
}
cs


여기서 중요한 부분은 9번째줄이네요


std::bind로 넘겨주는것입니다.



음.. 뭐랄까.. 무언가 만들었다기보단 있는 기능을 사용한거라 글을 적기 애매하네요.


질문은 댓글로 부탁드려요

Posted by 시리시안

댓글을 달아 주세요