DATA_OLD/Cocos2d-x 기능성 게임 개발과정
[D_012] Vector를 이용한 데이터 관리 예제
웽웽
2014. 11. 26. 11:46
연속해서 생성되는 데이터들을 관리하기에는 vector가 좋다.
HelloWorldScene.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 | #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" #include "SimpleAudioEngine.h" USING_NS_CC; using namespace CocosDenshion; class HelloWorld : public cocos2d::Layer { public: static cocos2d::Scene* createScene(); virtual bool init(); CREATE_FUNC(HelloWorld); //생성될 스마일 관리를 위한 Vector 선언 Vector<Sprite*> smile; //스케줄을 이용해 스마일 생성 void setSmile(float delta); bool onTouchBegan(Touch* touch, Event* unused_event); void onTouchEnded(Touch* touch, Event* unused_event); }; #endif // __HELLOWORLD_SCENE_H__ |
HelloWorldScene.cpp
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 | #include "HelloWorldScene.h" USING_NS_CC; Scene* HelloWorld::createScene() { // 'scene' is an autorelease object auto scene = Scene::create(); // 'layer' is an autorelease object auto layer = HelloWorld::create(); // add layer as a child to scene scene->addChild(layer); // return the scene return scene; } // on "init" you need to initialize your instance bool HelloWorld::init() { ////////////////////////////// // 1. super init first if ( !Layer::init() ) { return false; } //랜덤 좌표용 srand srand(time(NULL)); smile.clear(); auto listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this); listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this); Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this); //배경음 재생 SimpleAudioEngine::getInstance()->playBackgroundMusic("oth_5.mp3"); //1초에 한번씩 스케줄링하여 스마일 생성 this->schedule(schedule_selector(HelloWorld::setSmile), 1.0f); return true; } bool HelloWorld::onTouchBegan(Touch* touch, Event* unused_event) { Vec2 pos = touch->getLocation(); for (Sprite* spr : smile) { if (spr->getBoundingBox().containsPoint(pos)) { spr->setTexture("CloseSelected.png"); return true; } } return false; //엉뚱한데 찍은거면 터치무브,엔드 막음 } //클릭이 유효하고, 클릭 종료시 위치가 아이콘 위면 화면에서 삭제 및 벡터에서 제거 void HelloWorld::onTouchEnded(Touch* touch, Event* unused_event) { for (Sprite* spr : smile) { if (spr->getBoundingBox().containsPoint(touch->getLocation())) { CCLOG("remove"); smile.eraseObject(spr); spr->removeFromParent(); return; //리턴을 안해주면 포문이 계속 돌면서 에러남. 중요!! } else { spr->setTexture("CloseNormal.png"); } } } //랜덤한 위치에 아이콘 생성 void HelloWorld::setSmile(float delta) { auto spr = Sprite::create("CloseNormal.png"); spr->setTag(100); spr->setPosition(Vec2(rand() % 480, rand() % 320)); smile.pushBack(spr); this->addChild(spr); } |