bool GameScene::init(){ if ( !Layer::init() ) { return false; } auto touchLister = EventListenerTouchOneByOne::create(); touchLister->onTouchBegan =CC_CALLBACK_2(GameScene::onTouchBegan, this); touchLister->onTouchEnded =CC_CALLBACK_2(GameScene::onTouchEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(touchLister,this); //加入游戏的背景颜色 auto layerColorBG = cocos2d::LayerColor::create(cocos2d::Color4B(180,170,160,255)); this->addChild(layerColorBG); Size visibleSize = Director::getInstance()->getVisibleSize(); //创建卡片 createCardSprite(visibleSize); // //创建2张自动生成卡片 autoCreateCardNumber(); autoCreateCardNumber(); //加入“分数”label auto labelTTFCardNumberName = LabelTTF::create("SCORE","HiraKakuProN-W6",80); labelTTFCardNumberName->setPosition(Point(visibleSize.width/3,visibleSize.height-40)); addChild(labelTTFCardNumberName); //加入具体的分数 labelTTFCardNumber = LabelTTF::create("0","HiraKakuProN-w6",80); labelTTFCardNumber->setPosition(Point(visibleSize.width-400,visibleSize.height-50)); addChild(labelTTFCardNumber); return true; }
bool HelloWorld::init() { if (!Layer::init()) { return false; } m_score = 0; Size visibleSize = Director::getInstance()->getVisibleSize(); //退出程序 auto listenerEnd = EventListenerKeyboard::create(); listenerEnd->onKeyReleased = CC_CALLBACK_2(HelloWorld::onKeyReleased, this); Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listenerEnd, this); auto layerColorBG = LayerColor::create(Color4B(180, 170, 160, 255)); addChild(layerColorBG); auto labTTFCardNumberName = Label::createWithSystemFont("Score", "fonts/arial.ttf", 60); labTTFCardNumberName->setPosition(Point(visibleSize.width / 5, visibleSize.height - 70)); addChild(labTTFCardNumberName); labTTFCardNumber = Label::createWithSystemFont("0", "fonts/arial.ttf", 60); labTTFCardNumber->setPosition(Point(visibleSize.width / 2 + 100, visibleSize.height - 70)); addChild(labTTFCardNumber); auto listen = EventListenerTouchOneByOne::create(); listen->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this); listen->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this); Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listen, this); //设置重来按钮 auto m_bunt = ui::Button::create("normal.png", "selected.png"); m_bunt->setScale9Enabled(true);//可拉伸图片 m_bunt->setTitleText("Begen"); m_bunt->setTitleFontSize(50); m_bunt->setTitleFontName("fonts/arial.ttf"); m_bunt->setContentSize(cocos2d::Size(visibleSize.width / 10+200, visibleSize.height / 15)); m_bunt->setPosition(Point(visibleSize.width / 5 + 180, visibleSize.height - 150)); m_bunt->addTouchEventListener(CC_CALLBACK_2(HelloWorld::touchEvent, this)); addChild(m_bunt); creatCard(visibleSize); autoCreateCardNumber(); autoCreateCardNumber(); return true; }
void HelloWorld::autoCreateCardNumber(){ int i = CCRANDOM_0_1() * 4; int j = CCRANDOM_0_1() * 4; if (carArr[i][j]->getNumber() > 0){ autoCreateCardNumber(); }else{ carArr[i][j]->setNumber(CCRANDOM_0_1() * 10 < 1 ? 4 : 2); } }
void HelloWorld::onTouchEnded(Touch *touch, Event *unused_event){ Point touchPo = touch->getLocation(); endX = firstX - touchPo.x; endY = firstY - touchPo.y; if (abs(endX) > abs(endY)){//绝对值 //左右 if (endX+5>0){ //左边 if (doLeft()){ autoCreateCardNumber(); doCheckGameOver(); } }else{ //右边 if (doRight()){ autoCreateCardNumber(); doCheckGameOver(); } } }else{ //上下 if (endY + 5 < 0){ //上 if (doUp()){ autoCreateCardNumber(); doCheckGameOver(); } }else{ //下 if (doDown()){ autoCreateCardNumber(); doCheckGameOver(); } } } }
//自动生成卡片 void GameScene::autoCreateCardNumber() { int i = CCRANDOM_0_1()*4; int j = CCRANDOM_0_1()*4; //判断是否这个位置已存在卡片 if(cardArr[i][j]->getNumber() > 0) { autoCreateCardNumber(); } else { cardArr[i][j]->setNumber(CCRANDOM_0_1()*10 < 1 ? 2: 4); } }
//判断游戏是否还能继续 void HelloWorld::doCheckGameOver(){ bool isGameOver = true; for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { if (cardArr[x][y]->getNumber() == 0|| (x>0&&(cardArr[x][y]->getNumber() == cardArr[x-1][y]->getNumber()))|| (x<3&&(cardArr[x][y]->getNumber() == cardArr[x+1][y]->getNumber()))|| (y>0&&(cardArr[x][y]->getNumber() == cardArr[x][y-1]->getNumber()))|| (y<3&&(cardArr[x][y]->getNumber() == cardArr[x][y+1]->getNumber()))) { isGameOver = false; } } } if (isGameOver) { //游戏结束,重新开始游戏 log("游戏结束"); Director::getInstance()->replaceScene(TransitionFade::create(1, HelloWorld::createScene())); }else{ autoCreateCardNumber(); } }