cocos2d-x 3.2 |跑酷游戏之 update使用方法

cocos2d-x 3.2 |跑酷游戏之 update使用方法
游戏中很多判定逻辑需要实时检测,比如跑酷游戏主角跳跃的时候是是否吃到金币?需要即使判断吧?
比如,跑动的时候地图需要实时朝后移动吧?
在比如,角色每一帧都需要做碰撞检测吧?

所以,为了保证细腻的游戏效果,我们就需要用到  cocos2d本身为我们提供的update方法 

以跑酷中,跳跃下落检测为例:
//在头文件中定义一个update方法 如下

void HelloWorld::update(float t)


//在游戏逻辑中加入update方法 并实现跳跃-下落检测过程
void HelloWorld::update(float t)
{
    //得到角色动画
    auto sp=this->getChildByTag(110);
    //get得到的是一个Node类型 属性全无 需要转换成map类型 才能调用
    auto map=(TMXTiledMap *)getChildByTag(10);
    
    
    
    //跳跃
    if (jump)
    {
        //方向朝上
        if (spDir==1)
        {
            //Y轴+速度
            sp->setPositionY(sp->getPositionY()+speed);
            //衰减
            speed-=2;
            //落地
            if (speed<=0)
            {
                //方向朝右
                spDir=2;
            }
            //如果方向朝右
        }else if (spDir == 2)
        {
            //未落到台阶上时
            bool check=false;
            //实时检测 角色是否碰道地图
            for (int i=0; i<speed; i+=2)
            {
                //精灵与地图层碰撞 计算当前精灵相对于地图的坐标
                float px =sp->getPositionX();//精灵X坐标
                float py =sp->getPositionY()-sp->getContentSize().height/2+i;//精灵Y坐标
                float mx=abs(map->getPositionX());//精灵相对于屏幕的X坐标
                float my=0;//相对于屏幕的Y坐标
                float mapx=px+mx;//精灵相对于地图的X坐标
                float mapy=py+my;//精灵相对于地图的y坐标
                
                //获取精灵脚下地图块编号
                if (((int)mapy/32) >= 0)
                {
                    int gid=map->getLayer("tile")->getTileGIDAt(Vec2((int)(mapx/32), (int)(19-mapy/32)));
                    CCLOG("gid %d   %d   %d ",gid,(int)(mapx/32),(int)(19-mapy/32));
                    if (gid >= 65)
                    {
                        check=true;//落到台阶上
                        sp->setPositionY((int)(py+sp->getContentSize().height/2));
                        CCLOG("gid %d col %d row%d",gid,(int)(mapx/32),(int)(19-mapy/32));
                        check=true;
                        speed=30;
                        spDir=0;
                        jump=false;
                        break;
                    }
                }
                //掉下去
                if (py <=-500)
                {
                    //游戏结束
                    gameOver();
                }
            }
            //如果没有碰到地面
            if (!check)
            {   //下落增加速度
                sp->setPositionY(sp->getPositionY()- speed);
                speed+=2;
                //速度保持最大25
                if (speed >25)
                {
                    speed=25;
                }
            }
        }
    }
}

总结:以上就是一个update下落检测的实际应用,可以尝试实时背景滚动、以及实时计算角色所处Tilemap地图位置(行、列)等功能

你可能感兴趣的:(类,update,检测,碰撞,分数)