GVKun编程网logo

android – 在后台加载 – AndEngine GLES2(android 加载中)

5

此处将为大家介绍关于android–在后台加载–AndEngineGLES2的详细内容,并且为您解答有关android加载中的相关问题,此外,我们还将为您介绍关于AndEngine后台加载资源的一些问

此处将为大家介绍关于android – 在后台加载 – AndEngine GLES2的详细内容,并且为您解答有关android 加载中的相关问题,此外,我们还将为您介绍关于AndEngine 后台加载资源的一些问题、Android 2D 游戏引擎 AndEngine 配置环境、Android Andengine质地质量差、Android OpenGL ES 开发(十): 通过GLES20与着色器交互的有用信息。

本文目录一览:

android – 在后台加载 – AndEngine GLES2(android 加载中)

android – 在后台加载 – AndEngine GLES2(android 加载中)

我在AndEngine GLES2中移植我的项目,使用GLES1版本我使用此 tutorial在后台加载资源,现在我收到此错误:

mActivity.onCreateScene Failed. @(Thread: ''GLThread 10'')
java.lang.ExceptionInInitializerError

这是我的onCreateScene方法

@Override
    public Scene onCreateScene() {
        this.mEngine.registerUpdateHandler(new FPSLogger());
        SplashScene mSplashScene = new SplashScene(this);

        IAsyncCallback callback = new IAsyncCallback() {

            @Override
            public void workTodo() {
            //Do something}

            @Override
            public void onComplete() {
                LoadingScene mloadingScene = new LoadingScene(mActivity.this);
                mActivity.this.getEngine().setScene(mloadingScene);
            }
        };

        new AsyncTaskLoader().execute(callback);

        return mSplashScene;
    }

解决方法

更改

new AsyncTaskLoader().execute(callback);

//Fixed variant working with gles1 and gles2
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            new AsyncTaskLoader().execute(callback);
        }
    });

AndEngine 后台加载资源的一些问题

AndEngine 后台加载资源的一些问题

一开始没有注意资源加载的问题,但后图形渐渐的增加了,启动画面黑屏的时间越来越长了,终于直接在加载的资源的时候就挂掉了。

加载资源的解决方案,大体搜索了下有这么几种:


第一种:来源于这个网站 https://sites.google.com/site/matimdevelopment/splash-screen---easy-way

以下完整代码的整理:


public class SplashTemplate extends BaseGameActivity
{
        private final int CAMERA_WIDTH = 720;
        private final int CAMERA_HEIGHT = 480;

        private Camera camera;
        private Scene splashScene;
        private Scene mainScene;

        private BitmapTextureAtlas splashTextureAtlas;
        private ITextureRegion splashTextureRegion;
        private Sprite splash;

        @Override
        public EngineOptions onCreateEngineOptions()
        {
                camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
                EngineOptions engineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new FillResolutionPolicy(), camera);
                return engineOptions;
        }

        @Override
        public void onCreateResources(OnCreateResourcesCallback pOnCreateResourcesCallback) throws Exception
        {
                BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
                splashTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(), 256, 256, TextureOptions.DEFAULT);
                splashTextureRegion =BitmapTextureAtlasTextureRegionFactory.createFromAsset(splashTextureAtlas, this,"splash.png", 0, 0);
                splashTextureAtlas.load();
                pOnCreateResourcesCallback.onCreateResourcesFinished();
        }

        @Override
        public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback) throwsException
        {
                initSplashScene();
                pOnCreateSceneCallback.onCreateSceneFinished(this.splashScene);
        }

        @Override
        public void onPopulateScene(Scene pScene, OnPopulateSceneCallback pOnPopulateSceneCallback) throws Exception
        {
                mEngine.registerUpdateHandler(new TimerHandler(3f, new ITimerCallback() 
                {
                    public void onTimePassed(final TimerHandler pTimerHandler) 
                    {
                        mEngine.unregisterUpdateHandler(pTimerHandler);
                        loadResources();
                        loadScenes();         
                        splash.detachSelf();
                        mEngine.setScene(mainScene);
                    }
                }));
                  
                pOnPopulateSceneCallback.onPopulateSceneFinished();
        }
        /**初始化启动画面的场景*/
        private void initSplashScene()
        {
                splashScene = new Scene();
                splash = new Sprite(0, 0, splashTextureRegion, mEngine.getVertexBufferObjectManager())
                {
                        @Override
                        protected void preDraw(GLState pGLState, Camera pCamera)
                        {
                            super.preDraw(pGLState, pCamera);
                            pGLState.enableDither();
                        }
                };
               
                splash.setScale(1.5f);
                splash.setPosition((CAMERA_WIDTH - splash.getWidth()) * 0.5f, (CAMERA_HEIGHT -splash.getHeight()) * 0.5f);

                splashScene.attachChild(splash);
        }
}


