我正在通过阅读本书来学习android编程,由于某种原因,当代码到达“ if(ourHolder.getSurface()。isValid()”时,它将转到else语句。代码尚未完成,但根据我的书,当我运行代码时,看到屏幕上的蛇头。根据本书的前一游戏,“ if(ourHolder.getSurface()。isValid()”工作正常,并且绘制了Canvas。我也手动调用Draw ();“ public SnakeAnimView(Context context)”中的方法。为什么“ if(ourHolder.getSurface()。isValid()”转到else语句?

谢谢您的帮助**

码:

package com.packetpub.snake;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

//public class MainActivity extends AppCompatActivity {

public class MainActivity extends Activity
{
    Canvas canvas;
    SnakeAnimView snakeAnimView;
    //The snake head sprite sheet
    Bitmap headAnimBitmap;
    //The portion of the bitmap to be drawn in the current frame
    Rect rectToBeDrawn;
    //The dimensions of a single frame
    int frameHeight = 64;
    int frameWidth = 64;
    int numFrames = 6;
    int frameNumber;
    int screenWidth;
    int screenHeight;
    //stats
    long lastFrameTime;
    int fps;
    int hi;
    //To start the game from onTouchEvent
    Intent i;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {

        Log.i("Step 1 onCreate: ", " start");

        super.onCreate(savedInstanceState);
        //find out the width and height of the screen
        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        screenWidth = size.x;
        screenHeight = size.y;
        headAnimBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.head_sprite_sheet);
        snakeAnimView = new SnakeAnimView(this);
        setContentView(snakeAnimView);
        //i = new Intent(this, GameActivity.class);

        Log.i("Step 1 onCreate: ", " display : " + display);
        Log.i("Step 1 onCreate: ", " screenWidth : " + screenWidth);
        Log.i("Step 1 onCreate: ", " screenHeight : " + screenHeight);
        Log.i("Step 1 onCreate: ", " headAnimBitmap : " + headAnimBitmap);
        Log.i("Step 1 onCreate: ", " snakeAnimView : " + snakeAnimView);
    }



    class SnakeAnimView extends SurfaceView implements Runnable
    {


        Thread ourThread = null;
        SurfaceHolder ourHolder;
        volatile boolean playingSnake = true ;
        Paint paint;



        ////Here is the constructor that gets the frameWidth value by dividing the
        //  bitmap width by the number of frames, and the frameHeight value using
        //  the getHeight method. Type this code after the code from the previous step:
        public SnakeAnimView(Context context)
        {

            super(context);
            ourHolder = getHolder();
            paint = new Paint();
            frameWidth = headAnimBitmap.getWidth() / numFrames;
            frameHeight = headAnimBitmap.getHeight();

            Log.i("Step 2 SnakeAnimView: ", "(Context context)");
            Log.i("Step 2 SnakeAnimView: ", "headAnimBitmap:" + headAnimBitmap);
            Log.i("Step 2 SnakeAnimView: ", "numFrames:" + numFrames);
            Log.i("Step 2 SnakeAnimView: ", "frameWidth:" + frameWidth);
            Log.i("Step 2 SnakeAnimView: ", "frameHeight:" + frameHeight);
            Log.i("Step 2 SnakeAnimView: ", "playingSnake:" + playingSnake);

            draw();
        }




        @Override
        public void run()
        {

            Log.i("Step 3 Run: ", "while (playingSnake): " + playingSnake );
            while (playingSnake)

            {

                Log.i("Step 3 Run: ", "start");

                //update();
                draw();
                //controlFPS();

                Log.i("Step 3 Run: ", "end");
            }
        }


        public void update()
        {

            Log.i("Step 4 update: ", "public void update()");
            //which frame should we draw
            rectToBeDrawn = new Rect((frameNumber * frameWidth) - 1,
                    0, (frameNumber * frameWidth + frameWidth) - 1,
                    frameHeight);
            //now the next frame
            frameNumber++;
            //don't try and draw frames that don't exist
            if (frameNumber == numFrames)
            {
                frameNumber = 0;//back to the first frame
            }
        }


        public void draw()
        {

            Log.i("Step 5 draw: ", "public void draw()");
            Log.i("Step 5 draw: ", "ourHolder : " + ourHolder);
            Log.i("Step 5 draw: ", "ourHolder.getSurface() = " + ourHolder.getSurface());
            boolean test = ourHolder.getSurface().isValid();
            Log.i("Step 5 draw: ", "ourHolder.getSurface().isValid() : " + test);

           if (ourHolder.getSurface().isValid())
            {
                canvas = ourHolder.lockCanvas();
                //Paint paint = new Paint();
                canvas.drawColor(Color.BLACK);//the background
                paint.setColor(Color.argb(255, 255, 255, 255));
                paint.setTextSize(150);
                canvas.drawText("Snake", 10, 150, paint);
                paint.setTextSize(25);
                canvas.drawText(" Hi Score:" + hi, 10, screenHeight - 50, paint);
                //Draw the snake head
                //make this Rect whatever size and location you like
                //(startX, startY, endX, endY)
                Rect destRect = new Rect(screenWidth/2-100,
                        screenHeight/2-100, screenWidth/2+100,
                        screenHeight/2+100);
                canvas.drawBitmap(headAnimBitmap,
                        rectToBeDrawn, destRect, paint);
                ourHolder.unlockCanvasAndPost(canvas);

                Log.i("Step 5 draw: ", "ourHolder : " + ourHolder);
                Log.i("Step 5 draw: ", "canvas : " + canvas);
                Log.i("Step 5 draw: ", "paint : " + paint);
                Log.i("Step 5 draw: ", "screenWidth : " + screenWidth);
                Log.i("Step 5 draw: ", "screenHeight : " + screenHeight);
                Log.i("Step 5 draw: ", "headAnimBitmap : " + headAnimBitmap);


            }
            else
           {
               Log.i("Step 5 draw: ", "Went to Else");

           }

        }


        public void controlFPS()
        {

            Log.i("Step 6 controlFPS: ", "public void controlFPS()");
            long timeThisFrame =
                    (System.currentTimeMillis() -
                            lastFrameTime);
            long timeToSleep = 500 - timeThisFrame;
            if (timeThisFrame > 0) {
                fps = (int) (1000 / timeThisFrame);
            }
            if (timeToSleep > 0)
            {
                try
                {
                    ourThread.sleep(timeToSleep);
                }
                catch (InterruptedException e)
                {

                }
            }
            lastFrameTime = System.currentTimeMillis();
        }


        public void pause()
        {

            Log.i("Step 7 pause: ", "public void pause())");
            playingSnake = false;
            try
            {
                ourThread.join();
            }
            catch (InterruptedException e)
            {

            }

        }

        @Override
        public boolean onTouchEvent(MotionEvent motionEvent)
        {

            Log.i("Step 8 onTouchEvent: ", "public boolean onTouchEvent)");
            startActivity(i);
            return true;
        }

    }




    @Override
    protected void onStop()
    {

        Log.i("Step 9 onStop: ", "onStop");
        super.onStop();
        while (true) {
            snakeAnimView.pause();
            break;
        }
        finish();
    }


//    @Override
//    protected void onResume() {
//        super.onResume();
//        snakeAnimView.resume();
//    }

    @Override
    protected void onPause()
    {
        Log.i("Step 10 onPause: ", "onPause");
        super.onPause();
        snakeAnimView.pause();
    }


    public boolean onKeyDown(int keyCode, KeyEvent event)
    {

        Log.i("Step 11 onKeyDown: ", "onKeyDown");
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            snakeAnimView.pause();
            finish();
            return true;
        }
        return false;
    }`enter code here`

}

最佳答案

在创建表面之前,该表面是无效的,请查看该表面创建/销毁时的各个回调。请注意,销毁它时无效。

10-05 23:37