Beispiel #1
0
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();
            }
        }
    }
   
}
Beispiel #2
0
// 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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}
Beispiel #5
0
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);
		}
	}
}
Beispiel #7
0
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();
        }
    }
}
Beispiel #8
0
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);
	}
}