Really Weird Emulator Error?! glTexImage2D - Bitmap/Canvas Error?

南楼画角 提交于 2019-12-24 18:26:09

问题


hope you are having a good Monday! I am extremely stuck. Never seen this error before, and there is not much to be found on google. I am trying to complete this tutorial on youtube, link > https://www.youtube.com/watch?v=GPzTSpZwFoU&list=PLWweaDaGRHjvQlpLV0yZDmRKVBdy6rSlg&index=3. I am experiencing the stranges emulator error, and would love an expert opinion.

The code

Class Background.java

package com.example.smiey.game;

import android.graphics.Bitmap;
import android.graphics.Canvas;

public class Background {

private Bitmap image;
private int x, y, dx;

public Background(Bitmap res)
{
    image = res;
}
public void update()
{
    x+=dx;
    if(x<-GamePanel.WIDTH){
        x=0;
    }
}
public void draw(Canvas canvas)
{
    canvas.drawBitmap(image, x, y,null);
    if(x<0)
    {
        canvas.drawBitmap(image, x+GamePanel.WIDTH, y, null);
    }
}
public void setVector(int dx)
{
    this.dx = dx;
}
}

Class MainThread.java

package com.example.smiey.game;
import android.graphics.Canvas;
import android.view.SurfaceHolder;

public class MainThread extends Thread
{
private int FPS = 30;
private double averageFPS;
private SurfaceHolder surfaceHolder;
private GamePanel gamePanel;
private boolean running;
public static Canvas canvas;

public MainThread(SurfaceHolder surfaceHolder, GamePanel gamePanel)
{
    super();
    this.surfaceHolder = surfaceHolder;
    this.gamePanel = gamePanel;
}
@Override
public void run()
{
    long startTime;
    long timeMillis;
    long waitTime;
    long totalTime = 0;
    int frameCount =0;
    long targetTime = 1000/FPS;

    while(running) {
        startTime = System.nanoTime();
        canvas = null;

        //try locking the canvas for pixel editing
        try {
            canvas = this.surfaceHolder.lockCanvas();
            synchronized (surfaceHolder) {
                this.gamePanel.update();
                this.gamePanel.draw(canvas);
            }
        } catch (Exception e) {
        }
        finally{
            if(canvas!=null)
            {
                try {
                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
                catch(Exception e){e.printStackTrace();}
            }
        }




        timeMillis = (System.nanoTime() - startTime) / 1000000;
        waitTime = targetTime-timeMillis;

        try{
            this.sleep(waitTime);
        }catch(Exception e){}

        totalTime += System.nanoTime()-startTime;
        frameCount++;
        if(frameCount == FPS)
        {
            averageFPS = 1000/((totalTime/frameCount)/1000000);
            frameCount =0;
            totalTime = 0;
            System.out.println(averageFPS);
        }
    }
}
public void setRunning(boolean b)
{
    running=b;
}
}

Class GamePanel.java

package com.example.smiey.game;

import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;


public class GamePanel extends SurfaceView implements SurfaceHolder.Callback
{
public static final int WIDTH = 360;
public static final int HEIGHT = 360;
private MainThread thread;
private Background bg;

public GamePanel(Context context)
{
    super(context);


    //add the callback to the surfaceholder to intercept events
    getHolder().addCallback(this);

    thread = new MainThread(getHolder(), this);

    //make gamePanel focusable so it can handle events
    setFocusable(true);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){}

@Override
public void surfaceDestroyed(SurfaceHolder holder){
    boolean retry = true;
    while(retry)
    {
        try{thread.setRunning(false);
            thread.join();

        }catch(InterruptedException e){e.printStackTrace();}
        retry = false;
    }

}

@Override
public void surfaceCreated(SurfaceHolder holder){

    bg = new Background(BitmapFactory.decodeResource(getResources(), R.drawable.grassbg1));
    bg.setVector(-5);
    //we can safely start the game loop
    thread.setRunning(true);
    thread.start();

}
@Override
public boolean onTouchEvent(MotionEvent event)
{
    return super.onTouchEvent(event);
}

public void update()
{

    bg.update();
}
@Override
public void draw(Canvas canvas)
{
//        super.draw(canvas);

    final float scaleFactorX = (float)getWidth() / WIDTH;
    final float scaleFactorY = (float)getHeight() / HEIGHT;
    if(canvas!=null) {
        final int savedState = canvas.save();
        canvas.scale(scaleFactorX, scaleFactorY);
        bg.draw(canvas);
        canvas.restoreToCount(savedState);
    }
//        super.draw(canvas);


}

}

Activity MainActivity.java

package com.example.smiey.game;


import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.view.WindowManager;


public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //turn title off
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    //set to full screen
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(new GamePanel(this));
}

Error = 11:49 AM Emulator: glTexImage2D: got err pre :( 0x502 internal 0x1907 format 0x1907 type 0x1401

Doesnt work on my real phone either. I wonder if it works on any of your devices?

来源:https://stackoverflow.com/questions/52042800/really-weird-emulator-error-glteximage2d-bitmap-canvas-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!