07--完成滑动逻辑

前面几篇已经建立游戏框架和元素,现在还差游戏的主要逻辑:滑动时对卡片的合并计分以及游戏结算检查。现在就来完成卡片合并的逻辑。卡片的合并需要检查各个卡片的数值,这里使用一个二维数组来存储卡片。

首先在GameLayer.h中声明一个二维数组:

//卡片数组
    CardSprite* cardArr[4][4];

卡片数组声明后需要初始化,我们在哪里初始化呢?在上一篇文章中我们创建了一个函数createCardSprite创建卡片精灵,将卡片数组的初始化放在该函数中再合适不过了。修改该函数如下:

void GameLayer::createCardSprite(cocos2d::CCSize size)
{
    //获取卡片高宽
    int unitSize = ScreenAdapter::GetCardHeight(size.height);

    //创建4*4个卡片
    for (int i=0;i<4;i++)
    {
        for (int j=0;j<4;j++)
        {
            CardSprite* card = CardSprite::createCardSprite(
                2,
                unitSize,
                unitSize,
                unitSize*i+100,
                unitSize*j+20);
            //保存卡片到数组中
            cardArr[i][j] = card;
            addChild(card);
        }
    }
}

完善滑动逻辑如下:

bool GameLayer::doUp()
{
    CCLog("doUp");
    bool isdo = false;
    for (int x = 0; x < 4; x++) {
        for (int y = 3; y >= 0; y--) {  

            for (int y1 = y - 1; y1 >= 0; y1--) {
                if (cardArr[x][y1]->getNumber() > 0) {
                    if (cardArr[x][y]->getNumber() <= 0) {
                        cardArr[x][y]->setNumber(cardArr[x][y1]->getNumber());
                        cardArr[x][y1]->setNumber(0);  

                        y++;
                        isdo = true;
                    }else if(cardArr[x][y]->getNumber() == cardArr[x][y1]->getNumber()){
                        cardArr[x][y]->setNumber(cardArr[x][y]->getNumber()*2);
                        cardArr[x][y1]->setNumber(0);  

                        isdo = true;
                    }
                    break;
                }
            }  

        }
    }
    return isdo;
}

bool GameLayer::doDown()
{
    CCLog("doDown");
    bool isdo = false;
    for (int x = 0; x < 4; x++) {
        for (int y = 0; y < 4; y++) {  

            for (int y1 = y + 1; y1 < 4; y1++) {
                if (cardArr[x][y1]->getNumber() > 0) {
                    if (cardArr[x][y]->getNumber() <= 0) {
                        cardArr[x][y]->setNumber(cardArr[x][y1]->getNumber());
                        cardArr[x][y1]->setNumber(0);  

                        y--;
                        isdo = true;
                    }else if(cardArr[x][y]->getNumber() == cardArr[x][y1]->getNumber()){
                        cardArr[x][y]->setNumber(cardArr[x][y]->getNumber()*2);
                        cardArr[x][y1]->setNumber(0);  

                        isdo = true;
                    }
                    break;
                }
            }  

        }
    }
    return isdo;
}

bool GameLayer::doLeft()
{
    CCLog("doLeft");
    bool isdo = false;
    for (int y = 0; y < 4; y++) {
        for (int x = 0; x < 4; x++) {  

            for (int x1 = x + 1; x1 < 4; x1++) {
                if (cardArr[x1][y]->getNumber() > 0) {
                    if (cardArr[x][y]->getNumber() <= 0) {
                        cardArr[x][y]->setNumber(cardArr[x1][y]->getNumber());
                        cardArr[x1][y]->setNumber(0);  

                        x--;
                        isdo = true;
                    }else if(cardArr[x][y]->getNumber() == cardArr[x1][y]->getNumber()){
                        cardArr[x][y]->setNumber(cardArr[x][y]->getNumber()*2);
                        cardArr[x1][y]->setNumber(0);  

                        isdo = true;
                    }
                    break;
                }
            }  

        }
    }
    return isdo;
}

bool GameLayer::doRight(){
    CCLog("doRight");
    bool isdo = false;
    for (int y = 0; y < 4; y++) {
        for (int x = 3; x >= 0; x--) {  

            for (int x1 = x - 1; x1 >= 0; x1--) {
                if (cardArr[x1][y]->getNumber() > 0) {
                    if (cardArr[x][y]->getNumber() <= 0) {
                        cardArr[x][y]->setNumber(cardArr[x1][y]->getNumber());
                        cardArr[x1][y]->setNumber(0);  

                        x++;
                        isdo = true;
                    }else if(cardArr[x][y]->getNumber() == cardArr[x1][y]->getNumber()){
                        cardArr[x][y]->setNumber(cardArr[x][y]->getNumber()*2);
                        cardArr[x1][y]->setNumber(0);  

                        isdo = true;
                    }
                    break;
                }
            }  

        }
    }
    return isdo;
}

