как подобрать маленький перетаскиваемый спрайт, уложенный в больший, который также можно перетаскивать - PullRequest
0 голосов
/ 01 декабря 2011

У меня проблема с моим приложением.Я сложил несколько спрайтов разных размеров (их области текстуры также имеют разные размеры)

Если я уроню маленький спрайт на больший, все это будет работать нормально (маленький спрайт явно выше большего1) Если я хочу снова взять маленький спрайт, при касании я всегда перетаскиваю больший спрайт, даже если его уровень находится на более низком уровне, чем уровень меньшего спрайта.

Как можноЯ исправляю это?

Я уже пытался установить для меньшего спрайта размер области, такой же большой, как у большего спрайта, но это не сработало

просто, чтобы быть ясным, вот два скриншота

Красный "E" - это спрайт, который я переместил на синюю "кому".кома меньше, поэтому, когда я касаюсь «E», я перемещаю ее правильно

si

Во втором случае del blue «D» больше, чем «E», поэтому, когдая касаюсь его, я перемещаю «D», а не «E» si

РЕДАКТИРОВАТЬ

вот как я создаю свои спрайты, все они хранятся в векторе

public Vector<Sprite> initSprite(Vector<TextureRegion> tRegionV, final Scene se, Context c){
    Vector<Sprite> aux = new Vector<Sprite>();
    vRes.posizioni = vRes.init();


    for(int i=0; i<dataV.size(); i++ ){         
        final int gap = dataV.elementAt(i).gap+data[3];  //creo qui la differenza per il dito
        final float sX = dataV.elementAt(i).x;
        final float sY = dataV.elementAt(i).y;;
        final String label = dataV.elementAt(i).label;
        final Context co = c;

        sprite = new Sprite(dataV.elementAt(i).x, dataV.elementAt(i).y, tRegionV.elementAt(i))

        // gestione del drag & drop
        {
            @Override
            public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
                    final float pTouchAreaLocalX, final float pTouchAreaLocalY) {



                if(pSceneTouchEvent.isActionDown()){
                    //TOCCO DELLO SPRITE

                    moved=false;

                    startY=getY();
                    startX=getX();

                    if(this.getParent()!=se.getChild(3) && this.getParent()==se.getChild(1)){


                        ChangeLayer(se, this, 1, 3);
                    }
                    else if(this.getParent()!=se.getChild(3) && this.getParent()==se.getChild(2)){


                        ChangeLayer(se, this, 2, 3);
                    }



                    MoveYModifier mod = new MoveYModifier(0.1f, getY(), pSceneTouchEvent.getY()- gap);
                    this.registerEntityModifier(mod);



                }

                if(pSceneTouchEvent.isActionMove()){
                    //MOVIMENTO DELLO SPRITE


                    moved=true;


                    setPosition(pSceneTouchEvent.getX() - this.getWidth() / 2, pSceneTouchEvent.getY()
                        - gap /*this.getHeight() / 2*/);
                }


                if(pSceneTouchEvent.isActionUp()){
                    //RILASCIO DELLO SPRITE

                    float x =getX() + (getWidth()/2);
                    float y =getY() + (getHeight()/2);

                    if(y<=285){

                        if(y>(sY+ getHeight()/2)-20 && y<(sY+ getHeight()/2)+20 && x>(sX+ getWidth()/2)-20 && x<(sX+ getWidth()/2)+20){


                            if(this.getParent()!=se.getChild(1) && this.getParent()==se.getChild(2)){
                                ChangeLayer(se, this, 2, 1);

                            }
                            return true;
                        }

                        else {


                            val=vRes.fallInCell(x,y,this.getHeight(),label);

                            setPosition(val[0]-(this.getWidth()/2),val[1]-(this.getHeight()/2)+6);

                        }
                    }
                    // if che se ho solo toccato e si è alzata, deve tornare dove stava
                    if(moved==false){


                        MoveYModifier mod = new MoveYModifier(0.1f, getY(), startY);
                        this.registerEntityModifier(mod);
                        setPosition(startX, startY);
                    }

                    if(this.getParent()!=se.getChild(1) && this.getParent()==se.getChild(3)){

                        ChangeLayer(se, this, 3, 1);
                    }
                    else if(this.getParent()!=se.getChild(1) && this.getParent()==se.getChild(2)){

                        ChangeLayer(se, this, 2, 1);
                    }



                }
                return true;
            }


        };


        aux.addElement(sprite);
    }

    return aux;
}

1 Ответ

0 голосов
/ 01 декабря 2011

Вы можете использовать сортировку z по порядку спрайтов, чтобы определить, какой из них находится сверху

т. Е. Порядок d 'z равен 1, порядок e' z равен 0

'e' z.порядок ниже, чем 'd', поэтому вы знаете, что он находится внизу

при создании первого объекта (объекта N), начальный z-порядок равен 0 для этого объекта (объекта N)

длякаждый дополнительный объект (объект N) при создании проверяет

 if (Object N) intersects with a previous object (object N-1).
     (object N).z-order = (object N-1).z-order+1,

(потребуются дополнительные проверки, если вы планируете иметь много перекрывающихся объектов)

, поэтому при касании пользователя проверяйте, касаются лиlocation пересекается с объектом (ами), если происходит более одного пересечения, используйте объект с самым высоким z-порядком

...