Спрайт всегда на переднем плане в Android и инженерном обеспечении

#android #sprite #layer #andengine #foreground

#Android #спрайт #слой #andengine #передний план

Вопрос:

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

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

 if(pSceneTouchEvent.isActionDown()) {

//TOCCO DELLO SPRITE

}
  

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

РЕДАКТИРОВАТЬ Согласно 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
    
    }
  

в другом классе я определил 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 amp;amp; y<sY 20 amp;amp; x>sX-20 amp;amp; 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

Комментарии:

1. Пожалуйста, перестаньте КРИЧАТЬ в своих заголовках, и если вы хотите использовать теги в нем, составьте из этого правильное предложение.

2. (кстати, это касается и старых вопросов по этому поводу)

3. извините за КРИК (-.-) . Я не нашел ничего похожего на мой вопрос

Ответ №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. готово, но когда я касаюсь спрайта, приложение «принудительно закрывается», и logcat выдает мне эту ошибку! ОТМЕТКА LOGCAT . я опубликую код в исходном вопросе

Ответ №2:

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

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

Ответ №3:

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