Subversion Repositories AndroidProjects

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package com.gebauz.pingK;

import java.util.logging.Level;
import java.util.logging.Logger;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Handler;
import android.view.SurfaceHolder;

public class PaintThread extends Thread {
       
        private SurfaceHolder mSurfaceHolder;
//      private Handler mHandler;
//      private Context mContext;
        private Paint mBlackPaint;

        GameMain mGameMain;

        // for consistent rendering
        private long sleepTime;
       
        // amount of time to sleep for (in milliseconds)
        private long delay = 50;
       
        // current time, used to calculate delta times
        private long systemMillis = 0;
           
        // state of game (Running or Paused).
        int state = 1;
        public final static int RUNNING = 1;
        public final static int PAUSED = 2;

        public PaintThread(SurfaceHolder surfaceHolder, Context context, Handler handler, GameMain gEngineS) {
            //data about the screen
            mSurfaceHolder = surfaceHolder;
//          mHandler = handler;
//          mContext = context;
       
            //black painter below to clear the screen before the game is rendered
            mBlackPaint = new Paint();
            mBlackPaint.setARGB(255, 0, 0, 0);
            //mLinePaint.setAntiAlias(true);
       
            mGameMain = gEngineS;
           
            systemMillis = System.currentTimeMillis();
        }


    // This is the most important part of the code. It is invoked when the call to start() is
    // made from the SurfaceView class. It loops continuously until the game is finished or
    // the application is suspended.
    @Override
    public void run() {
        //UPDATE
        while (state==RUNNING) {
                // time before update
                long beforeTime = System.nanoTime();
                // This is where we update the game engine
               
                long currentTimeMs = System.currentTimeMillis();
                long deltaTimeMs = currentTimeMs - systemMillis;
                mGameMain.update((float)deltaTimeMs / 1000.0f);
                systemMillis = currentTimeMs;

                // DRAW
                Canvas c = null;
                try {
                        // lock canvas so nothing else can use it
                        c = mSurfaceHolder.lockCanvas(null);
                       
                        synchronized (mSurfaceHolder) {
                                // clear the screen with the black painter.
                                //c.drawRect(0, 0, c.getWidth(), c.getHeight(), mBlackPaint);
                                c.drawARGB(255, 0, 0, 0);
                                // This is where we draw the game engine.
                                mGameMain.render(c);
                        }
                } finally {
                                // do this in a finally so that if an exception is thrown
                                // during the above, we don't leave the Surface in an
                                // inconsistent state
                                if (c != null) {
                                        mSurfaceHolder.unlockCanvasAndPost(c);
                                }
                }

                // SLEEP
                // Sleep time. Time required to sleep to keep game consistent
                // This starts with the specified delay time (in milliseconds) then subtracts from that the
                // actual time it took to update and render the game. This allows our game to render smoothly.
                this.sleepTime = delay-((System.nanoTime()-beforeTime)/1000000L);

                try {
                        //actual sleep code
                        if (sleepTime > 0) {
                        PaintThread.sleep(sleepTime);
                        }
                } catch (InterruptedException ex) {
                        Logger.getLogger(PaintThread.class.getName()).log(Level.SEVERE, null, ex);
                }
        }
    }

}