AndEngine смещение камеры и 2 сцены - PullRequest
3 голосов
/ 09 января 2012

Я использую этот метод в Andengine для прокрутки списка элементов, устанавливая смещение камеры.

@Override
        public void onScroll(ScrollDetector pScollDetector, int pPointerID,
                float pDistanceX, float pDistanceY) {
            //Disable the menu arrows left and right (15px padding)
            if(mCamera.getXMin()<=15)
                menuleft.setVisible(false);
             else
                menuleft.setVisible(true);

             if(mCamera.getXMin()>mMaxX-15)
                 menuright.setVisible(false);
             else
                 menuright.setVisible(true);

            //Return if ends are reached
            if ( ((mCurrentX - pDistanceX) < mMinX)  ){                 
                return;
            }else if((mCurrentX - pDistanceX) > mMaxX){

                return;
            }

            //Center camera to the current point
            this.mCamera.offsetCenter(-pDistanceX,0 );
            mCurrentX -= pDistanceX;


            //Set the scrollbar with the camera
            float tempX =mCamera.getCenterX()-CAMERA_WIDTH/2;
            // add the % part to the position
            tempX+= (tempX/(mMaxX+CAMERA_WIDTH))*CAMERA_WIDTH;      
            //set the position
            //scrollBar.setPosition(tempX, scrollBar.getY());

            //set the arrows for left and right
            menuright.setPosition(mCamera.getCenterX()+CAMERA_WIDTH/2-menuright.getWidth(),menuright.getY());
            menuleft.setPosition(mCamera.getCenterX()-CAMERA_WIDTH/2,menuleft.getY());



            //Because Camera can have negativ X values, so set to 0
            if(this.mCamera.getXMin()<0){
                this.mCamera.offsetCenter(0,0);
                mCurrentX=0;
            }


        }

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

Можно ли в любом случае перезагрузить камеру при возврате к первой сцене?

Iпробовал Camer.reset () безрезультатно.

Есть предложения?

Ответы [ 2 ]

8 голосов
/ 09 января 2012

Используйте mCamera.setCenter(CAMERA_WIDTH / 2, CAMERA_HEIGHT / 2);. Это сбросит положение камеры.

Кстати, я вижу, что вы продолжаете изменять стрелки меню в соответствии с положением камеры. Вы знаете, у AndEngine есть класс для обработки этого случая :) У вас нет причин делать это вручную ... Он называется HUD, что означает Head-Up Display . Вы можете расширить HUD класс , HUD - это просто сцена, которая находится на экране в постоянной позиции. Вы можете добавить к ней столько объектов, сколько захотите. Затем просто позвоните mCamera.setHUD(Your HUD object here); и все готово, не нужно возиться с движущимися объектами по камере.

Другая проблема, которую я вижу, это то, что вы звоните mCamera.offsetCenter(0, 0);. offsetCenter просто добавляет параметры к текущим координатам центра. Добавление 0 не имеет никакого влияния , поэтому этот вызов бесполезен. Чего ты пытаешься достичь? Сбросить камеру обратно в (0, 0)?

EDIT:

Вот пример HUD из моей собственной игры:

public class AttackControl extends HUD {
// ===========================================================
// Constants          
// ===========================================================

// ===========================================================          
// Fields         
// =========================================================== 
private Sprite mSprite;
private IAttackControlClickListener mListener;
// ===========================================================          
// Constructors          
// =========================================================== 
public AttackControl(final float pX, final float pY, final Camera pCamera, final TextureRegion pTextureRegion, final IAttackControlClickListener pListener) {
    super.setCamera(pCamera);
    this.mListener = pListener;
    this.mSprite = new Sprite(pX, pY, pTextureRegion) {
        @Override
        public boolean onAreaTouched(final TouchEvent pTouchEvent, final float pX, final float pY) {
            AttackControl.this.mListener.onClick();
            return true;
        }
    };
    super.attachChild(this.mSprite);
    super.registerTouchArea(this.mSprite);
}
// ===========================================================          
// Getter & Setter          
// =========================================================== 

// ===========================================================          
// Methods for/from SuperClass/Interfaces          
// ===========================================================  

// ===========================================================          
// Methods          
// ===========================================================  

// ===========================================================          
// Inner and Anonymous Classes          
// ===========================================================  
public interface IAttackControlClickListener {
    public void onClick();
}
} 

Затем вы создаете экземпляр этого класса:

final AttackControl attackControl = new AttackControl(...);

и установите его в качестве HUD камеры:

mCamera.setHUD(attackControl);

В любом случае, если вы хотите использовать более 1 HUD, вы устанавливаете 1 в качестве HUD, а затем делаете следующую дочернюю сцену первой. Например, если у меня есть другой HUD с именем DisplayStats, и я создал его следующим образом:

final DisplayStats displayStats = new DisplayStats(...);

Затем просто установите его как дочернюю сцену элемента управления атакой. Помните - HUD - это сцена! Все операции на сцене разрешены здесь.

attackControl.setChildScene(displayStats);

А теперь следующим HUD может быть детская сцена displayStats ... И так далее.

0 голосов
/ 19 марта 2013

Если кто-то найдет это в будущем, а других ответов будет недостаточно, попробуйте это.

 mCamera.setZoomFactor(1.0f);

Это необходимо, если вы используете ZoomCamera.Я делал это, и поэтому, если я «ущипнул, чтобы увеличить», а затем переключил сцены, все было испорчено, потому что мой коэффициент масштабирования корректировался.

...