Android OpenGL изменить setContentView или setRenderer? - PullRequest
1 голос
/ 21 ноября 2011

Я работаю над игрой для 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 Ответ

1 голос
/ 22 ноября 2011

Если у вас есть только одно действие и один 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");

}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...