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; } }
/** * DONE: Implement the Generalised Hough Transform * * The probe image, is the image you want to align, the gallery image to. * Return the aligned gallery xyt_struct as the result of this function. */ struct xyt_struct alignment(struct xyt_struct probe, struct xyt_struct galleryimage) { int deltaT, deltaX, deltaY, arrayX, arrayY, arrayT, maximum, maxX, maxY, maxT; int i, j ,k; static int a[A_X][A_Y][thres_t]; maximum = maxX = maxY = maxT = 0; for(i = 0; i < A_X; i++) { for(j = 0; j < A_Y; j++) { for(k = 0; k < thres_t; k++) { a[i][j][k] = 0; } } } for(i = 0; i < galleryimage.nrows; i++) { for(j = 0; j < probe.nrows; j++) { deltaT = (int)floor(probe.thetacol[j] - galleryimage.thetacol[i]); deltaX = (int)floor(probe.xcol[j] - (galleryimage.xcol[i] * cos(getRad(deltaT))) - (galleryimage.ycol[i] * sin(getRad(deltaT)))); deltaY = (int)floor(probe.ycol[j] - (galleryimage.ycol[i] * cos(getRad(deltaT))) + (galleryimage.xcol[i] * sin(getRad(deltaT)))); // a maximal 400 Eintraege fuer x. deltaX bei Auswertung [-457, 825] // -> 1282 Eintraege theoretisch notwendig -> teilen durch 4 (binning) // Offset +150, um keine negativen Indizes zu erhalten // Analog für deltaY [-492, 988] und getRad(deltaT) [-7, 6] arrayX = (int)floor(deltaX/4) + 150; arrayY = (int)floor(deltaY/3) + 170; arrayT = (int)floor(getRad(deltaT)) + 9; a[arrayX][arrayY][arrayT]++; if(a[arrayX][arrayY][arrayT] > maximum) { maximum = a[arrayX][arrayY][arrayT]; maxX = deltaX; maxY = deltaY; maxT = deltaT; } } } for(i = 0; i < galleryimage.nrows; i++) { galleryimage.xcol[i] += maxX; galleryimage.ycol[i] += maxY; galleryimage.thetacol[i] += maxT; } return galleryimage; }
// PRIVATE FUNCTIONS // void Circ::draw(sf::RenderTarget& target, sf::RenderStates states) const { sf::CircleShape drawCircle; drawCircle.setFillColor(sf::Color::Transparent); drawCircle.setOutlineThickness(1); drawCircle.setOutlineColor(sf::Color::Magenta); drawCircle.setOrigin(radius, radius); drawCircle.setRadius(getRad()); drawCircle.setPosition(sf::Vector2f(getPos().getX(), getPos().getY())); target.draw(drawCircle, states); }
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 Rect::collide(const Shape* shape, vec::Vector2& normal) const { // Check for a null-pointer if (shape == NULL) return false; bool isColliding = false; // If rect-rect collision if (shape->getTypeEnum() == RECT) { const Rect* r = dynamic_cast<const Rect*>(shape); // Check for a null cast if (r == NULL) return false; if (r->getPos().dist(this->getPos()) < getRad() + r->getRad()) { //Check if any point lies inside the other rect if (pointInRect(r->tl, normal) || pointInRect(r->tr, normal) || pointInRect(r->br, normal) || pointInRect(r->bl, normal)) isColliding = true; if (r->pointInRect(tl, normal) || r->pointInRect(tr, normal) || r->pointInRect(br, normal) || r->pointInRect(bl, normal)) isColliding = true; } } // If rect-circ collision else if (shape->getTypeEnum() == CIRC) { const Circ* c = dynamic_cast<const Circ*>(shape); // Check for a null cast if (c == NULL) return false; isColliding = collideRC(*this, *c, normal); } return isColliding; }
//移动事件 void HRocker::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) { if (!isCanMove) { return; } CCPoint point = pTouch->getLocation(); CCSprite *rocker = (CCSprite *)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(getAngelePosition(rockerBGR,angle),ccp(rockerBGPosition.x,rockerBGPosition.y))); } else rocker->setPosition(point); //判断方向 if(angle>=-PI/4&&angle<PI/4) { rocketDirection=rocker_right; rocketRun=false; } else if(angle>=PI/4&&angle<3*PI/4) { rocketDirection=rocker_up; } else if((angle>=3*PI/4&&angle<=PI)||(angle>=-PI&&angle<-3*PI/4)) { rocketDirection=rocker_left; rocketRun=true; } else if(angle>=-3*PI/4&&angle<-PI/4) { rocketDirection=rocker_down; } }
//启动摇杆(显示摇杆、监听摇杆触屏事件) void HRocker::startRocker(bool _isStopOther) { Sprite *rocker = (Sprite*)this->getChildByTag(tag_rocker); rocker->setVisible(true); Sprite *rockerBG = (Sprite *)this->getChildByTag(tag_rockerBG); rockerBG->setVisible(true); auto listenerTouch = EventListenerTouchOneByOne::create();//创建一个触摸监听 listenerTouch->setSwallowTouches(true);//设置是否想下传递触摸 //3.0 后可以直接在touchBegan后添加它的实现代码,而不用特意去写一个touchBegan的函数 listenerTouch->onTouchBegan = [=](Touch* touch, Event* event){ //[]中间的是传入的参数 CCPoint point = touch->getLocation(); Sprite *rocker = (Sprite *)this->getChildByTag(tag_rocker); if (rocker->boundingBox().containsPoint(point)) isCanMove = true; return true; }; //拖动精灵移动 listenerTouch->onTouchMoved = [this](Touch* touch, Event* event){ if (!isCanMove) { return; } CCPoint point = touch->getLocation(); Sprite *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(getAngelePosition(rockerBGR,angle),ccp(rockerBGPosition.x,rockerBGPosition.y))); } else { rocker->setPosition(point); } //判断方向 if(angle>=-PI/4&&angle<PI/4) { rocketDirection=rocker_right; rocketRun=false; } else if(angle>=PI/4&&angle<3*PI/4) { rocketDirection=rocker_up; } else if((angle>=3*PI/4&&angle<=PI)||(angle>=-PI&&angle<-3*PI/4)) { rocketDirection=rocker_left; rocketRun=true; } else if(angle>=-3*PI/4&&angle<-PI/4) { rocketDirection=rocker_down; } }; listenerTouch->onTouchEnded = [=](Touch* touch, Event* event){ // =在c++11里面代表这个lambda表达式中能使用外面的变量 // if (!isCanMove) // { // return; // } Sprite *rockerBG = (Sprite*)this->getChildByTag(tag_rockerBG); Sprite *rocker = (Sprite*)this->getChildByTag(tag_rocker); rocker->stopAllActions(); rocker->runAction(CCMoveTo::create(0.08f,rockerBG->getPosition())); isCanMove = false; rocketDirection=rocker_stay; }; auto listenerKey = EventListenerKeyboard::create();//创建一个触摸监听 listenerKey->onKeyPressed = [this](EventKeyboard::KeyCode code, Event* event) { //isCanMove = true; switch(code) { case EventKeyboard::KeyCode::KEY_RIGHT_ARROW: rocketDirection=rocker_right; rocketRun=false; break; case EventKeyboard::KeyCode::KEY_UP_ARROW: rocketDirection=rocker_up; break; case EventKeyboard::KeyCode::KEY_LEFT_ARROW: rocketDirection=rocker_left; rocketRun=true; break; case EventKeyboard::KeyCode::KEY_DOWN_ARROW: rocketDirection=rocker_down; break; default: break; } log("press key"); }; listenerKey->onKeyReleased = [this](EventKeyboard::KeyCode code, Event* event) { Sprite *rockerBG = (Sprite*)this->getChildByTag(tag_rockerBG); Sprite *rocker = (Sprite*)this->getChildByTag(tag_rocker); rocker->stopAllActions(); rocker->runAction(CCMoveTo::create(0.08f,rockerBG->getPosition())); //isCanMove = false; rocketDirection=rocker_stay; log("released key"); }; //将触摸监听添加到eventDispacher中去 _eventDispatcher->addEventListenerWithSceneGraphPriority(listenerTouch ,this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listenerKey ,this); }
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; }