cocos2d-x 3.2 가상패드 만들기( 가상조이스틱, dpad, sneakyinput, virtual pad)

     


cocos2d-x로 게임을 만들고 있는데, 가상패드를 넣기 위해서 구글링을 해보았습니다. 하지만 다 이전버전에서 사용되는 가상패드만 있고 3.2에서는 잘 되지 않더군요. 


i try to create game by using cocos2d-x 3.2 alpha ver. i wanna make virtual d-pad. but i cant find any soruce on google XD. there are old ver code i could find.


sneakyinput이라고 가상패드 오픈소스도 있던데 잘 되지않아서. 에라이! 내가 만들고 말지! 하고 3.2에서 돌아가는 가상 패드 소스를 만들게 되었습니다.


sneakyinput is an open soruce to use dpad. but it didnt operate or i didnt know how to use. so, i decided that Make dpad by myself.




위는 제가 만들고 있는 앱입니다. 캐릭터는 니달리죠. 왼쪽 아래 가상패드가 있고 터치하면 움직입니다. 조이스틱의 움직이는 양만큼 캐릭터가 이동할 수 있도록 설정하였습니다. 조이스틱의 전체 범위를 Rect로 정했기 때문에 가로 세로보다 대각선으로 많이 움직입니다. 전체 범위를 원으로 정한다면 좀더 자연스럽게 만들어 지겠네요 ^^


the video is show that how to operate my pad. character is nidalee in lol XD. she move by moving pad. if pad moved a little, she moved a little too.


아래는 패드를 사용하기위한 .cpp 와  .h 소스입니다.

follow code is ChoPad.cpp and ChoPad.h


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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
//
//  ChoPad.cpp
//  
//
//  Created by Cho on 2014. 8. 30..
//
//
 
#include "ChoPad.h"
 
#include "HelloWorldScene.h"
USING_NS_CC;
using namespace cocos2d;
 
ChoPad::ChoPad()
{
}
 
ChoPad::~ChoPad()
{
    
}
 
void ChoPad::create(Layer* layer, Point point)
{
    auto sprite = Sprite::create("analogue_bg.png");
    sprite->setPosition(point);
    sprite->setScale(PADSIZE);
    sprite->setOpacity(100);
    _joystickPad = sprite;
    layer->addChild(sprite);
    
    sprite = Sprite::create("analogue_handle.png");
    sprite->setPosition(point);
    sprite->setScale(PADSIZE);
    sprite->setOpacity(150);
    layer->addChild(sprite);
    _joystick = sprite;
    
    _startPoint = point;
    _joystickTouched = false;
    
    
}
 
float ChoPad::getDLength()
{
    _joystickPoint = _joystick->getPosition();
    
    return _dLength = sqrtf((_startPoint.x-_joystickPoint.x)*(_startPoint.x-_joystickPoint.x)+(_startPoint.y-_joystickPoint.y)*(_startPoint.y-_joystickPoint.y))/((_joystickPad->getContentSize().width/2)*PADSIZE);
}
 
Point ChoPad::getDPoint()
{
    _joystickPoint = _joystick->getPosition();
    _dPoint.x = (_joystickPoint.x - _startPoint.x)/((_joystickPad->getContentSize().width/2)*PADSIZE);
    _dPoint.y = (_joystickPoint.y - _startPoint.y)/((_joystickPad->getContentSize().width/2)*PADSIZE);
    return _dPoint;
}
 
 
void ChoPad::TouchesBegan(const std::vector<Touch *> &touches, cocos2d::Event *unused_event)
{
    std::vector<Touch *>::const_iterator it = touches.begin();
    Touch* touch;
    Point tap;
    
    for (int i =0; i<touches.size(); i++) {
        touch = (Touch*)(*it);
        if(touch){
            tap = touch->getLocation();
            
            if (_joystickPad->getBoundingBox().containsPoint(tap)&&_joystickTouched==false) {
                
                _joystick->setPosition(touch->getLocation());
                _joystickTouched = true;
            }
        }
        it++;
    }
}
 
 
void ChoPad::TouchesMoved(const std::vector<Touch *> &touches, cocos2d::Event *unused_event)
{
    std::vector<Touch *>::const_iterator it = touches.begin();
    Touch* touch;
    Point tap;
    Point ntap;
    
    if (_joystickTouched) {
        
        for (int i =0; i<touches.size(); i++) {
        
            touch = (Touch*)(*it);
            if(touch){
                tap = touch->getLocation();
                CCLOG("%f , %f",tap.x,_startPoint.x+(_joystickPad->getContentSize().width/2)*PADSIZE);
            
                if (tap.x>_startPoint.x+(_joystickPad->getContentSize().width/2)*PADSIZE) {
                    ntap.x = _startPoint.x+(_joystickPad->getContentSize().width/2)*PADSIZE;
                }else if(tap.x<_startPoint.x-(_joystickPad->getContentSize().width/2)*PADSIZE) {
                    ntap.x = _startPoint.x-(_joystickPad->getContentSize().width/2)*PADSIZE;
                }else{
                    ntap.x = tap.x;
                }
                
 
                
                if (tap.y>_startPoint.y+(_joystickPad->getContentSize().height/2)*PADSIZE) {
                    ntap.y = _startPoint.y+(_joystickPad->getContentSize().height/2)*PADSIZE;
                }else if (tap.y<_startPoint.y-(_joystickPad->getContentSize().height/2)*PADSIZE) {
                    ntap.y = _startPoint.y-(_joystickPad->getContentSize().height/2)*PADSIZE;
                }
                else{
                    ntap.y = tap.y;
                }
            
                
                _joystick->setPosition(ntap);
                
                
            
        }
        it++;
    }
    }
 
}
 
 
void ChoPad::TouchesEnded(const std::vector<Touch *> &touches, cocos2d::Event *unused_event)
{
    _joystick->setPosition(_startPoint);
    _joystickTouched = false;
}
 
