在Android Andengine中,Sprite始终处于前台

时间:2011-11-13 15:47:21

标签: android sprite layer andengine foreground

在我的应用程序中,我有一些可拖动的精灵,有些在同一级别,其他分为不同的层,所有都叠在一起。 当我拖动一个时,我需要这个精灵总是出现在foregorund上。

如果我拍摄第二层上的精灵(例如)并且我需要将它放在第一层中的另一个字母上,我需要在第二个字母上显示我正在触摸的那个。我想我需要在if on

中的“onAreaTouched”中以编程方式更改图层
if(pSceneTouchEvent.isActionDown()) {

//TOCCO DELLO SPRITE

}
但是怎么样?或者是否存在将当前触摸的精灵设置为foregorund的命令?

修改 根据skyuzo我试过这种方式。 在我的主要活动中,我定义了两个不同的层,一个用于所有精灵,另一个用作前景

    Entity base = new Entity();
    Entity foreground = new Entity();

    scene.attachChild(base);
    scene.attachChild(foreground);

   spriteV = vRes.initSprite(tRegionV, scene, base, foreground); //this invoce a method that initialize a vector containing all my sprites



    for(int x=0;x<spriteV.size();x++){

        base.attachChild(spriteV.elementAt(x)); //here i attach every sprite to the scene

    }

在另一个类中我已经为每个sprite定义了onAreaTouched并且我已经这样做了

       @Override
            public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
                    final float pTouchAreaLocalX, final float pTouchAreaLocalY) {

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

                    if(getY()<=261 )
                        setPosition(pSceneTouchEvent.getX() - this.getWidth() / 2, pSceneTouchEvent.getY()
                                - gap);

                    }

                    //switch layer
                    base.detachChild(sprite);
                    fore.attachChild(sprite);


                }

                if(pSceneTouchEvent.isActionMove()){
                    //MOVIMENTO DELLO SPRITE
                    setPosition(pSceneTouchEvent.getX() - this.getWidth() / 2, pSceneTouchEvent.getY()
                        - gap);
                }
                if(pSceneTouchEvent.isActionUp()){
                    //RILASCIO DELLO SPRITE
                    float x =getX();
                    float y =getY();
                    if(y<=261 ){
                        if(y>sY-20 && y<sY+20 && x>sX-20 && x<sX+20){
                            return true;
                        }
                        else {
                            val=fallInCell(x,y,this.getHeight());
                            setPosition(val[0],val[1]);
                        }
                    }

                  //switch layer
                    fore.detachChild(sprite);
                    base.attachChild(sprite);


                }
                return true;
            }


        };


        aux.addElement(sprite);
    }

    return aux;
}

但是当我触摸精灵时我的应用程序强制关闭。这里有logcat错误 LOGCAT ERROR http://i41.tinypic.com/ob02t0.png

3 个答案:

答案 0 :(得分:1)

你可以有两个图层:一个包含所有非前景精灵,另一个包含你的前景精灵。

实施例

void initScene() {
    scene.attachChild(spriteLayer);
    scene.attachChild(foregroundLayer);
}

void spriteTouched(Sprite sprite) {
    spriteLayer.detachChild(sprite);
    foregroundLayer.attachChild(sprite);
}

void spriteUntouched(Sprite sprite) {
    foregroundLayer.detachChild(sprite);
    spriteLayer.attachChild(sprite);
}

答案 1 :(得分:0)

我已经解决了我的第二个问题!

在onLoadEngine()方法中我以这种方式添加.setRunOnUpdateThread(true)

EngineOptions eo = new EngineOptions(true, ScreenOrientation.LANDSCAPE,
             new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera);
     eo.getTouchOptions().setRunOnUpdateThread(true);

有关如何正确删除精灵的详细信息,请参阅http://code.google.com/p/andengineexamples/source/browse/src/org/anddev/andengine/examples/SpriteRemoveExample.java

答案 2 :(得分:0)

请尝试阅读:http://javaprogrammernotes.blogspot.com/2015/04/how-to-put-sprite-on-top-in-andengine.html。可以在没有破坏/附加的情况下将sprite放在顶部但只使用setOnTop(true)。