3 Stimmen

AndEngine - Wie erstellt man eine Schaltfläche?

Ich war gestern Abend in Fahrt, als ich auf das Thema ButtonSprite stieß. Ich hätte schwören können, dass ich das schon einmal gemacht habe - es scheint so einfach zu sein - aber die Verwendung des Codes, den AndEngineExamples zur Verfügung stellt, macht nicht wirklich Sinn und führt zu Fehlern (zum Beispiel - warum erstellt eine vage "run()"-Methode die Antwort auf jedes einzelne Touch-Ereignis?)

Also habe ich etwas getan, was mir sinnvoll erschien.

private void loadScenes()
{
    mainScene = new Scene();
    menu = new Sprite(0, 0, menuTextureRegion, mEngine.getVertexBufferObjectManager()){
        @Override
        protected void preDraw(GLState pGLState, Camera pCamera) 
        {
            super.preDraw(pGLState, pCamera);
            pGLState.enableDither();
        }
    };

    newgamebutton = new ButtonSprite(25, 200, newgameTextureRegion, mEngine.getVertexBufferObjectManager());
    multiplayerbutton = new ButtonSprite(25, 310, multiplayerTextureRegion, mEngine.getVertexBufferObjectManager());

    menu.setScale(1.65f);
    menu.setPosition((CAMERA_WIDTH - menu.getWidth()) * 0.5f, (CAMERA_HEIGHT - menu.getHeight()) * 0.5f);

    mainScene.attachChild(menu);
    mainScene.attachChild(newgamebutton);
    mainScene.attachChild(multiplayerbutton);

    mainScene.registerTouchArea(multiplayerbutton);
    mainScene.setTouchAreaBindingOnActionDownEnabled(true);

    multiplayerbutton.onAreaTouched(mButtonTouched, multiplayerbutton.getWidth(), multiplayerbutton.getHeight());

    if(mButtonTouched.isActionDown()) {
        mainScene.detachChild(menu);
        mainScene.detachChild(multiplayerbutton);
    }

}

Das scheint sehr sinnvoll zu sein. Wenn der "Multiplayer-Button" gedrückt wird, erhält man den mButtonTouched, und wenn dieser gedrückt wird, werden das Menü und der Multiplayer-Button getrennt. Dies ist offensichtlich nur ich Dinge zu testen, und nicht Teil eines tatsächlichen Projekts, weil ich gerade lernen, aber ich bekomme eine Null-Zeiger-Ausnahme und die app rechts schließt vor der Anzeige der "Menü-Szene", die offensichtlich normalerweise funktioniert. Auch auf verschiedenen Seiten heißt es, dass ich "public boolean" vor multiplayerbutton setzen sollte, aber Eclipse wird nicht haben, dass.

Ich bin sicher, ihr habt das schon herausgefunden, aber ich bin suuuuuuper neu in AndEngine. Danke für jede Hilfe, Leute!

4voto

JohnEye Punkte 5959

Nachdem ich mir den Code angesehen habe, glaube ich, dass Sie so etwas machen wollten:

ButtonSprite button = new ButtonSprite(25, 310, multiplayerTextureRegion, mEngine.getVertexBufferObjectManager()) {
       @Override
       public boolean onAreaTouched(TouchEvent pTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) {
           if(pTouchEvent.isActionDown()) {
               mainScene.detachChild(menu);
               mainScene.detachChild(multiplayerbutton);
           }
           return super.onAreaTouched(pTouchEvent, pTouchAreaLocalX, pTouchAreaLocalY);
       }
};

Ihr Code funktioniert nicht, weil die letzte if-Anweisung nicht wirklich Sinn macht - sie prüft, ob die Schaltfläche gedrückt ist, wenn die Methode loadScenes() ausgeführt wird. Ich schlage vor, dass Sie sich über anonyme innere Klassen informieren. Ich habe lange gebraucht, um herauszufinden, dass die Verwendung von anonymen inneren Klassen ein gültiger und nützlicher Ansatz in AndEngine ist.

Hier ist ein primitives Beispiel für eine andere Art der Verwaltung von Schaltflächen:

mScene.setOnAreaTouchListener(new IOnAreaTouchListener() {
    @Override
    public boolean onAreaTouched(TouchEvent pSceneTouchEvent, ITouchArea pTouchArea, float pTouchAreaLocalX, float pTouchAreaLocalY) {
        if (pTouchArea.equals(button) {
            doSomething();
            return true;
        }
        return false;
    }
});

Bitte beachten Sie, dass dies nur bei der Berührung von Shapes funktioniert. Wenn Sie Berührungsereignisse außerhalb von Shapes erkennen möchten, müssen Sie stattdessen IOnSceneTouchListener verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X