Спрайт всегда на переднем плане в Android Andengine - PullRequest
0 голосов
/ 13 ноября 2011

В моем приложении у меня есть перетаскиваемый спрайт, один на том же уровне, другие разделены на разные слои, все сложены один над другим. когда я перетаскиваю один, мне нужно, чтобы этот спрайт появлялся всегда на foregorund.

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

if(pSceneTouchEvent.isActionDown()) {

//TOCCO DELLO SPRITE

}

а как? или существует команда для установки текущего спрайта в качестве foregorund?

EDIT По словам скайзо, я попробовал этот способ. в своей основной деятельности я определил два разных слоя, один для всех спрайтов, а другой в качестве переднего плана

    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

    }

в другом классе я определил 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 http://i41.tinypic.com/ob02t0.png

Ответы [ 3 ]

1 голос
/ 14 ноября 2011

У вас может быть два слоя: один, содержащий все ваши спрайты не переднего плана, а другой - ваш спрайт переднего плана.

Пример

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);
}
0 голосов
/ 02 апреля 2015

Попробуйте прочитать это: http://javaprogrammernotes.blogspot.com/2015/04/how-to-put-sprite-on-top-in-andengine.html. Возможно создать спрайты сверху без хаков с отсоединением / прикреплением, но только с setOnTop (true).

0 голосов
/ 14 ноября 2011

я решил вторую проблему!

в методе 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

...