Popstar小游戏4(Popstar检测点击POP的上下左右)

本文介绍了一种在消除类游戏中实现匹配逻辑的方法。通过检查玩家点击的POP元素周围是否有相同类型的元素并进行消除,实现了基本的游戏逻辑。文章详细展示了如何遍历上下左右四个方向查找连续的相同元素,并将它们加入到待消除的数组中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在HelloWorldScene场景中,声明文件中

private:
    //创建一个数组来存放点击的POP
    __Array *poparr;
    //通过传递过来的点击pop对象获取它上下左右的数据
    __Array *checkPopUDLR(PopSprite *pop);
实现文件中,onTouchBegin函数中判断自身格子周围是否有相同的

bool HelloWorld::onTouchBegin(Touch *touch,Event *event){
    //初始化数组
    poparr = __Array::create();
    //获取触摸的X Y值
    Point touchPO = touch->getLocation();
    //获取屏幕大小
    Size visibleSize = Director::getInstance()->getVisibleSize();
    //得到了每个格子的位置,可以用来判读格子周围的一些
    PopSprite *pops = getPopStarSprite(visibleSize,touchPO);
    if(pops != NULL){
        //点击的时候检测
        poparr = checkPopUDLR(pops);
    }
    return true;
}

具体的用checkPopUDLR函数中的算法来实现

//通过传递过来的点击pop对象获取它上下左右的数据
__Array * HelloWorld::checkPopUDLR(PopSprite *pop){
    __Array *arr = __Array::create();
    bool isDoublePop = false;//如果有两个以上的,自身也返回
    //判断点击位置往上的相同数
    int up = pop->getPOPY();
    for (int yu = up + 1; yu < 10; yu++) {
        //如果当前位置和上一个位置是一样的话
        if(popStarSprite[pop->getPOPX()][yu]->getNumber() == popStarSprite[pop->getPOPX()][up]->getNumber()){
            arr->addObject(popStarSprite[pop->getPOPX()][yu]);
            popStarSprite[pop->getPOPX()][yu]->setNumber(-1);
            isDoublePop = true;
        }else{
            break;
        }
    }
    //判断点击位置往上的相同数
    int ud = pop->getPOPY();
    for (int yd = ud - 1; yd >= 0; yd--) {
        //如果当前位置和上一个位置是一样的话
        if(popStarSprite[pop->getPOPX()][yd]->getNumber() == popStarSprite[pop->getPOPX()][ud]->getNumber()){
            arr->addObject(popStarSprite[pop->getPOPX()][yd]);
            popStarSprite[pop->getPOPX()][yd]->setNumber(-1);
            isDoublePop = true;
        }else{
            break;
        }
    }
    //判断点击位置往左的相同数
    int ul = pop->getPOPX();
    for (int xl = ul - 1; xl >= 0; xl--) {
        if(popStarSprite[xl][pop->getPOPY()]->getNumber() == popStarSprite[ul][pop->getPOPY()]->getNumber()){
            arr->addObject(popStarSprite[xl][pop->getPOPY()]);
            popStarSprite[xl][pop->getPOPY()]->setNumber(-1);
            isDoublePop = true;
        }else{
            break;
        }
    }
    //判断点击位置往右的相同数
    int ur = pop->getPOPX();
    for (int xr = ur + 1; xr < 10; xr++) {
        if(popStarSprite[xr][pop->getPOPY()]->getNumber() == popStarSprite[ur][pop->getPOPY()]->getNumber()){
            arr->addObject(popStarSprite[xr][pop->getPOPY()]);
            popStarSprite[xr][pop->getPOPY()]->setNumber(-1);
            isDoublePop = true;
        }else{
            break;
        }
    }
    if(isDoublePop){
        arr->addObject(popStarSprite[pop->getPOPX()][pop->getPOPY()]);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值