#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
Комментарии:
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).