第二种: AndEngine 本身也提供了个名为 SimpleAsyncGameActivity 的类,在 org.andengine.ui.activity 包下,基本就是直接继承这个类了,然后这个类帮你在后台加载资源了,一开始会有一个进度条的。但是实际的使用情况发现,这个貌似不好用,进度一直停在 1% 了,没有动态的加载效果,而且会出现一个黑屏,以及一些残缺的图形显示等。但是当资源加载完成基本上还没有问题的。


import org.andengine.engine.options.EngineOptions;
import org.andengine.entity.scene.Scene;
import org.andengine.ui.activity.*;
import org.andengine.util.progress.IProgressListener;

public class Test extends SimpleAsyncGameActivity{

	@Override
	public EngineOptions onCreateEngineOptions() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void onCreateResourcesAsync(IProgressListener arg0) throws Exception {
		// TODO Auto-generated method stub
		//加载资源
	}

	@Override
	public Scene onCreateSceneAsync(IProgressListener arg0) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void onPopulateSceneAsync(Scene arg0, IProgressListener arg1)
			throws Exception {
		// TODO Auto-generated method stub
		
	}

}


第三种:是在官方的用户组里面找到的:


import org.andengine.engine.camera.Camera;
import org.andengine.engine.options.EngineOptions;
import org.andengine.engine.options.ScreenOrientation;
import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;
import org.andengine.entity.scene.Scene;
import org.andengine.ui.activity.SimpleBaseGameActivity;

public class Test extends SimpleBaseGameActivity {
        // ===========================================================
        // Constants
        // ===========================================================

        private static final int CAMERA_WIDTH = 800;
        private static final int CAMERA_HEIGHT = 480;

        // ===========================================================
        // Fields
        // ===========================================================

        // ===========================================================
        // Constructors
        // ===========================================================

        // ===========================================================
        // Getter & Setter
        // ===========================================================

        // ===========================================================
        // Methods for/from SuperClass/Interfaces
        // ===========================================================

        @Override
        public EngineOptions onCreateEngineOptions() {
                final Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);

                final EngineOptions engineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE_SENSOR, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera);
                engineOptions.getAudioOptions().setNeedsSound(true);

                return engineOptions;
        }
        @Override
        public void onCreateResources()
        {
                loadingTexture();
        }
        @Override
        public Scene onCreateScene()
        {
                this.runOnUiThread(new Runnable() {
                  public void run(){
                          IAsyncCallback callback = new IAsyncCallback() {
                                 @Override
                                 public void workToDo() {
                                         loadOtherTexture();                  
                                 }
                                 @Override
                                 public void onComplete() {
                                         creatMenuScene();
                                 }
                          };
                      new AsyncTaskLoader().execute(callback);
                  }
                });
                return creatLoadingScene();
        }
        public void loadingTexture()
        {
                //加载loading资源
        }
        public void loadOtherTexture()
        {
                //加载其他的资源
        }
         /**建立menuScene*/
        public Scene creatLoadingScene()
        {
                final Scene scene = new Scene();
                return scene;
        }
        /**建立menuScene*/
        public Scene creatMenuScene()
        {

        }
}


用到的两个其他的自定的类:


public abstract class IAsyncCallback {
    // ===========================================================
    // Methods
    // ===========================================================
    public abstract void workToDo();

    public abstract void onComplete();
}
public class AsyncTaskLoader extends AsyncTask<IAsyncCallback, Integer, Boolean> {

    // ===========================================================
    // Fields
    // ===========================================================

    IAsyncCallback[] _params;

    // ===========================================================
    // Inherited Methods
    // ===========================================================

    @Override
    protected Boolean doInBackground(IAsyncCallback... params) {
        this._params = params;
        int count = params.length;
        for(int i = 0; i < count; i++){
            params[i].workToDo();
        }
        return true;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        int count = this._params.length;
        for(int i = 0; i < count; i++){
            this._params[i].onComplete();
        }
    }
}


目前使用的的是这个,感觉不错,但是也有问题,就是在后台加载完资源的显示下一个场景的时候会显示一个灰色的屏,貌似不是每次都显示的。

具体的可以参考用户组的这篇帖子:

http://www.andengine.org/forums/gles2/problems-with-asynctaskloader-in-gles2-in-oncreatescene-t6250.html

总结:

自己刚开始做 java 方面的东西,有很多的不懂。发现 andEngine 的中文资源太少了,有太多的相同的帖子,还是谷歌的适合技术贴的搜索。

发现 LGame 游戏框架的作者的这篇文章的不错,但就是没有发现发现作者类似的文章了。

http://blog.csdn.net/cping1982/article/details/6227775

