diff --git a/app/src/main/java/jonathan/balljumper/GameSurfaceView.java b/app/src/main/java/jonathan/balljumper/GameSurfaceView.java new file mode 100644 index 0000000..0991865 --- /dev/null +++ b/app/src/main/java/jonathan/balljumper/GameSurfaceView.java @@ -0,0 +1,159 @@ +package jonathan.balljumper; + +import android.app.Activity; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.ColorFilter; +import android.graphics.LightingColorFilter; +import android.graphics.Paint; +import android.graphics.Point; +import android.graphics.Rect; +import android.view.SurfaceHolder; +import android.view.SurfaceView; + +import jonathan.balljumper.classes.Ball; +import jonathan.balljumper.classes.Panel; +import jonathan.balljumper.classes.Sprite; + +/** + * Created by Jonathan on 27/07/2017. + */ + +public class GameSurfaceView extends SurfaceView implements Runnable { + private boolean isRunning = false; + private Thread gameThread; + private SurfaceHolder holder; + + private Point screenSize; + + private Ball ball; + private Panel[] panelList; + + private final static int MAX_FPS = 40; + private final static int FRAME_PERIOD = 1000 / MAX_FPS; + + public GameSurfaceView(Context context) { + super(context); + + // Get and set window size. + screenSize = new Point(); + ((Activity)getContext()).getWindowManager() + .getDefaultDisplay() + .getSize(screenSize); + + holder = getHolder(); + holder.addCallback(new SurfaceHolder.Callback() { + @Override + public void surfaceCreated(SurfaceHolder holder) { + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + screenSize.x = width; + screenSize.y = height; + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + } + }); + + // Initialize ball. + int ballRadius = 35; + ball = new Ball(screenSize.x / 2 - ballRadius / 2, + (screenSize.y / 3) * 2 - ballRadius, + ballRadius, + Color.argb(255, 200, 34, 34)); + + // Initialize all panels. + panelList = new Panel[10]; + } + + /** + * Start or resume the game. + */ + public void resume() { + isRunning = true; + gameThread = new Thread(this); + gameThread.start(); + } + + /** + * Pause the game loop + */ + public void pause() { + isRunning = false; + boolean retry = true; + while (retry) { + try { + gameThread.join(); + retry = false; + } catch (InterruptedException e) { + // Try shutting down the thread again. + } + } + } + + /** + * Updates each frame. + */ + protected void update() { + // Game mechanics + ball.setY(ball.getY() + ball.getSpeed()); + } + + /** + * Render everything to the screen. + * @param canvas + */ + protected void render(Canvas canvas) { + // Reset background + canvas.drawColor(Color.GREEN); + + // Render ball + Paint p = new Paint(); + ColorFilter filter = new LightingColorFilter(ball.getColor(), 0); + p.setColorFilter(filter); + p.setColor(ball.getColor()); + canvas.drawCircle(ball.getX(), ball.getY(), ball.getRadius(), p); + } + + @Override + public void run() { + while(isRunning) { + // Make sure the surface is ready + if (! holder.getSurface().isValid()) { + continue; + } + long started = System.currentTimeMillis(); + + // Update objects. + update(); + + // Render objects to screen. + Canvas canvas = holder.lockCanvas(); + if (canvas != null) { + render(canvas); + holder.unlockCanvasAndPost(canvas); + } + + // Make sure update, updates accordingly to the FPS. + float deltaTime = (System.currentTimeMillis() - started); + int sleepTime = (int) (FRAME_PERIOD - deltaTime); + if (sleepTime > 0) { + try { + gameThread.sleep(sleepTime); + } + catch (InterruptedException e) { + } + } + while (sleepTime < 0) { + update(); + sleepTime += FRAME_PERIOD; + } + } + } +}