【问题标题】:Andengine swipe navigationAndengine 滑动导航
【发布时间】:2013-05-18 20:52:19
【问题描述】:

我是 andengine 的新手,想知道如何在两个 BaseGameActivities 之间切换。而且从第一个活动切换到第二个活动时,切换之间没有黑屏过渡。有没有可能的方法来做到这一点。 请帮帮我。

【问题讨论】:

    标签: android andengine


    【解决方案1】:

    BaseGameActivity 也可以用作任何其他 Android Activity

    Intent intent = new Intent(this, MyOtherBaseGameActivity.class);
    startActivity(intent);
    

    因此,如果您想从您的程序更改为另一个应用程序(可能通过打开浏览器...),您也可以像使用任何其他 Android 应用程序一样执行此操作。但是,如果这两个活动都是您自己的应用程序的一部分,则很少有推荐的情况(就像启动第二个程序一样)。尽管可以在this post 中描述的活动之间交换数据。

    但也许您只是在寻找一种在 AndEngine 中在Views 之间切换的方法。如果是这种情况,您可以在 Scenes 之间切换而无需任何转换。

    MyOtherScene secondScene = new MyOtherScene();
    mEngine.setScene(secondScene);
    

    这样您就可以在显示的内容之间进行切换,而无需重新加载每张图片。

    编辑:

    由于不能使用 AndEngine 在Activity之间切换,也不可能在场景之间平滑切换。这是一个关于如何在两个屏幕之间切换的快速示例(例如菜单)。在这个例子中,屏幕实际上是 2 个不同的图像(和显示器一样大……也许是一些背景图像)。注意:AndEngine 中没有“屏幕”之类的东西,它只是一个扩展实体的自制类。

    您的屏幕

    public MyScreen extends Entity{
    
        private float firstX;
        public MyScreen(Sprite niceBackgroundImage1, Sprite niceBackgroundImage2){
            this.attachChild(niceBackgroundImage1);    // attach something to the screen, so you can see it (preferably an image that is as big as your camera)
            this.attachChild(niceBackgroundImage2); 
            this.firstY=-1;   // this is a variable to remember the first x coordinate touched
        }
    
        @Override
        public boolean onAreaTouched(TouchEvent sceneTouchEvent, float touchAreaLocalX, float touchAreaLocalY) {
            if(sceneTouchEvent.getAction()==TouchEvent.ACTION_DOWN){
                this.firstY=touchAreaLocalX;  // remember the x, on the first touch
            } 
            if(sceneTouchEvent.getAction()==TouchEvent.ACTION_MOVE){
                if(touchAreaLocalX>firstY+20){
                     // user swiped from left to right (at least 20 pixels)
                     niceBackgroundImage1.registerEntityModifier(new MoveModifier(3f, 0, niceBackgroundImage1.getWidth(), 0, 0, EaseBounceOut.getInstance()));
                     // the last line actualy moves the nice..image1 from left to right (in 3 seconds) and lets it bounce a little bit before it is completely out of the screen
                     return true;
                }
            }
            return false;
        }
        ...
    }
    

    您的活动

    private HUD hud;          // create a  HUD
    
    ...
    @Override
    protected void onCreateResources() {         
       this.hud = new HUD();                // init the HUD
       this.myScreen = new MyScreen(image1, image2)  // init the screen
       this.hud.attachChild(myScreen);     // attach the screen to the hud
       mEngine.getCamera().setHud(hud);  // attach your HUD to the camera
    }
    
    @Override
    protected Scene onCreateScene() {
       Scene myScene = new Scene();
       myScene.registerTouchArea(myScreen);   // you have to register the touch area of your Screen Class to the scene.
       mEngine.setScene(myScene);
    }
    

    这就是它的工作原理:

    您自己创建一个扩展Entity 的屏幕类。 Entity 可以是 AndEngine 中可见的所有内容(如 Sprite、矩形甚至整个场景)。在你的屏幕类中放一些东西让它看起来不错,最好是一张能填满整个显示器的大图。该图像将负责随后注册触摸。如果图像太小,用户错过了图像,则不会注册触摸。

    在这种情况下,我将MyScreen 的实例附加到摄像机HUD。这样,它将位于显示屏上的固定位置,并且具有固定大小(以防万一您想让scene 可滚动或可缩放)。

    现在,当应用程序启动时,HUD 将被创建并附加到相机上,并与您的 MyScreen 类一起使用。然后将创建场景并将屏幕区域注册为场景的触摸区域。当屏幕类注意到水平轴上的滑动移动时,第一个图像将移出屏幕(与滑动方向相同)。

    但请注意,这只是一个示例。当第一张图像移出屏幕或屏幕实际有多大等时,触摸必须如何动作并没有任何定义......

    我知道这是一个相当长的例子,也许它甚至不会在第一次工作,而且它绝对不是在不同屏幕之间切换的唯一方法。但它向您展示了如何覆盖onAreaTouched() 方法并注册实体修饰符以使图像移动。希望它能引导您朝着正确的方向前进,完成您想做的事情。

    【讨论】:

    • 信息丰富,但如果您不介意,请分享我触摸场景时处理触摸事件的方法,它将滑动到下一个活动。
    • 你不能在活动之间滑动,据我所知甚至不可能在场景之间滑动(至少我从来没有这样做过)。问题是,你打算做什么?例如,您可以拥有一个 Menu 屏幕,然后使用 HUD 滑动到下一个 menu
    • 我想在其中开发一个应用程序,并希望在用户向左滑动时更改屏幕。所以它使用触摸事件和滑动导航方法。
    • 我编辑了我的答案并添加了一些希望对您有所帮助的代码
    • 如果您不介意,请与我分享一些工作示例。一些实现上述场景的代码。然后我就可以做一些工作了。我已经更改了我的代码,但它对我来说不能正常工作。它只是改变屏幕方向。请帮帮我