Android SurfaceView或Emulator错误

时间:2015-01-24 18:52:00

标签: java android android-emulator surfaceview

我目前正在尝试为Android开发游戏。为此,我使用Android Studio并使用SurfaceView控件绘制图像。问题是表面视图仅在两帧之间切换。我正在开发API级别15并使用模拟器。

示例:我的精灵的X位置以50px逐帧增加

第1帧:在(100,100)处绘制精灵,X位置= 100

第2帧:在(150,100)处绘制精灵,X位置= 150

第3帧:在(200,100)处绘制精灵,X位置= 200

第4帧:在(150,100)处绘制精灵,X位置= 250

第5帧:在(200,100)处绘制精灵,X位置= 300

然后它会以相同的方式继续(第2帧,第3帧,第2帧......等),同时正确增加x坐标。

奇怪的是,游戏正常运行的前几帧,然后这个循环开始。我知道X-Position值正确递增(从调试器中查找)。

我通过重新启动模拟器解决了问题,但我想知道这个问题是否会再次发生在该应用的真实用户身上。顺便说一句,我来自Visual Studio和Windows Phone,因此我对android没有太多经验。

我的GameThread类: 注意:SpriteBatch扩展了SurfaceView并实现了SurfaceHolder.Callback

public class GameThread extends Thread
{
private boolean running = false;
private SpriteBatch canvas = null;
private SurfaceHolder surfaceHolder = null;

public GameThread(SpriteBatch sp)
{
    super();
    this.canvas = sp;
    this.surfaceHolder = sp.getHolder();
}

public void startThread()
{
    running = true;
    super.start();
}

public void stopThread()
{
    running = false;
}

public void run()
{
    Canvas c = null;
    while (running)
    {
        c = null;
        try
        {
            c = surfaceHolder.lockCanvas();
            synchronized (surfaceHolder)
            {
                if (c != null)
                {
                    canvas.onDraw(c);
                }
            }

            sleep(16);
        }
        catch(InterruptedException ie)
        {
        }
        finally
        {
            if (c != null)
            {
                surfaceHolder.unlockCanvasAndPost(c);
            }
        }
    }
}

}

SpriteBatch.onDraw:

public void onDraw(Canvas canvas)
{
    StartTime=System.nanoTime();
    canvas.drawColor(Color.WHITE);

    //Created under initialization
    //Paint PaintCommand=new Paint();
    //PaintCommand.setAlpha(100);
    //MyMatrix=new Matrix();
    //MyMatrix.postScale(0.5f,0.5f);
    //MyMatrix.postTranslate(50,50);

    canvas.drawBitmap(MyTexture, MyMatrix, PaintCommand);

    EndTime=System.nanoTime();

    Game1.Elapsed=(float)((EndTime-StartTime)/1000000000f);
}

0 个答案:

没有答案