如何拾取一个小的可拖动的精灵堆叠在一个更大的精灵上也可以在发动机中拖曳

时间:2011-12-01 14:53:04

标签: android drag-and-drop touch sprite andengine

我的应用程序出了问题。 我已经堆积了一些不同尺寸的精灵(它们的纹理区域也有不同的尺寸)

如果我把一个小精灵放在一个更大的精灵上,它似乎都运行正常(小精灵显然在较大的精灵之上) 如果我想再次拾取小精灵,当我触摸它时,我总是最终拖动更大的精灵,即使它的级别低于较小的精灵级别。

我该如何解决这个问题?

我已经尝试将较小的sprite设置为与较大的sprite一样大的区域尺寸,但是它没有工作......

只是清楚,这里有两个截图

红色的“E”是我在蓝色“昏迷”上移动的精灵。昏迷较小,所以当我触摸“E”时,我正确地移动了

si

在第二种情况下,del蓝色“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 :(得分:0)

你可以使用sprite的某种排序z排序来判断哪一个在顶部

即'd'z顺序为1 'e'z order是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,

(如果您计划进行多次物体重叠,则需要进行额外的检查)

所以当用户触摸检查触摸位置是否与对象相交时 如果发生多个交叉点,则使用最高的z顺序对象