- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一款 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/
我知道这条错误消息已经有了答案,但这些解决方案都没有解决我的问题。我正在尝试做一个 Sierpinski Triangle 并且我有一个 MySurfaceView 类扩展了 GLSurfaceVie
我正在开发一款 Android 游戏,它使用 OpenGL 1.0。我创建了一个菜单,这是一个带有布局的简单 Activity ,但我不喜欢它,所以我决定在 OpenGL 中也创建它,它可以工作,但我
我是 Android 上 OpenGL-ES 的新手,所以请原谅我的愚蠢问题。我正在为 Android v2.2 - SDK#8 构建这个程序。我的平板电脑最高支持 Android v3.1 我正在尝
我是一名优秀的程序员,十分优秀!