summaryrefslogtreecommitdiff
path: root/same-android/src/main/java/com/orbekk/same/GameView.java
diff options
context:
space:
mode:
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.java50
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