Example #1
0
//定时器调用的移动处理函数
void OptionLayer::updateMove(float dt)
{
    OptionLayer *optionLayer = global->optionLayer;
    CCTMXTiledMap *tmxTileMap = global->tmxTileMap;
    DirectionControlButton *ControlWheelSprite =  optionLayer->getDirectionCrtl();
    CCPoint Direction = ControlWheelSprite->getDirection();
    Hero *heroCtrl = global->hero;	//控制的角色
    CCPoint position = heroCtrl->getPosition() + Direction;	//下一次需要移动的位置(加上偏移量)
    
    //----------------------------控制主角移动-------------------------------------------------
    //瓦片地图允许移动到该位置,且摇杆对象不为空
    if(ControlWheelSprite && global->tileAllowMove(position)){
        if(Direction.x != 0||Direction.y != 0) {
            heroCtrl->RunMovingAction();//只要偏移量不为0就执行行走动画
        }else if(heroCtrl->getActionState() == ActionStateNone){
            heroCtrl->RunIdleAction();
        }
        
        //设置英雄的zOrder,以其y轴为zOrder
        heroCtrl->setZOrder(1/heroCtrl->getPositionY()*ScreenHeight*4+1);//同Y轴 人物比NPC zOrder值大1
        
        if (heroCtrl->getAllowMove()&&(Direction.x != 0||Direction.y != 0))
        {
            CCSize size=CCDirector::sharedDirector()->getWinSize();
            //制造一个矩形框,人物只会在当前框里活动,可通过地图移动来造成更大面积的移动范围
            CCRect rect=CCRectMake(heroCtrl->getContentSize().width/2,heroCtrl->getContentSize().height/2,size.width-(heroCtrl->getContentSize().width/2),size.height-(heroCtrl->getContentSize().height/2));		//创建一个逻辑矩形,范围是屏幕的大小,用于判断边界
            if(rect.containsPoint(position)){
                float mapMaxX = 0;
                //计算是否是人移动还是地图移动,注意:地图在初始化时锚点已设为cpp(0,0)
                if(heroCtrl->getPosition().x <= SCREEN.width/2 && Direction.x>0 && position.x >  SCREEN.width/2){ //地图需要左移动,position表示人物下一帧的位置
                    //计算地图最右端x轴下一次位置
                    mapMaxX = tmxTileMap->getPositionX()+tmxTileMap->getContentSize().width-Direction.x;
                    //保证地图不会把越界部分移出来
                    if(mapMaxX > SCREEN.width){
                        global->tmxTileMap->setPositionX(global->tmxTileMap->getPositionX()-Direction.x);
                        OptionLayer::npcMoveByMap(ccp(-Direction.x,0));
                        if(Direction.y != 0){
                            heroCtrl->setPositionY(heroCtrl->getPositionY() + Direction.y);//防止地图移动时,人物Y轴不能移动
                        }
                    }else{
                        heroCtrl->setPosition(position);	//地图快要越界,人物移动即可
                    }
                }else if(heroCtrl->getPosition().x >= SCREEN.width/2 && Direction.x<0 && position.x < SCREEN.width/2){//地图需要像右移动
                    //计算地图最左端x轴下一次位置
                    mapMaxX = tmxTileMap->getPositionX()+Direction.x;
                    //保证地图不会把越界部分移出来
                    if(mapMaxX < 0){
                        global->tmxTileMap->setPositionX(global->tmxTileMap->getPositionX()-Direction.x);
                        OptionLayer::npcMoveByMap(ccp(-Direction.x,0));
                        if(Direction.y != 0){
                            heroCtrl->setPositionY(heroCtrl->getPositionY() + Direction.y);//防止地图移动时,人物Y轴不能移动
                        }
                    }else{
                        heroCtrl->setPosition(position);	//地图快要越界,人物移动
                    }
                }else{
                    heroCtrl->setPosition(position);	//人物移动即可
                }
            }
        }
        
    }
    
    //--------------------------控制怪物移动-----------------------------------
    CCArray *npcs = global->npcs;
    CCObject *pObject = NULL;
    CCARRAY_FOREACH(npcs, pObject){
        NPC* npc =(NPC*)pObject;
        npc->setZOrder(1/npc->getPositionY()*ScreenHeight*4);//设置 怪物zOrder
        //如果是非动作状态则执行idle动画
        if(npc->getActionState() == ActionStateNone){
            npc->RunIdleAction();
        }
        
        
        npc->setPosition(npc->getPosition()+npc->getVector());	//怪物移动
        CCLOG("=========npc.x=%f/npc.y=%f======",npc->getPositionX(),npc->getPositionY());
        npcMoveToHero(npc);//坐标处理函数
    }