Я работаю над игрой для Android, она использует OpenGL 1.0. Я создал меню, которое представляло собой простое действие с макетом, но оно мне не понравилось, поэтому я решил создать его и в OpenGL, что работает, но я не знаю, как переключиться на настоящую игру. Я хотел бы сделать это в другом GLSurfaceView, потому что, создавая все в одном, я должен загрузить все текстуры в начале, что может быть медленным.

Мой вопрос в том, что можно как-то изменить setContentView или setRenderer? Базовая часть приложения выглядит следующим образом: http://developer. android.com/resources/tutorials/opengl/opengl-es10.html#creating, где setContentView — это место, где я управляю событиями Touch и Key, и там я устанавливаю для setRenderer значение GLSurfaceView.

1
matthew3r 21 Ноя 2011 в 15:39

1 ответ

Если у вас есть только одно действие и один GLSurfaceView, вы можете переключать то, что вы рендерите, манипулируя объектом рендерера.

public class MyRenderer implements Renderer {

Vector<String> modelsToLoad;
HashMap<String, Model> models;
String[] modelsToDraw;
Context context;

@Override
public void onDrawFrame(GL10 gl) {

    // load models ahead of time
    while(modelsToLoad.size()>0){
        String modelFilename = modelsToLoad.remove(0);
        models.put(modelFilename, new Model(modelFilename,context,gl));
    }

    // keep drawing current models
    for(int i = 0;i<modelsToDraw.length;i++){           
        models.get(modelsToDraw[i]).draw(gl);
    }

}

// queue models to be loaded when onDraw is called
public void loadModel(String filename){
    modelsToLoad.add(filename);
}

// switch to in-game scene
public void drawGame(){
    modelsToDraw = new String[]{"tank.mdl", "soldier.mdl"};
}

// switch to menu scene
public void drawMenuBackground(){
    modelsToDraw = new String[]{"bouncingBall.mdl", "gun.mdl"};     
}
}

Тогда в onCreate:

MyRenderer myRenderer;

public void onCreate(Bundle bundle){
    super.onCreate(bundle);

    // set layout which has everything in it
    setContentView(R.layout.main);

    myRenderer = new Renderer(this);

    // load menu models
    myRenderer.loadModel("bouncingBall.mdl");
    myRenderer.loadModel("gun.mdl");

    // set up the glsurfaceview
    GLSurfaceView mGLView = findViewById(R.id.glsurfaceview1);
    mGLView.setRenderer(myRenderer);

    // set the renderer to draw menu background objects
    myRenderer.drawMenuBackground();

    // set the new game button to start the game
    ImageButton newGameButton = findViewById(R.id.new_game_button1);
    newGameButton.setOnClickListener(new OnClickListener(){

        public void onClick(View v){            

            // make menu invisible
            findViewById(R.id.menu_linearLayout1).setVisibility(View.GONE);

            // tell renderer to render game scene
            myRenderer.drawGame();
        }

    });


    // make the menu visible
    findViewById(R.id.menu_linearLayout1).setVisibility(View.VISIBLE);


    // finally we have some time whilst the user decides on their menu option
    // use it to load game models in anticipation of the user clicking new game
    myRenderer.loadModel("tank.mdl");
    myRenderer.loadModel("soldier.mdl");

}

Таким образом, вместо того, чтобы возиться с двумя объектами рендерера или несколькими GLSurfaceView, у вас вместо этого есть один объект рендерера, и вы просто указываете ему, что рендерить и когда. Вы можете управлять им так, чтобы оно загружало модели и текстуры только тогда, когда вам это нужно или в ожидании какой-то потребности. Также это упрощает задачу, если вы решите использовать одну и ту же модель более чем в одном месте. Если вы хотите поместить в свое меню модель, которая также присутствует в игре, вы можете просто загрузить ее один раз и повторно использовать столько раз, сколько захотите!

1
James Coote 22 Ноя 2011 в 23:49