下面以向右滑动来看看具体实现,其他方向原理相同。首先使用两层循环遍历二维数组的每个元素,内层循环依次(向右滑动式合并卡片是从最右边一个开始向左检查遇到相同的数值就合并,但合并后的卡片不再参与合并)遍历行中的元素。接下来检查当前卡片相邻左边一个卡片是否有数值,如果没有就下一次循环;有的话再检查当前卡片是否有值,如果当前卡片没有数值就把左边一个卡片移动(就是使用交换卡片的数值)过来。如果有值又相等就合并卡片。运行起来看看效果

07--完成滑动逻辑

时间: 2024-07-29 15:21:10

07--完成滑动逻辑的相关文章

h5滑动插件(包含幻灯片滑动逻辑)

<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" Content="text/html; charset=utf-8;"> <title>移动端触摸滑动</title> <meta name="author" content="rainna" /> <meta name

本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877)Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果

今天还是给大家带来自定义控件的编写,自定义一个ListView的左右滑动删除Item的效果,这个效果之前已经实现过了,有兴趣的可以看下Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果,之前使用的是滑动类Scroller来实现的,但是看了下通知栏的左右滑动删除效果,确实很棒,当我们滑动Item超过一半的时候,item的透明度就变成了0,我们就知道抬起手指的时候item就被删除了,当item的透明度不为0的时候,我们抬起手指Item会回到起始位置,这样我们就知道

Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果

今天还是给大家带来自定义控件的编写,自定义一个ListView的左右滑动删除Item的效果,这个效果之前已经实现过了,有兴趣的可以看下Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果, 之前使用的是滑动类Scroller来实现的,但是看了下通知栏的左右滑动删除效果,确实很棒,当我们滑动Item超过一半的时候,item的透明度就变 成了0,我们就知道抬起手指的时候item就被删除了,当item的透明度不为0的时候,我们抬起手指Item会回到起始位置,这样我们就

让页面滑动流畅得飞起的新特性:Passive Event Listeners

版权声明:本文由陈志兴原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/153 来源:腾云阁 https://www.qcloud.com/community 在不久前的Google I/O 2016 Mobile Web Talk中,Google公布了一个让页面滑动更流畅的新特性Passive Event Listeners.该特性目前已经集成到Chrome51版本中.Chrome51上使用Passive Event L

轻量级移动端滑动xwipe.js

工作需要写一个移动端的滑动效果,参考了swipe,和iscroll之后自己写了一个xwipe.在写的过程中学习了很多,分享一下心得. 首先html和css部分和swipe一样. html部分 xwipe结构 <div id='xwipe' class='xwipe'> <div class='xwipe-wrap'> <div></div> <div></div> <div></div> <div>

Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9097463 其实我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客开始,就零零散散在好多地方使用到了Android事件分发的知识.也有好多朋友问过我各种问题,比如:onTouch和onTouchEvent有什么区别,又该如何使用?为什么给ListView引入了一个滑动菜单的功能,ListView就不能滚动了?为什么图片轮播器里的图片使用Button而不用Ima

Android 进阶学习:事件分发机制全然解析,带你从源代码的角度彻底理解(上)

http://blog.csdn.net/guolin_blog/article/details/9097463 事实上我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客開始,就零零散散在好多地方使用到了Android事件分发的知识.也有好多朋友问过我各种问题,比方:onTouch和onTouchEvent有什么差别,又该怎样使用?为什么给ListView引入了一个滑动菜单的功能,ListView就不能滚动了?为什么图片轮播器里的图片使用Button而不用ImageView?

事件的分发机制(View篇因此事件传递的顺序是先经过onTouch,再传递到onClick)

参考声明:感谢郭霖http://blog.csdn.net/guolin_blog/article/details/9097463和张鸿洋http://blog.csdn.net/lmj623565791/article/details/38960443 以一个简单的activity为例,该activity中只有一个button,如果我们为该按钮添加监听,只需要这样: 1 button.setOnClickListener(new OnClickListener() { 2 @Override

【转】Android onTouch()和onTouchEvent()区别

1.onTouch()方法: onTouch方式是View的OnTouchListener接口中定义的方法. 当一个View绑定了OnTouchListener后,当有Touch事件触发时,就会调用onTouch方法. (当把手放到View上后,onTouch方法被一遍一遍的调用) 2.onTouchEvent()方法: onTouchEvent方法时重载的Activity的方法 重写了Acitivity的onTouchEvent方法后,当屏幕有Touch事件时,此方法就会被调用. (当把手放到