void ChoPad::TouchesCancelled(const std::vector<Touch *> &touches, cocos2d::Event *unused_event)
{
    
    _joystick->setPosition(_startPoint);
    _joystickTouched =false;
}



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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//
//  ChoPad.h
// 
//
//  Created by Cho on 2014. 8. 30..
//
//
 
#ifndef __testLol__ChoPad__
#define __testLol__ChoPad__
 
 
 
#include "cocos2d.h"
 
#define PADSIZE 0.5
 
using namespace cocos2d;
USING_NS_CC;
 
 
 
class HelloWorld;
 
class ChoPad{
    
public:
    ChoPad();
    ~ChoPad(void);
    
   
    void initPad();
    void create(Layer* layer, Point point);
    
    
    Point _startPoint;
    Point _joystickPoint;
    Sprite* _joystick;
    Sprite* _joystickPad;
    
    bool _joystickTouched;
    
    
    
    //--------handle direct
    Point _dPoint;
    float _dLength;
    
    Point getDPoint();
    float getDLength();
    
    
    
    //--------touch events
    virtual void TouchesBegan(const std::vector<Touch*>&touches, Event *unused_event);
    virtual void TouchesMoved(const std::vector<Touch*>&touches, Event *unused_event);
    virtual void TouchesEnded(const std::vector<Touch*>&touches, Event *unused_event);
    virtual void TouchesCancelled(const std::vector<Touch*>&touches, Event *unused_event);
    
    
    
private:
 
    
};
 
 
#endif /* defined(__ChoPad__) */
 



PADSIZE는 전체적인 스트라이프의 사이즈입니다. 그림파일이 너무 크면 1보다 작은값을 넣어서 축소시키고, 너무 작으면 1보다 높은값을 주어서 확대시킬수 있습니다. helloworldscene.h는 가상패드를 사용하는 레이어의 헤더파일을 쓰시면 됩니다.


padsize is Stripe size(u can resize it). HelloWorldScene.h is main header file.


사용법은 간단합니다.


ChoPad chopad = new ChoPad();

chopad->create(this, Point); 


하시면 됩니다.  Point는 가상패드가 표시되는 좌표를 넣으시면 됩니다. 패드를 움직이는 것은 터치 메소드에 각각의 터치 메소드를 넣으시면 됩니다.


Point = input Point where u want to make pad.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void HelloWorld::onTouchesBegan(const std::vector<Touch *> &touches, cocos2d::Event *unused_event)
{
    chopad->TouchesBegan(touches, unused_event);
    
}
void HelloWorld::onTouchesMoved(const std::vector<Touch *> &touches, cocos2d::Event *unused_event)
{
    chopad->TouchesMoved(touches, unused_event);
}
 
void HelloWorld::onTouchesEnded(const std::vector<Touch *> &touches, cocos2d::Event *unused_event)
{
    chopad->TouchesEnded(touches, unused_event);
 
}
 
void HelloWorld::onTouchesCancelled(const std::vector<Touch *> &touches, cocos2d::Event *unused_event)
{
    chopad->TouchesCancelled(touches, unused_event);
}


조이스틱이 이동된 값을 받고싶을땐 getDPoint()와 getDLength()를 사용합니다.


getDPoint() 는 원점을 기준으로 조이스틱이 얼마나 움직였는지 좌표로 나타냅니다.

getDLength() 는 원점과 움직인 조이스틱의 길이를 나타냅니다.


getDPoint() is return joystick's Point when it is moved. around (-1~1 , -1~1)

getDLength() is return length how long is distance to joystick from zero point. around -1.414 ~ 1.414 


가로 세로를 기준으로, DPoint는 (-1~1, -1~1)의 값을 갖고, DLength의 경우 -1.414~1.414의 값을 가집니다. (대각선일 경우 1.414의 값)


이 값을 이용해서 객체를 움직이면 됩니다 ^^


you can make some move event by using this value, DPoint and DLength.


finally, im sorry about my low level english .... 

반응형

댓글

Designed by JB FACTORY