//定时器调用的移动处理函数 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);//坐标处理函数 }