#include "GameScene.h" USING_NS_CC; Scene* GameScene::createScene() { auto scene = Scene::create(); auto layer = GameScene::create(); scene->addChild(layer); return scene; } // on "init" you need to initialize your instance bool GameScene::init() { ////////////////////////////// // 1. super init first if ( !Layer::init() ) { return false; } srand((int)time(NULL)); winSize = Director::getInstance()->getWinSize(); listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan = CC_CALLBACK_2(GameScene::onTouchBegan, this); Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this); initGameData(); // initBG(); initTopMenuLabel(); initCard(); initOX(); initReady(); initStart(); initClear(); initGameOver(); actionReady(); return true; } void GameScene::initGameData() {//게임 새로 시작 시에 설정해주는 것들 matchNum = 0; //맞춘 카드 수 초기화 countCard = 0; //현재 위치한 정답의 배열번호 life = NUM_LIFE; //라이프 초기화 clickFlag = false; isEnded = false; for (int i = 0; i < 4; i++) { card[i] = rand()%NUM_CARD; } } void GameScene::initBG() { auto spr = Sprite::create("game/game-bg.png"); spr->setPosition(winSize.width / 2, winSize.height / 2); this->addChild(spr); } void GameScene::initTopMenuLabel() { auto labelCard = Label::createWithTTF("", "kenvector_future.ttf", 20); labelCard->setTag(TAG_LABEL_CARD); labelCard->setAnchorPoint(Vec2(0, 1)); labelCard->setPosition(Vec2(10, winSize.height - TAG_MENU_LABEL_PADDING)); this->addChild(labelCard); auto labelLife = Label::createWithTTF("", "kenvector_future.ttf", 20); labelLife->setTag(TAG_LABEL_LIFE); labelLife->setAnchorPoint(Vec2(1, 1)); labelLife->setPosition(Vec2(winSize.width - TAG_MENU_LABEL_PADDING, winSize.height-10)); this->addChild(labelLife); setLabelCard(); setLabelLife(); } void GameScene::setLabelCard() { auto cardLabel = (Label*)this->getChildByTag(TAG_LABEL_CARD); cardLabel->setString(StringUtils::format("CARD : %d/%d", matchNum, NUM_CLEAR)); } void GameScene::setLabelLife() { auto lifeLabel = (Label*)this->getChildByTag(TAG_LABEL_LIFE); lifeLabel->setString(StringUtils::format("LIFE : %d", life)); } void GameScene::initCard() //이부분을 좀더 손보면 좋을 듯 { for (int i = 0; i < NUM_CARD; i++) { auto spr = Sprite::create("game/card-back.png"); spr->setPosition(Vec2((winSize.width / 2) - (CARD_PADDING / 2) + CARD_PADDING*(i%NUM_COLUMN), winSize.height / 2 + CARD_PADDING - (CARD_PADDING)*(i / NUM_COLUMN))); this->addChild(spr); } for (int i = 0; i < NUM_CARD; i++) { auto sprFront = Sprite::create(StringUtils::format("game/card_%d.png", i + 1)); sprFront->setPosition(Vec2((winSize.width / 2) - (CARD_PADDING / 2) + CARD_PADDING*(i % NUM_COLUMN), winSize.height / 2 + CARD_PADDING - (CARD_PADDING)*(i / NUM_COLUMN))); sprFront->setTag(TAG_SPRITE_CARD + i); sprFront->setVisible(false); this->addChild(sprFront); } } void GameScene::initReady() { auto label = Label::createWithSystemFont("R E A D Y", "", 40); label->setTag(TAG_LABEL_READY); label->setColor(Color3B::BLACK); label->setPosition(winSize.width / 2, winSize.height / 2 + winSize.height); this->addChild(label); } void GameScene::actionReady() { auto label = (Label*)this->getChildByTag(TAG_LABEL_READY); label->runAction(Sequence::create( EaseBounceOut::create( MoveBy::create(1.0f, Vec2(0, -winSize.height)) ), DelayTime::create(1.0f), Spawn::create(MoveBy::create(0.5f, Vec2(0, -winSize.height)), CallFunc::create(CC_CALLBACK_0(GameScene::endReady, this))), NULL)); } void GameScene::endReady() { actionStart(); } void GameScene::initStart() { auto label = Label::createWithSystemFont("START!!", "", 40); label->setTag(TAG_LABEL_START); label->setColor(Color3B::BLACK); label->setPosition(winSize.width / 2, winSize.height / 2 + winSize.height); this->addChild(label); } void GameScene::actionStart() { auto label = (Label*)this->getChildByTag(TAG_LABEL_START); label->runAction(Sequence::create( EaseBounceOut::create(MoveBy::create(1.0f, Vec2(0, -winSize.height))), DelayTime::create(1.0f), MoveBy::create(0.5f, Vec2(0, -winSize.height)), CallFunc::create(CC_CALLBACK_0(GameScene::endStart, this)), NULL)); } void GameScene::endStart() { CCLOG("endSTART"); actionCard(); //터치를 가능하게 하는 메소드가 추가되어야할듯? } void GameScene::actionCard() //이부분에서 endCard불러주는게 중요하다 { for (int i = 0; i < NUM_CLEAR ; i++) { auto spr = (Sprite*)this->getChildByTag(TAG_SPRITE_CARD + card[i]); spr->runAction(Sequence::create( DelayTime::create(0.7f*i), Show::create(), DelayTime::create(0.5f), Hide::create(), NULL)); } this->runAction(Sequence::create( DelayTime::create(0.7f*NUM_CLEAR + 0.5f), CallFunc::create(CC_CALLBACK_0(GameScene::endCard, this)), NULL)); //endCard를 불러주면 터치가 가능하게 된다 //하지만 위에서 수행하는 for문의 시간이 5초가량 되는데, for문 밖에서 부른다고 5초 후에 부르는게 아니다. //그냥 불러주게 되면, 정답카드가 뒤집어지는동안 카드가 막 뒤집어질수있다. //그렇기 때문에, 5초동안 기다리다가 불러주도록 해야 제대로 수행된다. } void GameScene::endCard() { //게임 시작(터치 가능하게) CCLOG("endCard() / clickEnable true"); clickEnable(true); } void GameScene::showCard( Sprite* spr ) { spr->runAction(Sequence::create( Show::create(), DelayTime::create(0.5f), Hide::create(), // CallFunc::create(CC_CALLBACK_0(GameScene::clickEnable, this, true)), NULL)); } bool GameScene::onTouchBegan(Touch* touch, Event* unused_event) { if (clickFlag && !isEnded) //클릭플래그가 true일때만 실행 { // clickEnable(false); //한번 클릭되면 동작끝날때까지 터치안됨 auto pos = touch->getLocation(); //터치 지점 좌표 Rect rect[NUM_CARD]; //카드들의 위치를 받아와서 터치포인트와 비교 for (int i = 0; i < NUM_CARD; i++) { auto spr = (Sprite*)this->getChildByTag(TAG_SPRITE_CARD + i); rect[i] = spr->getBoundingBox(); if (rect[i].containsPoint(pos)) { showCard(spr); if ( i == card[countCard] ) { actionOX( true ); matchNum++; setLabelCard(); if (countCard == NUM_CLEAR-1) //클리어배열의 마지막에 도달하면 { actionGameEnd( true ); return true; } countCard++; } else { actionOX(false); life--; setLabelLife(); if (life <= 0) { actionGameEnd( false ); return true; } } } } } return false; } void GameScene::clickEnable(bool flag) { clickFlag = flag; } void GameScene::initGameOver() { auto label = Label::createWithSystemFont("Game oveR", "", 40); label->setColor(Color3B::BLACK); label->setTag(TAG_LABEL_GAMEOVER); label->setPosition(winSize.width / 2, winSize.height / 2); label->setOpacity(0); this->addChild(label); } void GameScene::initClear() { auto label = Label::createWithSystemFont("~CLEAR~", "", 40); label->setColor(Color3B::BLACK); label->setTag(TAG_LABEL_CLEAR); label->setPosition(winSize.width / 2, winSize.height / 2); label->setOpacity(0); this->addChild(label); } void GameScene::actionGameEnd( bool isClear ) { isEnded = true; Label* label; if (isClear) { label = (Label*)this->getChildByTag(TAG_LABEL_CLEAR); } else { label = (Label*)this->getChildByTag(TAG_LABEL_GAMEOVER); } label->runAction(Sequence::create( FadeIn::create(1.0f), DelayTime::create(1.0f), FadeOut::create(1.0f), CallFunc::create(CC_CALLBACK_0(GameScene::endGameEnd, this)), NULL)); } void GameScene::endGameEnd() { CCLOG("endGameEnd() / clickEnable false"); clickEnable(false); } void GameScene::initOX() { auto spr = Sprite::create("game/o.png"); spr->setPosition(Vec2(winSize.width / 2, winSize.height / 2)); spr->setTag(TAG_SPRITE_O); spr->setVisible(false); this->addChild(spr); auto spr1 = Sprite::create("game/x.png"); spr1->setPosition(Vec2(winSize.width / 2, winSize.height / 2)); spr1->setTag(TAG_SPRITE_X); spr1->setVisible(false); this->addChild(spr1); } void GameScene::actionOX(bool isOX) { CCLOG("actionOX() / clickEnable false"); clickEnable(false); CCLOG("actionOX"); Sprite* spr; if (isOX) { spr = (Sprite*)this->getChildByTag(TAG_SPRITE_O); } else { spr = (Sprite*)this->getChildByTag(TAG_SPRITE_X); } spr->runAction(Sequence::create( Show::create(), DelayTime::create(0.5f), Hide::create(), CallFunc::create(CC_CALLBACK_0(GameScene::endOX, this)), NULL)); } void GameScene::endOX() { CCLOG("endOX() / clickEnable true"); clickEnable(true); } |