void AnalogStick::onTouchMoved(Touch *pTouch, Event *pEvent) { if (!isCanMove) { return; } auto pos = pTouch->getLocation(); auto stick = (Sprite*)this->getChildByTag((int)TagForStickPart::tag_stick); float angle = getRad(stickOuterPosition, pos); if (sqrt(pow(stickOuterPosition.x-pos.x, 2)) + pow(stickOuterPosition.y-pos.y, 2) >= stickOuterRadius) { stick->setPosition(Vec2(stickOuterPosition.x, stickOuterPosition.y) + getAnglePosition(stickOuterRadius, angle)); } else { stick->setPosition(pos); } if(angle>=-PI/4&&angle<PI/4) { stickDirection=(int)TagForDirection::right; } else if(angle>=PI/4&&angle<3*PI/4) { stickDirection=(int)TagForDirection::up; } else if((angle>=3*PI/4&&angle<=PI)||(angle>=-PI&&angle<-3*PI/4)) { stickDirection=(int)TagForDirection::left; } else if(angle>=-3*PI/4&&angle<-PI/4) { stickDirection=(int)TagForDirection::down; } }
void HRocker::onTouchMoved( Touch * touch ,Event * unused_event ) { if (!isCanMove) { return; } Vec2 point =touch->getLocation(); auto rocker=(Sprite *)this->getChildByTag(tag_rocker); //计算摇杆与触摸点形成的角度 float angle=getRad(rockerBGPosition,point); if (sqrt(pow(rockerBGPosition.x-point.x,2)+pow(rockerBGPosition.y-point.y,2))>=rockerBGR) { //手指移出了背景之外 rocker->setPosition(ccpAdd(getAnglePosition(rockerBGR,angle),rockerBGPosition)); }else { //在摇杆背景内 rocker->setPosition(point); } //设置摇杆方向 if (angle>=-PI/4 && angle <PI/4) { rockerDirection=rocker_right; rockerRun=false; }else if (angle>=PI/4 && angle <3*PI/4) { rockerDirection=rocker_up; }else if ((angle>=3*PI/4 && angle<=PI) || (angle <-3*PI/4 && angle>=-PI)) { rockerDirection=rocker_left; rockerRun=true; }else if (angle>=-3*PI/4 && angle <-PI/4) { rockerDirection=rocker_down; } }
bool UIr_Layer::init(){ if (!Layer::init()) { return false; } bag_open=false; rokerPosition=Vec2(150,150); workespaceopen=true; CCSprite *spRockerBG=CCSprite::create("CG-1086.png"); spRockerBG->setPosition(rokerPosition); spRockerBG->setOpacity(50); addChild(spRockerBG,1); rockerBGR=spRockerBG->getContentSize().width*0.5; auto spRockerF = Sprite::create("CG-7005.png"); spRockerF->setPosition(rokerPosition); addChild(spRockerF, 2,1); auto work = Sprite::create("work.png"); work->setPosition(160,470); addChild(work,2,8); auto labelttf=Label::createWithSystemFont("任务:", "Arial", 16); labelttf->setAnchorPoint(Vec2(0,1)); labelttf->setPosition(40,200); labelttf->setColor(ccc3(255, 0, 0)); labelttf->setString("任务:从左下角离开去找刘备"); work->addChild(labelttf,2,8); auto tol=MenuItemToggle::createWithCallback(CC_CALLBACK_1(UIr_Layer::callback1,this), MenuItemImage::create("close1.png", "close1.png"), MenuItemImage::create("open1.png", "open1.png"), NULL); tol->setPosition(24,613); //this->addChild(tol,2); auto item=MenuItemImage::create("CG-6997.png", "CG-6998.png", CC_CALLBACK_1(UIr_Layer::callback2,this)); item->setPosition(500,600); //test_began auto item2=MenuItemImage::create("CG-1487.png", "CG-1486.png", CC_CALLBACK_1(UIr_Layer::callback3,this)); item2->setPosition(600,600); //test_end auto menu=Menu::create(tol,item,item2,NULL); menu->setPosition(0,0); this->addChild(menu); auto attlistener=EventListenerTouchOneByOne::create(); attlistener->onTouchBegan=[=](Touch*touch,Event*event){ auto target=static_cast<Sprite*>(event->getCurrentTarget()); Vec2 locationInNode=target->convertToNodeSpace(touch->getLocation()); Size s=target->getContentSize();//点到判断碰撞 Rect rect=Rect(0,0,s.width,s.height); if (rect.containsPoint(locationInNode)) { return true; } return false; }; attlistener->onTouchMoved=[&](Touch*touch,Event*event){ Vec2 point=touch->getLocation(); auto target=static_cast<Sprite*>(event->getCurrentTarget()); if (sqrt(pow((rokerPosition.x-point.x),2)+pow((rokerPosition.y-point.y),2))>=rockerBGR){ float angle=getRad(point); target->setPosition(ccpAdd(getAnglePosition(rockerBGR, angle),rokerPosition)); }else{ target->setPosition(target->getPosition()+touch->getDelta()); } float angle=getRad(point); //CCLOG("hudu:%f",angle); if (angle<=PI/8&&angle>-PI/8) { type=1; } else if (angle>PI/8&&angle<=PI*3/8) { type=2; } else if (angle>PI*3/8&&angle<=PI*5/8) { type=3; } else if (angle>PI*5/8&&angle<=PI*7/8) { type=4; } else if (angle>PI*7/8||angle<=-PI*7/8) { type=5; } else if (angle>-PI*7/8&&angle<=-PI*5/8) { type=6; } else if (angle>-PI*5/8&&angle<=-PI*3/8) { type=7; } else if (angle>-PI*3/8&&angle<=-PI*1/8) { type=8; } // CCLOG("type:%d",type); }; attlistener->onTouchEnded=[&](Touch*touch,Event*event){ Sprite *spRockerF=(Sprite*)this->getChildByTag(1); spRockerF->runAction(CCMoveTo::create(0.05, rokerPosition)); type=0; }; Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(attlistener,spRockerF); return true; }