Andengine滑动导航

时间:2013-04-15 07:02:42

标签: android andengine

我是andengine的新手,想知道如何在两个BaseGameActivities之间切换。并且当从第一活动切换到第二活动时,在切换之间没有黑屏转换。有没有办法做到这一点。 请帮帮我。

1 个答案:

答案 0 :(得分:2)

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在活动之间切换,也不能在场景之间平滑切换。这里有一个关于如何在两个屏幕(例如菜单)之间切换的快速示例。在这个例子中,屏幕实际上是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,Rectangle甚至整个场景)。在屏幕类中添加一些内容使其看起来不错,最好是填满整个显示屏的大图像。之后,该图像将负责注册触摸。如果图像太小而用户错过了图像,则不会记录任何触摸。

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

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

但要小心,这只是一个例子。当第一张图像移出屏幕或屏幕实际有多大等等时,没有任何关于触摸如何动作的定义......

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