gpt4 book ai didi

Android OpenGL 更改 setContentView 或 setRenderer?

转载 作者:行者123 更新时间:2023-11-30 04:27:33 26 4
gpt4 key购买 nike

我正在开发一款 Android 游戏,它使用 OpenGL 1.0。我创建了一个菜单,这是一个带有布局的简单 Activity ,但我不喜欢它,所以我决定在 OpenGL 中也创建它,它可以工作,但我不知道如何切换到实际游戏。我想在另一个 GLSurfaceView 中执行此操作,因为在一个中创建所有内容然后我必须在开始时加载所有纹理,这可能会很慢。

我的问题是,可以通过某种方式更改 setContentView 或 setRenderer 吗?该应用程序的基本信息如下:http://developer.android.com/resources/tutorials/opengl/opengl-es10.html#creating其中 setContentView 是我控制 Touch 和 Key 事件的地方,我在那里将 setRenderer 设置为 GLSurfaceView。

最佳答案

如果您只有一个 Activity 和一个 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,不如拥有一个渲染器对象,您只需告诉它渲染什么以及何时渲染。您可以对其进行管理,使其仅在您需要或预期需要时才加载模型和纹理。如果您决定在多个地方使用相同的模型,这也会使事情变得更容易。如果您想在您的菜单中放置一个模型,该模型在游戏中也有特色,您可以只加载一次并重复使用多次!

关于Android OpenGL 更改 setContentView 或 setRenderer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8211219/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com