【问题标题】:how to pick up a small draggable sprite stacked on a larger one which is also draggable in andengine如何拾取堆叠在较大的可拖动精灵上的小型可拖动精灵,该精灵也可在andengine中拖动
【发布时间】:2011-12-01 14:53:04
【问题描述】:

我的应用有问题。我堆叠了一些不同尺寸的精灵(它们的纹理区域也有不同的尺寸)

如果我将一个小精灵放在一个较大的精灵上,一切似乎都可以正常工作(小精灵明显高于较大的精灵)。如果我想再次捡起小精灵,当我触摸它时,我总是拖着大精灵,即使它的等级低于小精灵的等级。

我该如何解决这个问题?

我已经尝试将较小的精灵设置为与较大精灵一样大的区域尺寸,但没有奏效。

为了清楚起见,这里有两张截图:

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

在第二种情况下,蓝色的“D”比“E”大,所以当我触摸它时,我移动的是“D”而不是“E”

编辑

这是我创建精灵的方法,所有精灵都存储在一个向量中:

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;
}

【问题讨论】:

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


    【解决方案1】:

    您可以使用某种 z 排序的精灵来判断哪个在顶部

    ie 'd' z 顺序为 1 'e' z 顺序为 0

    'e' z order 低于 'd' 所以你知道它在底部

    在第一个对象(对象 N)创建时,该对象(对象 N)的初始 z 顺序为 0

    对于每个附加对象(对象 N) 创建时检查

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

    (如果您计划让许多对象重叠,则需要进行额外检查)

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

    【讨论】:

    • 我如何确定“好的,这是顶部精灵,移动它而不是下部?”
    • 没有看到你的代码我不知道你如何创建对象或定位它们或其他任何东西,但在第一次创建精灵对象时应该设置顺序,然后在删除它们时更新它们。我会用粗略的大纲编辑我的答案。
    • 我已经为 sprite 声明和相关的 onAreaTouched 添加了代码。我已经按照 andengine 拖放教程进行操作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多