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;
    }
}
Пример #2
0
/**
 * 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;
}
Пример #3
0
//         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);
}
Пример #4
0
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;
	}
	

	
}
Пример #5
0
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;
}
Пример #6
0
//移动事件
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;
	}
}
Пример #7
0
//启动摇杆(显示摇杆、监听摇杆触屏事件)
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);
}
Пример #8
0
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;
}