【问题标题】:AndEngine camera offset and 2 scenesAndEngine相机偏移和2个场景
【发布时间】:2012-01-09 03:51:55
【问题描述】:

我在 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;
            }


        }

问题是我将此作为我在活动中的第二个场景, 因此,当我导航回第一个活动时,由于相机被移动,第一个场景不在位置。

回到第一个场景时我可以重置相机吗?

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

有什么建议吗?

【问题讨论】:

    标签: android andengine


    【解决方案1】:

    使用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 完全没有影响,所以这个调用没有用。你想达到什么目的?将相机重置回 (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);
    

    在任何情况下,如果您想使用多个 HUD,请将 1 设置为 HUD,然后将下一个作为第一个的子场景。例如,如果我有另一个名为 DisplayStats 的 HUD,并且我是这样创建的:

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

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

    attackControl.setChildScene(displayStats);
    

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

    【讨论】:

    • 再次感谢 jong。我正在使用我从这里获得的示例andengine.org/forums/post25398.html?hilit=MenuItems#p25398 以及代码将如何查找 HUD。这是我第一次使用它
    • 稍后我给你举个例子,我得走了。关于摄像头,试试mCamera.setCenter(CAMERA_WIDTH/2, CAMERA_HEIGHT/2);如果不行,离开第一个场景的时候保存一下摄像头位置,以后可以切换回来。
    • mCamera.setCenter(CAMERA_WIDTH/2, CAMERA_HEIGHT/2);像魅力一样工作
    • 太棒了 :) 你还想要一个 HUD 示例吗?
    • 请。那太好了!
    【解决方案2】:

    如果以后有人发现这个问题而其他答案还不够,试试这个。

     mCamera.setZoomFactor(1.0f);
    

    如果您使用的是ZoomCamera,这是必要的。我正在这样做,所以如果我“捏合缩放”然后切换场景,一切都会变得一团糟,因为我的缩放系数正在调整。

    【讨论】:

    • 为什么投反对票?这是完全必要的,对我有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多