作者在 Android 游戏框架 AndEngine 使用入门这篇文章也谈到资源加载的东西,但是貌似那个方法的再新的版本上无法正常运行了,一运行便出现错误了。




Android 2D 游戏引擎 AndEngine 配置环境

Android 2D 游戏引擎 AndEngine 配置环境

Android 2D 游戏引擎 AndEngine 配置环境

1.2  配置环境

在任何编程中,都需要一些软件或者硬件的支持。否则,没有硬件软件是不可能存在的,而想要编写对应语言的的程序,这需要对应语言库和编译器等的支持。所以在开 AndEngine 的游戏也需要这些东西,而我们需要的环境都有那些呢?本节内容就将解密 AndEngine 环境的配置本文选自 Android 2D 游戏引擎 AndEngine 快速入门教程

1.2.1  环境要求

编写 AndEngine 需要一定的编程环境才可以完成编写。而为了调试,需要用到相应的设备才可以正常调试。这一小节就来讲一下需要编程环境。本书中需要的软件和硬件设备如下本文选自 Android 2D 游戏引擎 AndEngine 快速入门教程

q  一台计算机:计算机中安装的系统必须是 Windows XPWindows VistaWindows 7Windows 8Linux(例如 Ubuntu)和 Mac OS 10.5.8 中的一种,或者这些类型系统中的最新版。

q  Java SDK:需要的 JDK 必须为 JDK 6 以上的版本。

q  Eclipse 编辑工具。

q  AndEngine AndEnginePhysicsBox2DExtension 项目文件。

q  包含 ADT Android SDK

q  一台装有 Android 系统的设备。

因为在国内 Windows 系统应用较为广泛,并且使用也十分简便,所以本书中选择了典型的 Windows 平台进行开发。下面就讲解在 Windows 下如何配置其它软件本文选自 Android 2D 游戏引擎 AndEngine 快速入门教程

1.2.2  配置 JDK

JDK 全称为 Java Development Kit(也即 Java 开发包),是用于支持 Java 编程的基础。无论是什么编程,只要用到了 Java 的编程和调试就需要安装 JDKJDK 也不是一尘不变的,JDK 有很多的版本,各个版本之间都有一些差别。就现在来说,用的最多的大版本应该是 JDK 6 JDK 7,而我们这里将要讲解基于 JDK 8 AndEngine 引擎的使用。

1. 下载需要的 JDK

1)下载 JDK,从网址为 http://www.oracle.com/technetwork/java/javase/downloads/index.html Oracle 网站下载安装包。如图 1.2,在此页面下 Oracle 会提供最新版本的 JDK 下载连接。笔者现在使用的为 8u20 版本,读者朋友在下载时有可能为更新的版。在图 1.2 中单击箭头指的方框处可以进入下载页面本文选自 Android 2D 游戏引擎 AndEngine 快速入门教程

1.2  JDK 下载(一)

2)选择下载的安装包。进入下载页面后向下滚动滚轮,可以看到如图 1.3 所示界面。这里提供了当前版本在不同系统中的不同 JDK,读者需要根据自己需求选择。在选择下载之前需要同意 Oracle 使用的协议,单击 Accept Licens Agreement 前的圆圈,即视为同意该协议。然后选择单击需要的版本开始下载,本书中选择了 Windows x64 版本的 JDK,如图 1.3 中,单击 jdk-8u20-windows-x64.exe 开始下载本文选自 Android 2D 游戏引擎 AndEngine 快速入门教程

1.3  下载 JDK(二)


Android Andengine质地质量差

Android Andengine质地质量差

问题:使用Andengine(包裹opengl)编写的 Android应用程序质地质量差,特别是在渐变中,它们以少量颜色显示为步骤.真实和虚拟设备上出现问题

设置:默认纹理,全屏,原生分辨率,android 2.2.
我试图用以下方法强制执行PixelFromat:

public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getwindow();
    window.setFormat(PixelFormat.RGBA_8888);
}

没有任何区别.

评论线:
GLHelper.disableDither(PGL);帮助了一点纹理,但让粒子看起来很糟糕,所以猜测它不是问题的根源.

示例加载代码:

public static void loadResources(StreamgameActivity game) {
    magnetTexture = new BitmapTextureAtlas(512,512,TextureOptions.BILINEAR);
    magnetTextureRegion = BitmapTextureAtlasTextureRegionFactory
       .createFromAsset(magnetTexture,game,"bateria128CMatte_none.png",0);
    game.getEngine().getTextureManager().loadTexture(magnetTexture);
}

解决方法

如果有人正在经历质量差的质量和GLES2的条带这里是解决方案:
只需覆盖你的Sprite的preDraw()并启用这样的抖动:

