void Game::onTouchEnded(Touch* touch, Event* unused_event) { Point endTouch = touch->getLocation(); endX = beginX-endTouch.x; endY = beginY-endTouch.y; if (abs(endX) > abs(endY)) { if(endX + 5>0){ if (left()) { createCardNumber(); gameOver(); } }else { if (right()) { createCardNumber(); gameOver(); } } }else if (abs(endX)<abs(endY)){ if (endY+5>0) { if (down()) { createCardNumber(); gameOver(); } }else{ if (up()) { createCardNumber(); gameOver(); } } } }
// on "init" you need to initialize your instance bool GameScene::init() { if ( !Layer::init() ) { return false; } visibleSize = Director::getInstance()->getVisibleSize(); //加入游戏背景 //1 auto layerColorBG = LayerColor::create(Color4B(180, 170, 160, 255)); this->addChild(layerColorBG); //pause //2 MenuItemFont::setFontName("Consolas"); MenuItemFont::setFontSize(40); auto menuItemPause = MenuItemFont::create("PAUSE", CC_CALLBACK_1(GameScene::onPause, this)); auto menu = Menu::create(menuItemPause, NULL); addChild(menu); menu->setPosition(Point(100, visibleSize.width +(visibleSize.height - visibleSize.width)/2)); //创建分数 //3 auto cardNumberTitle = Label::createWithSystemFont("SCORE","Consolas",40); cardNumberTitle->setPosition(Point(visibleSize.width - 150, visibleSize.width + (visibleSize.height - visibleSize.width)/2 + 25)); addChild(cardNumberTitle); score = 0; cardNumberTTF = Label::createWithSystemFont("0", "Consolas", 40); cardNumberTTF->setPosition(Point(visibleSize.width - 150, visibleSize.width + (visibleSize.height - visibleSize.width)/2 -25)); addChild(cardNumberTTF); //设置触摸事件监听 auto touchListener = EventListenerTouchOneByOne::create(); touchListener->onTouchBegan = CC_CALLBACK_2(GameScene::onTouchBegan, this); touchListener->onTouchMoved = CC_CALLBACK_2(GameScene::onTouchMoved, this); touchListener->onTouchEnded = CC_CALLBACK_2(GameScene::onTouchEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this); createCardSprite(visibleSize); if (UserDefault::getInstance()->getBoolForKey("history")) { resumeStatus(); } else { //初始时生成两个2 createCardNumber(false); createCardNumber(false); } recognizer = new SimpleRecognizer(); return true; }
bool Game::init() { if (!Layer::init()) { return false; } auto size = Director::getInstance()->getVisibleSize(); auto layerColor = LayerColor::create(Color4B(200, 150, 100, 200)); addChild(layerColor); //标题 auto titleLabel = Label::createWithTTF("2048 Game","fonts/Marker Felt.ttf",70); titleLabel->setColor(Color3B(200, 250, 100)); titleLabel->setPosition(Vec2(size.width/2,size.height/2+550)); auto letter = titleLabel->getLetter(1); auto letter1 = titleLabel->getLetter(3); auto rote = RepeatForever::create(RotateBy::create(1, 180)); auto rote1 = RepeatForever::create(RotateBy::create(1, 180)); letter->runAction(rote); letter1->runAction(rote1);//设置字体旋转 addChild(titleLabel); auto Label = Label::createWithTTF("score:", "fonts/arial.ttf", 50); Label->setColor(Color3B::BLUE); Label->setPosition(Vec2(80,size.height/2+450)); addChild(Label); char t[10]; score=0; sprintf(t,"%d",score); scoreLabel = Label::createWithTTF(t, "fonts/Marker Felt.ttf", 40); scoreLabel->setColor(Color3B::BLUE); scoreLabel->setPosition(Vec2(170,size.height/2+450)); addChild(scoreLabel); auto newGame = Label::createWithTTF("new Game", "fonts/Marker Felt.ttf",50); newGame->setColor(Color3B::GRAY); newGame->setPosition(Vec2(110,size.height/2+380)); addChild(newGame); auto bt = Button::create("buttonreplay.png"); bt->setPosition(Vec2(260,size.height/2+380)); bt->addClickEventListener(CC_CALLBACK_0(Game::restart, this)); addChild(bt); auto listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan=CC_CALLBACK_2(Game::onTouchBegan, this) ; listener->onTouchEnded=CC_CALLBACK_2(Game::onTouchEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); createCard(); createCardNumber(); createCardNumber(); return true; }
bool GameScene::init() { if (!Layer::init()) { return false; } Size visibleSize = Director::getInstance()->getVisibleSize(); //游戏背景 auto layerBg = LayerColor::create(Color4B(180, 170, 160, 255)); this->addChild(layerBg); //暂停按钮 MenuItemFont::setFontName("Consolas"); MenuItemFont::setFontSize(20); auto menuItemPause = MenuItemFont::create("PAUSE", CC_CALLBACK_1(GameScene::onPause, this)); auto menu = Menu::create(menuItemPause, NULL); addChild(menu); menu->setPosition(visibleSize.width - 50, visibleSize.height - 20); //分数 auto cardNumberTitle = Label::createWithSystemFont("SCORE", "Consolas", 20); cardNumberTitle->setPosition(visibleSize.width - 50, visibleSize.height-100); addChild(cardNumberTitle); score = 0; cardNumberTTF = Label::createWithSystemFont("0", "Consolas", 20); cardNumberTTF->setPosition(visibleSize.width - 50, visibleSize.height - 150); addChild(cardNumberTTF); recognizer = new SimpleRecognizer(); auto listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan = CC_CALLBACK_2(GameScene::onTouchBegan, this); listener->onTouchMoved = CC_CALLBACK_2(GameScene::onTouchMoved, this); listener->onTouchEnded = CC_CALLBACK_2(GameScene::onTouchEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); //创建4*4 卡片 createCardSprite(visibleSize); createCardNumber(true); createCardNumber(true); return true; }
void GameScene::onTouchEnded(Touch *touch, Event *unused_event){ Point pos = touch->getLocation(); SimpleGestures gesture = recognizer->endPoint(pos); switch (gesture) { case SimpleGesturesLeft: doLeft(); log("left"); break; case SimpleGesturesRight: doRight(); log("right"); break; case SimpleGesturesUp: doUp(); log("up"); break; case SimpleGesturesDown: doDown(); log("dowm"); break; default: break; } createCardNumber(true); }
void GameScene::onTouchEnded(Touch* touch, Event* event) { //得到触摸结束时坐标 Point endTouch = touch->getLocation(); //获取OpenGL坐标,以左下角为原点 //计算手指在X,Y移动的距离 endX = beginX - endTouch.x; endY = beginY - endTouch.y; if (abs(endX) > abs(endY)) { //如果X轴移动的距离大于Y轴,则是左右移动 if (endX + 5 > 0) { //向左移动 doLeft(); createCardNumber(); doCheck(); setScore(score); } else { //向右移动 doRight(); createCardNumber(); doCheck(); setScore(score); } } else //否则是上下移动 { if (endY + 5 > 0) { //向下移动 doDown(); createCardNumber(); doCheck(); setScore(score); } else { //向上移动 doUp(); createCardNumber(); doCheck(); setScore(score); } } }
void GameScene::doCheck() { bool isGameOver = true; //结束边界 4*4的card数值>0 且 相邻card没有相同数值 //4*4的card数值>0 不能在创建Number //判断每一个的上下左右和自己是否相同 for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { if (cardArr[x][y]->getNumber() == 0 || (x<3 && cardArr[x][y]->getNumber() == cardArr[x+1][y]->getNumber()) || (x>0 && cardArr[x][y]->getNumber() == cardArr[x-1][y]->getNumber()) || (y<3 && cardArr[x][y]->getNumber() == cardArr[x][y+1]->getNumber()) || (y>0 && cardArr[x][y]->getNumber() == cardArr[x][y-1]->getNumber()) ) { isGameOver = false; } } } if (isWin()) { successLayer = LayerColor::create(Color4B(0, 0, 0, 180)); Size winSize = Director::getInstance()->getWinSize(); Point centerPos = Point(winSize.width / 2, winSize.height / 2); auto gameOverTitle = Label::createWithSystemFont("YOU WIN","Consolas",80); gameOverTitle->setPosition(centerPos); successLayer->addChild(gameOverTitle); getParent()->addChild(successLayer,1); scheduleOnce(SEL_SCHEDULE(&GameScene::removeSuccessLayer), 2); return; } //isGameOver = true; if (isGameOver) { log("game over"); UserDefault::getInstance()->setBoolForKey("history", false); HighScore::getInstance()->setScore(score); GameOverLayer *gameoverLayer = GameOverLayer::create(Color4B(0, 0, 0, 180)); getParent()->addChild(gameoverLayer,1); Director::getInstance()->pause(); } else { if (shouldCreateCardNumber()) { createCardNumber(); saveStatus(); } } }
void Game::createCardNumber() { int i = CCRANDOM_0_1()*4; int j = CCRANDOM_0_1()*4; if (arr[i][j] -> getNumber() > 0) {//如果有卡片就不需要创建 createCardNumber(); } else{//没有卡片就再创建 arr[i][j]->setNumber(CCRANDOM_0_1()*10<1 ? 4:2); } }
bool GameScene::init() { if ( !Layer::init() ) { return false; } Size visibleSize = Director::getInstance()->getVisibleSize(); Point origin = Director::getInstance()->getVisibleOrigin(); //设置触摸事件监听 auto touchListener = EventListenerTouchOneByOne::create(); touchListener->onTouchBegan = CC_CALLBACK_2(GameScene::onTouchBegan, this); touchListener->onTouchEnded = CC_CALLBACK_2(GameScene::onTouchEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this); //加入游戏背景 auto layerColorBG = LayerColor::create(Color4B(180, 170, 160, 255)); this->addChild(layerColorBG); //创建分数 auto cardNumberTitle = LabelTTF::create("SCORE","Consolas",80); cardNumberTitle->setPosition(Point(visibleSize.width/2 + 340, visibleSize.height/2 + 130)); addChild(cardNumberTitle); score = 0; cardNumberTTF = LabelTTF::create("0", "Consolas", 70); cardNumberTTF->setPosition(Point(visibleSize.width/2 + 340, visibleSize.height/2 - 100)); addChild(cardNumberTTF); //创建4X4卡片 createCardSprite(visibleSize); //初始时生成两个2 createCardNumber(); createCardNumber(); return true; }
//创建生成随机卡片 void GameScene::createCardNumber() { int i = CCRANDOM_0_1() * 4; //生成0~3随机数 int j = CCRANDOM_0_1() * 4; //判断是否已经存在 if (cardArr[i][j]->getNumber() > 0) { createCardNumber(); } else { //2和4的生成率为9:1 cardArr[i][j]->setNumber(CCRANDOM_0_1()*10 < 1 ? 4 : 2); } }