AndEngine相机偏移和2个场景

时间:2012-01-09 03:51:55

标签: android andengine

我在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中的第二个场景, 因此,当我导航回第一个活动时,由于相机被移动,第一个场景位置不正确。

在回到第一个场景时,我是否可以重置相机?

我试过Camer.reset()无济于事。

有什么建议吗?

2 个答案:

答案 0 :(得分:8)

使用mCamera.setCenter(CAMERA_WIDTH / 2, CAMERA_HEIGHT / 2);。它将重置相机位置。

顺便说一下,我看到你根据相机位置不断更改菜单箭头。你知道,AndEngine有一个类来处理这种情况:)你没有理由手动做... 它被称为HUD,意思是Head-Up Display。您可以扩展HUD class,HUD只是一个放置在屏幕上恒定位置的场景。您可以根据需要添加任意数量的实体。然后,只需致电mCamera.setHUD(Your HUD object here);即可完成,无需在相机上移动实体。

我看到的另一个问题是,您致电mCamera.offsetCenter(0, 0);offsetCenter只是将参数添加到当前中心坐标。添加0根本没有 no 影响,因此此调用无效。你想要实现什么目标?将相机重置为(0,0)?

修改

以下是我自己游戏中的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,然后使下一个成为第一个孩子的场景。例如,如果我有另一个名为DisplayStats的HUD,我就是这样创建的:

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

然后,将其设置为攻击控制的子场景。记住 - HUD就是场景!所有场景操作都是合法的。

attackControl.setChildScene(displayStats);

现在,下一个HUD可能是displayStats的子场景......等等。

答案 1 :(得分:0)

如果有人在将来发现这个并且其他答案不够,请尝试这个。

 mCamera.setZoomFactor(1.0f);

如果您使用ZoomCamera,则必须这样做。我正在做这个,所以如果我“捏缩放”然后切换场景,那一切都搞砸了,因为我的缩放系数正在调整。