Sprite electricityOff = new Sprite(0,mElectricityOffTextureRegion,getVertexBufferObjectManager()) {
    @Override
    protected void preDraw(GLState pGLState,Camera pCamera) {
        super.preDraw(pGLState,pCamera);
        pGLState.enableDither();
    }
};

关键元素是pGLState.enableDither();.
您不需要任何其他内容,但如果您想确保可以添加的曲面和活动的32位渲染:

@Override
protected void onSetContentView() {
    mRenderSurfaceView = new RenderSurfaceView(this);
    mRenderSurfaceView.setEGLConfigChooser(8,8,24,0);
    mRenderSurfaceView.setRenderer(mEngine,this);
    mRenderSurfaceView.getHolder().setFormat(PixelFormat.RGBA_8888);

    this.setContentView(mRenderSurfaceView,BaseGameActivity.createSurfaceViewLayoutParams());
}


@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getwindow();
    window.setFormat(PixelFormat.RGBA_8888);
}

Android OpenGL ES 开发(十): 通过GLES20与着色器交互

Android OpenGL ES 开发(十): 通过GLES20与着色器交互

1. 获取着色器程序内成员变量的id(句柄、指针)

GLES20.glGetAttribLocation方法:获取着色器程序中,指定为attribute类型变量的id。 GLES20.glGetUniformLocation方法:获取着色器程序中,指定为uniform类型变量的id。

如:

// 获取指向着色器中aPosition的index
maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
// 获取指向着色器中uMVPMatrix的index
muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");

2. 向着色器传递数据

使用上一节获取的指向着色器相应数据成员的各个id,就能将我们自己定义的顶点数据、颜色数据等等各种数据传递到着色器当中了。

// 使用shader程序
GLES20.glUseProgram(mProgram);
// 将最终变换矩阵传入shader程序
GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(), 0);
// 设置缓冲区起始位置
mRectBuffer.position(0);
// 顶点位置数据传入着色器
GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, 20, mRectBuffer);
// 顶点颜色数据传入着色器中
GLES20.glVertexAttribPointer(maColorHandle, 4, GLES20.GL_FLOAT, false, 4*4, mColorBuffer);
// 顶点坐标传递到顶点着色器
GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, 20, mRectBuffer);
// 允许使用顶点坐标数组
GLES20.glEnableVertexAttribArray(maPositionHandle);
// 允许使用顶点颜色数组
GLES20.glDisableVertexAttribArray(maColorHandle);
// 允许使用定点纹理数组
GLES20.glEnableVertexAttribArray(maTextureHandle); 
// 绑定纹理
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture);
// 图形绘制
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 4);

2.1 定义顶点属性数组

void glVertexAttribPointer (int index, int size, int type, boolean normalized, int stride, Buffer ptr )

参数含义: index 指定要修改的顶点着色器中顶点变量id; size 指定每个顶点属性的组件数量。必须为1、2、3或者4。如position是由3个(x,y,z)组成,而颜色是4个(r,g,b,a)); type 指定数组中每个组件的数据类型。可用的符号常量有GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,GL_UNSIGNED_SHORT, GL_FIXED, 和 GL_FLOAT,初始值为GL_FLOAT; normalized 指定当被访问时,固定点数据值是否应该被归一化(GL_TRUE)或者直接转换为固定点值(GL_FALSE); stride 指定连续顶点属性之间的偏移量。如果为0,那么顶点属性会被理解为:它们是紧密排列在一起的。初始值为0。如果normalized被设置为GL_TRUE,意味着整数型的值会被映射至区间-1,1,或者区间[0,1](无符号整数),反之,这些值会被直接转换为浮点值而不进行归一化处理; ptr 顶点的缓冲数据。

2.2 启用或者禁用顶点属性数组

调用GLES20.glEnableVertexAttribArray和GLES20.glDisableVertexAttribArray传入参数index。

GLES20.glEnableVertexAttribArray(glHPosition);
GLES20.glEnableVertexAttribArray(glHCoordinate);

如果启用,那么当GLES20.glDrawArrays或者GLES20.glDrawElements被调用时,顶点属性数组会被使用。

2.3 选择活动纹理单元。

void glActiveTexture (int texture)

texture指定哪一个纹理单元被置为活动状态。texture必须是GL_TEXTUREi之一,其中0 <= i < GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,初始值为GL_TEXTURE0。 GLES20.glActiveTexture()确定了后续的纹理状态改变影响哪个纹理,纹理单元的数量是依据该纹理单元所被支持的具体实现。

今天关于android – 在后台加载 – AndEngine GLES2android 加载中的分享就到这里,希望大家有所收获,若想了解更多关于AndEngine 后台加载资源的一些问题、Android 2D 游戏引擎 AndEngine 配置环境、Android Andengine质地质量差、Android OpenGL ES 开发(十): 通过GLES20与着色器交互等相关知识,可以在本站进行查询。

本文标签: