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 ....
'Study > Cocos2d-x 3.x' 카테고리의 다른 글
[cocos2d-x 3.6] 포코팡류 게임 만들기~! (2) 게임볼 배치, 클릭 이벤트 (0) | 2015.06.16 |
---|---|
[cocos2d-x 3.6] 포코팡류 게임 만들기~! (2) | 2015.05.31 |
5가지 실전 게임으로 배우는 코코스2d-x(cocos2d-x) 모바일 2D 게임 개발 두번째 예제(4) (0) | 2014.08.28 |
5가지 실전 게임으로 배우는 코코스2d-x(cocos2d-x) 모바일 2D 게임 개발 두번째 예제(3) (0) | 2014.08.28 |
5가지 실전 게임으로 배우는 코코스2d-x(cocos2d-x) 모바일 2D 게임 개발 두번째 예제(2) (2) | 2014.08.26 |