小小菜之Cocos2d-x游戏开发旅程——项目实例:贪吃蛇(4)

——吃食物和长身体
蛇绕着食物跑啊跑,转啊转,就是吃不到,它都要崩溃了~
~(>_<)~~
好吧,我们来帮帮它吧

如何让蛇可以吃到食物呢,其实很简单嘛。既然蛇头有行列坐标,那么食物也有行列坐标。所以当蛇头的行列坐标和食物的行列坐标相等时,让食物的坐标改变,这不就是吃到了吗,对吧。

if(head->row == food->row && head->col == food->col)
    {

        //改变食物的位置
        food->col = rand()%10;
        food->row = rand()%10;
        food->setPosition(Vec2(food->col*GAME_TILED_WIDTH , food->row*GAME_TILED_HEIGHT));
        }

现在蛇已经可以吃到食物了,但是不能光吃不长吧,所以吃饱了应该长身体。
由于身体有很多很多很多。。。。
我们就用一个集合来保存身体先定义一个集合Vector

//第一种,让身体的方向跟着头的方向即可
if(allBody.size() == 0)   //当没有身体的时候
        {
            nowbd->dir = head->dir;  //身体的方向跟着头
            switch(nowbd->dir)
            {
                case UP:
                    nowbd->row = head->row - 1;
                    nowbd->col = head->col;
                    break;
                case DOWN:
                    nowbd->row = head->row +1;
                    nowbd->col = head->col;
                    break;
                case LEFT:
                    nowbd->row = head->row;
                    nowbd->col = head->col +1;
                    break;
                case RIGHT:
                    nowbd->row = head->row;
                    nowbd->col = head->col -1;
                    break;
                default:
                    break;
            }
   }
   //第二种,让新的身体的方向跟着原来的最后一截身体的方向
else    //当有身体的时候
        {
            auto lastbd = allBody.at(allBody.size() - 1);
            nowbd->dir = lastbd->dir;
            switch(nowbd->dir)
            {
                case UP:
                    nowbd->row = lastbd->row - 1;
                    nowbd->col = lastbd->col;
                    break;
                case DOWN:
                    nowbd->row = lastbd->row +1;
                    nowbd->col = lastbd->col;
                    break;
                case LEFT:
                    nowbd->row = lastbd->row;
                    nowbd->col = lastbd->col +1;
                    break;
                case RIGHT:
                    nowbd->row = lastbd->row;
                    nowbd->col = lastbd->col -1;
                    break;
                default:
                    break;
            }
        }
        //添加到allBody中
        allBody.pushBack(nowbd);
        //设置坐标
        nowbd->setPosition(Vec2(nowbd->col*GAME_TILED_WIDTH, nowbd->row*GAME_TILED_HEIGHT));
        //添加到节点中
        this->getChildByTag(TAG_BG)->addChild(nowbd);

最后让身体也移动起来

if(allBody.size() > 0)
    {
        for(long i = allBody.size()-1 ; i >= 0; i--)
        {
            auto nowBody = allBody.at(i);
            switch(nowBody->dir)
            {
                case UP:
                    nowBody->row++;
                    break;
                case DOWN:
                    nowBody->row--;
                    break;
                case LEFT:
                    nowBody->col--;
                    break;
                case RIGHT:
                    nowBody->col++;
                    break;
            }
            nowBody->setPosition(Vec2(nowBody->col*GAME_TILED_WIDTH , nowBody->row*GAME_TILED_HEIGHT));
            if(i > 0)
            {
                nowBody->dir = allBody.at(i - 1 )->dir;
            }
            else
            {
                nowBody->dir = head->dir;
            }
        }
    }

OK,这样蛇就可以自由的吃东西长身体了。
当然,这个游戏还没有做完,还差最后一点点。

未完待续。。

————9秒学院学习日志

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值