diff --git a/app/build/intermediates/res/resources-debug.ap_ b/app/build/intermediates/res/resources-debug.ap_ index 76644bc..ea0e827 100644 Binary files a/app/build/intermediates/res/resources-debug.ap_ and b/app/build/intermediates/res/resources-debug.ap_ differ diff --git a/app/src/main/java/com/example/julian/endlessroll/data/SynchronizedArrayList.java b/app/src/main/java/com/example/julian/endlessroll/data/SynchronizedArrayList.java new file mode 100644 index 0000000..6bf3065 --- /dev/null +++ b/app/src/main/java/com/example/julian/endlessroll/data/SynchronizedArrayList.java @@ -0,0 +1,147 @@ +package com.example.julian.endlessroll.data; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Created by Julian on 16.11.2016. + */ + +public class SynchronizedArrayList extends ArrayList { + + @Override + public synchronized String toString() { + return super.toString(); + } + + @Override + public synchronized boolean add(E object) { + return super.add(object); + } + + @Override + public synchronized void add(int index, E object) { + super.add(index, object); + } + + @Override + public synchronized boolean addAll(Collection collection) { + return super.addAll(collection); + } + + @Override + public synchronized boolean addAll(int index, Collection collection) { + return super.addAll(index, collection); + } + + @Override + public synchronized void clear() { + super.clear(); + } + + @Override + public synchronized Object clone() { + return super.clone(); + } + + @Override + public synchronized void ensureCapacity(int minimumCapacity) { + super.ensureCapacity(minimumCapacity); + } + + @Override + public synchronized E get(int index) { + return super.get(index); + } + + @Override + public synchronized int size() { + return super.size(); + } + + @Override + public synchronized boolean isEmpty() { + return super.isEmpty(); + } + + @Override + public synchronized boolean contains(Object object) { + return super.contains(object); + } + + @Override + public synchronized int indexOf(Object object) { + return super.indexOf(object); + } + + @Override + public synchronized int lastIndexOf(Object object) { + return super.lastIndexOf(object); + } + + @Override + public synchronized E remove(int index) { + return super.remove(index); + } + + @Override + public synchronized boolean remove(Object object) { + return super.remove(object); + } + + @Override + protected synchronized void removeRange(int fromIndex, int toIndex) { + super.removeRange(fromIndex, toIndex); + } + + @Override + public synchronized E set(int index, E object) { + return super.set(index, object); + } + + @Override + public synchronized Object[] toArray() { + return super.toArray(); + } + + @Override + public synchronized T[] toArray(T[] contents) { + return super.toArray(contents); + } + + @Override + public synchronized void trimToSize() { + super.trimToSize(); + } + + @Override + public synchronized int hashCode() { + return super.hashCode(); + } + + @Override + public synchronized boolean equals(Object o) { + return super.equals(o); + } + + @Override + public synchronized List subList(int start, int end) { + return super.subList(start, end); + } + + @Override + public synchronized boolean containsAll(Collection collection) { + return super.containsAll(collection); + } + + @Override + public synchronized boolean removeAll(Collection collection) { + return super.removeAll(collection); + } + + @Override + public synchronized boolean retainAll(Collection collection) { + return super.retainAll(collection); + } +} diff --git a/app/src/main/java/com/example/julian/endlessroll/entities/Background.java b/app/src/main/java/com/example/julian/endlessroll/entities/Background.java index ca0c2ce..fc94d2d 100644 --- a/app/src/main/java/com/example/julian/endlessroll/entities/Background.java +++ b/app/src/main/java/com/example/julian/endlessroll/entities/Background.java @@ -1,14 +1,13 @@ package com.example.julian.endlessroll.entities; +import com.example.julian.endlessroll.data.SynchronizedArrayList; import com.example.julian.endlessroll.data.Vector; import com.example.julian.endlessroll.entities.textures.Texture; -import java.util.ArrayList; - /** * Created by Julian on 20.07.2016. */ -public class Background extends ArrayList { +public class Background extends SynchronizedArrayList { private final float PART_WIDTH = 5; private final float HALF_PART_WIDTH = PART_WIDTH / 2; @@ -21,8 +20,10 @@ public class Background extends ArrayList { public void changeTexture(Texture texture) { this.texture = texture; - for (Entity entity : this) - entity.setTexture(texture); + synchronized (this) { + for (Entity entity : this) + entity.setTexture(texture); + } } private Entity createPart(float xLeftEdge) { @@ -31,8 +32,10 @@ public class Background extends ArrayList { public void move(float x, float cameraX) { Vector movement = new Vector(x, 0); - for (Entity part : this) - part.move(movement); + synchronized (this) { + for (Entity part : this) + part.move(movement); + } if (!super.isEmpty()) { Entity last = super.get(super.size() - 1); if (last.getRightEdge() - cameraX < 3) { diff --git a/app/src/main/java/com/example/julian/endlessroll/entities/tileLists/TileList.java b/app/src/main/java/com/example/julian/endlessroll/entities/tileLists/TileList.java index fedb0d4..9533d34 100644 --- a/app/src/main/java/com/example/julian/endlessroll/entities/tileLists/TileList.java +++ b/app/src/main/java/com/example/julian/endlessroll/entities/tileLists/TileList.java @@ -1,5 +1,6 @@ package com.example.julian.endlessroll.entities.tileLists; +import com.example.julian.endlessroll.data.SynchronizedArrayList; import com.example.julian.endlessroll.entities.Entity; import com.example.julian.endlessroll.entities.textures.Texture; import com.example.julian.endlessroll.levels.TileData; @@ -9,7 +10,7 @@ import java.util.ArrayList; import java.util.List; @SuppressWarnings("serial") -public class TileList extends ArrayList { +public class TileList extends SynchronizedArrayList { public enum Type { TERRAIN, CEILING; diff --git a/app/src/main/java/com/example/julian/endlessroll/main/game/GameScene.java b/app/src/main/java/com/example/julian/endlessroll/main/game/GameScene.java index 3496b23..13ba0e6 100644 --- a/app/src/main/java/com/example/julian/endlessroll/main/game/GameScene.java +++ b/app/src/main/java/com/example/julian/endlessroll/main/game/GameScene.java @@ -19,6 +19,7 @@ import com.example.julian.endlessroll.levels.worlds.World; import com.example.julian.endlessroll.main.GameLog; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -46,14 +47,12 @@ public class GameScene extends Scene { public void loadLevel(Level level, World world) throws Exception { this.currentWorld = world; reset(); - lock.lock(); background.changeTexture(world.getBackground()); terrain.loadData(world, level.getTerrainEdge(), level.getTerrainTiles()); ceiling.loadData(world, level.getCeilingEdge(), level.getCeilingTiles()); super.add(goal); player.init(terrain.getEdge(), level.getStartSpeed(), level.getEndSpeed()); super.add(player); - lock.unlock(); for (ObstacleData data : level.getObstacles()) addObstacle(data); for (StarData data : level.getStars()) { @@ -71,9 +70,7 @@ public class GameScene extends Scene { } private void reset() { - lock.lock(); super.clear(); - lock.unlock(); obstacles.clear(); tools.clear(); cameraX = 0; @@ -81,7 +78,6 @@ public class GameScene extends Scene { } public void onStarCollision(Star collisionStar) { - lock.lock(); Iterator iter = stars.iterator(); while (iter.hasNext()) { Star star = iter.next(); @@ -90,24 +86,18 @@ public class GameScene extends Scene { iter.remove(); } } - lock.unlock(); - //TODO: change lock with atomic lists!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! } public void addObstacle(ObstacleData data) { Obstacle obstacle = new Obstacle(currentWorld, data, terrain.getEdge()); - lock.lock(); super.add(obstacle); obstacles.add(obstacle); - lock.unlock(); } public void addStar(StarData data) { Star star = new Star(textures.star, data); - lock.lock(); super.add(star); stars.add(star); - lock.unlock(); } public void addTool(ToolType type, float screenX, float screenY) throws Exception { @@ -115,10 +105,8 @@ public class GameScene extends Scene { Tool tool = type.newInstance(position, particleSystem); if (tool == null) throw new Exception("Current ToolType(" + type + ") returns null at method newInstance()"); - lock.lock(); super.add(tool); tools.add(tool); - lock.unlock(); } @@ -126,7 +114,6 @@ public class GameScene extends Scene { public void update(Timer timer) { super.update(timer); player.setSpeedByProgress(player.getProgress() / goalX); - lock.lock(); for (Tool tool : tools) { tool.update(timer); if (tool instanceof Bomb) { @@ -135,7 +122,6 @@ public class GameScene extends Scene { bomb.explode(obstacles, collisionDetector); } } - lock.unlock(); } @Override diff --git a/app/src/main/java/com/example/julian/endlessroll/main/game/Physics.java b/app/src/main/java/com/example/julian/endlessroll/main/game/Physics.java index 6283719..b59f884 100644 --- a/app/src/main/java/com/example/julian/endlessroll/main/game/Physics.java +++ b/app/src/main/java/com/example/julian/endlessroll/main/game/Physics.java @@ -35,7 +35,6 @@ public class Physics { } public void applyGravity(GameScene scene) { - scene.lock.lock(); scene.getPlayer().getMovement().y -= GRAVITY_FORCE; for (Tool tool : scene.getTools()) { if (tool.isFloating()) @@ -71,7 +70,6 @@ public class Physics { tool.setToTerrain(orientingHeight); } } - scene.lock.unlock(); } @Nullable diff --git a/app/src/main/java/com/example/julian/endlessroll/main/game/Scene.java b/app/src/main/java/com/example/julian/endlessroll/main/game/Scene.java index c81a9c7..12a04b7 100644 --- a/app/src/main/java/com/example/julian/endlessroll/main/game/Scene.java +++ b/app/src/main/java/com/example/julian/endlessroll/main/game/Scene.java @@ -1,5 +1,6 @@ package com.example.julian.endlessroll.main.game; +import com.example.julian.endlessroll.data.SynchronizedArrayList; import com.example.julian.endlessroll.data.Vector; import com.example.julian.endlessroll.entities.Background; import com.example.julian.endlessroll.entities.Entity; @@ -11,16 +12,14 @@ import com.example.julian.endlessroll.entities.tileLists.Terrain; import com.example.julian.endlessroll.levels.worlds.World; import com.example.julian.endlessroll.rendering.Lock; -import java.util.ArrayList; import java.util.Iterator; /** * Created by Julian on 20.07.2016. */ -public abstract class Scene extends ArrayList { +public abstract class Scene extends SynchronizedArrayList { public float cameraX; - public final Lock lock; private Vector screenSize; private Entity playerArrow; @@ -40,7 +39,6 @@ public abstract class Scene extends ArrayList { terrain = new Terrain(World.GRASSLANDS.getTerrain()); ceiling = new Ceiling(World.GRASSLANDS.getTerrain()); player = new Player(textures.player); - lock = new Lock(); } public void setTexturePack(TexturePack texturePack) { @@ -48,20 +46,21 @@ public abstract class Scene extends ArrayList { } public void update(Timer timer) { - lock.lock(); - Iterator iterator = super.iterator(); - while (iterator.hasNext()) { - Entity entity = iterator.next(); - Vector movement = entity.getMovement(); - Vector finalMovement = new Vector(movement).mul(timer.getFrameTime()); - entity.move(finalMovement); - if (entity.isDestroyed() && entity.getDestroyEffect() != null) - entity.getDestroyEffect().createEffect(particleSystem, new Vector(entity.getPosition()), new Vector(entity.getWidth(), entity.getHeight())).start(); - if (entity.equals(player)) - moveEnviroment(finalMovement.x); - else if (entity.getRightEdge() - cameraX < -3f || entity.isDestroyed()) { - iterator.remove(); - removeEntityFromAllLists(entity); + synchronized (this) { + Iterator iterator = super.iterator(); + while (iterator.hasNext()) { + Entity entity = iterator.next(); + Vector movement = entity.getMovement(); + Vector finalMovement = new Vector(movement).mul(timer.getFrameTime()); + entity.move(finalMovement); + if (entity.isDestroyed() && entity.getDestroyEffect() != null) + entity.getDestroyEffect().createEffect(particleSystem, new Vector(entity.getPosition()), new Vector(entity.getWidth(), entity.getHeight())).start(); + if (entity.equals(player)) + moveEnviroment(finalMovement.x); + else if (entity.getRightEdge() - cameraX < -3f || entity.isDestroyed()) { + iterator.remove(); + removeEntityFromAllLists(entity); + } } } @@ -71,11 +70,10 @@ public abstract class Scene extends ArrayList { super.add(playerArrow); } } else super.remove(playerArrow); - lock.unlock(); } @Override - public boolean remove(Object object) { + public synchronized boolean remove(Object object) { removeEntityFromAllLists((Entity) object); return super.remove(object); } @@ -103,15 +101,15 @@ public abstract class Scene extends ArrayList { this.screenSize = screenSize; } - public Background getBackground() { + public synchronized Background getBackground() { return background; } - public Terrain getTerrain() { + public synchronized Terrain getTerrain() { return terrain; } - public Ceiling getCeiling() { + public synchronized Ceiling getCeiling() { return ceiling; } diff --git a/app/src/main/java/com/example/julian/endlessroll/rendering/renderer/GameRenderer.java b/app/src/main/java/com/example/julian/endlessroll/rendering/renderer/GameRenderer.java index f1e5058..528fcb9 100644 --- a/app/src/main/java/com/example/julian/endlessroll/rendering/renderer/GameRenderer.java +++ b/app/src/main/java/com/example/julian/endlessroll/rendering/renderer/GameRenderer.java @@ -104,11 +104,9 @@ public class GameRenderer implements GLSurfaceView.Renderer { GLES20.glClearColor(1, 1, 1, 1.0f); GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); - scene.lock.lock(); renderEntities(gl, scene); renderTileList(gl, scene.getTerrain(), scene); renderTileList(gl, scene.getCeiling(), scene); - scene.lock.unlock(); renderFbo(gl); } } @@ -116,10 +114,14 @@ public class GameRenderer implements GLSurfaceView.Renderer { private void renderEntities(GL10 gl, Scene scene) { entityShader.start(); entityShader.loadMVPMatrix(matrixCreator, scene.cameraX); - for (Entity backgroundPart : scene.getBackground()) - renderEntity(gl, backgroundPart); - for (Entity entity : scene) - renderEntity(gl, entity); + synchronized (scene.getBackground()) { + for (Entity backgroundPart : scene.getBackground()) + renderEntity(gl, backgroundPart); + } + synchronized (scene) { + for (Entity entity : scene) + renderEntity(gl, entity); + } entityShader.stop(); } @@ -135,11 +137,13 @@ public class GameRenderer implements GLSurfaceView.Renderer { private void renderTileList(GL10 gl, TileList tileList, Scene scene) { terrainShader.start(); terrainShader.loadMVPMatrix(matrixCreator, scene.cameraX); - for (Tile tile : tileList) { - gl.glActiveTexture(GL10.GL_TEXTURE0); - gl.glBindTexture(GL10.GL_TEXTURE_2D, tile.getTexture().getId()); - terrainShader.loadTransformationMatrix(matrixCreator, tile); - quad.draw(); + synchronized (tileList) { + for (Tile tile : tileList) { + gl.glActiveTexture(GL10.GL_TEXTURE0); + gl.glBindTexture(GL10.GL_TEXTURE_2D, tile.getTexture().getId()); + terrainShader.loadTransformationMatrix(matrixCreator, tile); + quad.draw(); + } } terrainShader.stop(); } diff --git a/particlelab/particlelab.iml b/particlelab/particlelab.iml index cc6a111..e2a5c28 100644 --- a/particlelab/particlelab.iml +++ b/particlelab/particlelab.iml @@ -66,14 +66,6 @@ - - - - - - - - @@ -82,6 +74,14 @@ + + + + + + + +