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 시리시안
2017. 4. 2. 21:39


오늘은 인터페이스를 짜는데 오래 걸렸다.



기본적인 캐릭터를 짜고 상속받아서 학생만 우선 구현했다.


아마 학생과 고대의 존재 1명만 우선 구현해서 진행할듯..


아직 카드 드로우 기능과 지역이동.. 전체적인 페이즈가 구현이 안되서 테스트도 잘안되네..


블로그에 글쓸만큼 뭔가 보일정도로 작업이 된게 아니라 씁슬하지만 그대로 남겨놔야지

(GIF입니다. 클릭해주세요)




포토샵 다루는게 정말 힘들다.. ㅠㅠ

Posted by 시리시안
2017. 4. 2. 00:40


인게임 UI를 만들고보니


캐릭터 선택과 고대의 존재 선택이 필요하다는걸 알았습니다.


랜덤 선택과 직접 선택이 가능해야하기 때문에.



인게임이 들어가기전에 위와같이 띄어주기로했습니다.



그리고 게임 매니저에 다음과 같이 추가했습니다.



그리고 버튼을 이용해서 각종 보스와 각종 캐릭터를 셀렉하게 만들었습니다


(하지만 캐릭터별, 보스별 기능은 안만들었으니..)


(클릭하시면 GIF로 애니메이션 재생이 됩니다.)





내일은 드디어 인게임..!!


Posted by 시리시안