diff options
Diffstat (limited to 'same-android/src/main/java/com/orbekk/same/GameView.java')
-rw-r--r-- | same-android/src/main/java/com/orbekk/same/GameView.java | 50 |
1 files changed, 32 insertions, 18 deletions
diff --git a/same-android/src/main/java/com/orbekk/same/GameView.java b/same-android/src/main/java/com/orbekk/same/GameView.java index f3d018d..31ac27c 100644 --- a/same-android/src/main/java/com/orbekk/same/GameView.java +++ b/same-android/src/main/java/com/orbekk/same/GameView.java @@ -1,22 +1,16 @@ package com.orbekk.same; +import java.util.concurrent.atomic.AtomicBoolean; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.orbekk.same.State.Component; -import com.orbekk.same.ClientService; -import com.orbekk.same.Client; -import com.orbekk.same.UpdateConflict; - import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; -import android.widget.Toast; - -import java.util.concurrent.atomic.AtomicReference; public class GameView extends SurfaceView implements SurfaceHolder.Callback { private Logger logger = LoggerFactory.getLogger(getClass()); @@ -44,6 +38,7 @@ public class GameView extends SurfaceView implements SurfaceHolder.Callback { private Paint background; private Variable<Player> player; private VariableUpdaterTask<Player> updater; + private AtomicBoolean shouldRedraw = new AtomicBoolean(true); private Paint color = new Paint(); @@ -87,17 +82,36 @@ public class GameView extends SurfaceView implements SurfaceHolder.Callback { } @Override public void run() { - Canvas c = null; - try { - c = holder.lockCanvas(); - synchronized(holder) { - doDraw(c); + while (true) { + Canvas c = null; + try { + c = holder.lockCanvas(); + synchronized(holder) { + doDraw(c); + } + } finally { + holder.unlockCanvasAndPost(c); + } + synchronized (this) { + if (Thread.interrupted()) { + break; + } + try { + while (!shouldRedraw.get()) { + wait(); + } + } catch (InterruptedException e) { + break; + } } - } finally { - holder.unlockCanvasAndPost(c); } } + private synchronized void setShouldRedraw() { + shouldRedraw.set(true); + notifyAll(); + } + private synchronized void setPosition(final float x, final float y) { if (player.get() == null || player.get().posX != x || player.get().posY != y) { @@ -107,10 +121,10 @@ public class GameView extends SurfaceView implements SurfaceHolder.Callback { } @Override - public void valueChanged(Variable<Player> unused) { + public synchronized void valueChanged(Variable<Player> unused) { logger.info("Variable updated."); player.update(); - run(); + setShouldRedraw(); } } @@ -151,7 +165,7 @@ public class GameView extends SurfaceView implements SurfaceHolder.Callback { @Override public void surfaceDestroyed(SurfaceHolder holder) { logger.info("SurfaceDestroyed()"); - // TODO: Stop thread. + thread.interrupt(); } @Override |