diff --git a/app/build/generated/source/r/debug/android/support/v7/appcompat/R.java b/app/build/generated/source/r/debug/android/support/v7/appcompat/R.java index 0b93955..77652ab 100644 --- a/app/build/generated/source/r/debug/android/support/v7/appcompat/R.java +++ b/app/build/generated/source/r/debug/android/support/v7/appcompat/R.java @@ -456,7 +456,7 @@ public final class R { public static final int abc_textfield_search_activated_mtrl_alpha = 0x7f020042; public static final int abc_textfield_search_default_mtrl_alpha = 0x7f020043; public static final int abc_textfield_search_material = 0x7f020044; - public static final int notification_template_icon_bg = 0x7f020072; + public static final int notification_template_icon_bg = 0x7f020074; } public static final class id { public static final int action0 = 0x7f0d0069; diff --git a/app/build/generated/source/r/debug/com/example/julian/endlessroll/R.java b/app/build/generated/source/r/debug/com/example/julian/endlessroll/R.java index b2852e9..e2483a6 100644 --- a/app/build/generated/source/r/debug/com/example/julian/endlessroll/R.java +++ b/app/build/generated/source/r/debug/com/example/julian/endlessroll/R.java @@ -1616,51 +1616,53 @@ containing a value of this type. public static final int abc_textfield_search_default_mtrl_alpha=0x7f020043; public static final int abc_textfield_search_material=0x7f020044; public static final int background=0x7f020045; - public static final int ball=0x7f020046; - public static final int blueparticle=0x7f020047; - public static final int bomb=0x7f020048; - public static final int bombbutton=0x7f020049; - public static final int custom_button=0x7f02004a; - public static final int emptybutton=0x7f02004b; - public static final int goal=0x7f02004c; - public static final int grasslands_preview=0x7f02004d; - public static final int levelbutton_background=0x7f02004e; - public static final int levelupbackground=0x7f02004f; - public static final int lock=0x7f020050; - public static final int lockedbutton=0x7f020051; - public static final int magnet=0x7f020052; - public static final int magnetbutton=0x7f020053; - public static final int menu_background=0x7f020054; - public static final int notification_template_icon_bg=0x7f020072; - public static final int obstacle=0x7f020055; - public static final int pausebutton=0x7f020056; - public static final int playerarrow=0x7f020057; - public static final int purple=0x7f020058; - public static final int ramp=0x7f020059; - public static final int rampbutton=0x7f02005a; - public static final int redparticle=0x7f02005b; - public static final int shortmenubackground=0x7f02005c; - public static final int sound_off=0x7f02005d; - public static final int sound_on=0x7f02005e; - public static final int sound_toggle=0x7f02005f; - public static final int splitter=0x7f020060; - public static final int spring=0x7f020061; - public static final int springbutton=0x7f020062; - public static final int star=0x7f020063; - public static final int star_icon=0x7f020064; - public static final int stars_0=0x7f020065; - public static final int stars_1=0x7f020066; - public static final int stars_2=0x7f020067; - public static final int stars_3=0x7f020068; - public static final int terrain=0x7f020069; - public static final int test=0x7f02006a; - public static final int tool_slot_background=0x7f02006b; - public static final int toolprogressbarlayers=0x7f02006c; - public static final int unlock_message_background=0x7f02006d; - public static final int unlocked=0x7f02006e; - public static final int unlockedbutton=0x7f02006f; - public static final int worldbutton_background=0x7f020070; - public static final int yellowparticle=0x7f020071; + public static final int background_cave=0x7f020046; + public static final int background_icymountains=0x7f020047; + public static final int ball=0x7f020048; + public static final int blueparticle=0x7f020049; + public static final int bomb=0x7f02004a; + public static final int bombbutton=0x7f02004b; + public static final int custom_button=0x7f02004c; + public static final int emptybutton=0x7f02004d; + public static final int goal=0x7f02004e; + public static final int grasslands_preview=0x7f02004f; + public static final int levelbutton_background=0x7f020050; + public static final int levelupbackground=0x7f020051; + public static final int lock=0x7f020052; + public static final int lockedbutton=0x7f020053; + public static final int magnet=0x7f020054; + public static final int magnetbutton=0x7f020055; + public static final int menu_background=0x7f020056; + public static final int notification_template_icon_bg=0x7f020074; + public static final int obstacle=0x7f020057; + public static final int pausebutton=0x7f020058; + public static final int playerarrow=0x7f020059; + public static final int purple=0x7f02005a; + public static final int ramp=0x7f02005b; + public static final int rampbutton=0x7f02005c; + public static final int redparticle=0x7f02005d; + public static final int shortmenubackground=0x7f02005e; + public static final int sound_off=0x7f02005f; + public static final int sound_on=0x7f020060; + public static final int sound_toggle=0x7f020061; + public static final int splitter=0x7f020062; + public static final int spring=0x7f020063; + public static final int springbutton=0x7f020064; + public static final int star=0x7f020065; + public static final int star_icon=0x7f020066; + public static final int stars_0=0x7f020067; + public static final int stars_1=0x7f020068; + public static final int stars_2=0x7f020069; + public static final int stars_3=0x7f02006a; + public static final int terrain=0x7f02006b; + public static final int test=0x7f02006c; + public static final int tool_slot_background=0x7f02006d; + public static final int toolprogressbarlayers=0x7f02006e; + public static final int unlock_message_background=0x7f02006f; + public static final int unlocked=0x7f020070; + public static final int unlockedbutton=0x7f020071; + public static final int worldbutton_background=0x7f020072; + public static final int yellowparticle=0x7f020073; } public static final class id { public static final int action0=0x7f0d0069; diff --git a/app/build/intermediates/assets/debug/levelpacks/Grasslands.xml b/app/build/intermediates/assets/debug/levelpacks/Grasslands.xml index bfdcc0b..7ec3811 100644 --- a/app/build/intermediates/assets/debug/levelpacks/Grasslands.xml +++ b/app/build/intermediates/assets/debug/levelpacks/Grasslands.xml @@ -1,7 +1,7 @@ GRASSLANDS - + @@ -9,10 +9,10 @@ - - - - + + + + @@ -20,7 +20,7 @@ - + @@ -30,16 +30,16 @@ - - - - - - - - - - + + + + + + + + + + @@ -47,7 +47,7 @@ - + @@ -55,12 +55,12 @@ - - - - - - + + + + + + @@ -68,7 +68,7 @@ - + @@ -78,13 +78,13 @@ - - - - - - - + + + + + + + @@ -92,17 +92,17 @@ - + - - - - + + + + @@ -110,7 +110,7 @@ - + @@ -119,20 +119,20 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -140,7 +140,7 @@ - + @@ -151,19 +151,19 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -171,7 +171,7 @@ - + @@ -180,16 +180,16 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/app/build/intermediates/assets/debug/levelpacks/Testcave.xml b/app/build/intermediates/assets/debug/levelpacks/Testcave.xml index b708464..1b2f69a 100644 --- a/app/build/intermediates/assets/debug/levelpacks/Testcave.xml +++ b/app/build/intermediates/assets/debug/levelpacks/Testcave.xml @@ -1,93 +1,97 @@ TESTCAVE - + - - - - + - - + - - - - - - - - - - + + + + + + + + + + + + - - - - - + - + - + + + - - - + - - + + + + + + + + + + + + + + + - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + diff --git a/app/build/intermediates/blame/res/debug/single/drawable.json b/app/build/intermediates/blame/res/debug/single/drawable.json index ce30a13..ccc375e 100644 --- a/app/build/intermediates/blame/res/debug/single/drawable.json +++ b/app/build/intermediates/blame/res/debug/single/drawable.json @@ -36,16 +36,16 @@ "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\exploded-aar\\com.android.support\\appcompat-v7\\23.1.1\\res\\drawable\\abc_tab_indicator_material.xml" }, { - "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\drawable\\abc_btn_borderless_material.xml", - "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\exploded-aar\\com.android.support\\appcompat-v7\\23.1.1\\res\\drawable\\abc_btn_borderless_material.xml" + "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\drawable\\springbutton.png", + "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\src\\main\\res\\drawable\\springbutton.png" }, { "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\drawable\\playerarrow.png", "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\src\\main\\res\\drawable\\playerarrow.png" }, { - "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\drawable\\springbutton.png", - "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\src\\main\\res\\drawable\\springbutton.png" + "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\drawable\\abc_btn_borderless_material.xml", + "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\exploded-aar\\com.android.support\\appcompat-v7\\23.1.1\\res\\drawable\\abc_btn_borderless_material.xml" }, { "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\drawable\\abc_list_selector_holo_dark.xml", @@ -179,6 +179,10 @@ "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\drawable\\abc_edit_text_material.xml", "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\exploded-aar\\com.android.support\\appcompat-v7\\23.1.1\\res\\drawable\\abc_edit_text_material.xml" }, + { + "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\drawable\\background_cave.png", + "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\src\\main\\res\\drawable\\background_cave.png" + }, { "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\drawable\\blueparticle.png", "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\src\\main\\res\\drawable\\blueparticle.png" @@ -255,6 +259,10 @@ "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\drawable\\redparticle.png", "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\src\\main\\res\\drawable\\redparticle.png" }, + { + "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\drawable\\background_icymountains.png", + "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\src\\main\\res\\drawable\\background_icymountains.png" + }, { "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\drawable\\abc_seekbar_track_material.xml", "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\exploded-aar\\com.android.support\\appcompat-v7\\23.1.1\\res\\drawable\\abc_seekbar_track_material.xml" diff --git a/app/build/intermediates/incremental/mergeDebugResources/merger.xml b/app/build/intermediates/incremental/mergeDebugResources/merger.xml index 28db6aa..ed1ea24 100644 --- a/app/build/intermediates/incremental/mergeDebugResources/merger.xml +++ b/app/build/intermediates/incremental/mergeDebugResources/merger.xml @@ -1359,4 +1359,4 @@ 2 2 2 - \ No newline at end of file + \ No newline at end of file diff --git a/app/build/intermediates/res/resources-debug.ap_ b/app/build/intermediates/res/resources-debug.ap_ index 1d3a624..5cbf6c6 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/build/intermediates/symbols/debug/R.txt b/app/build/intermediates/symbols/debug/R.txt index eba07e3..f6ae606 100644 --- a/app/build/intermediates/symbols/debug/R.txt +++ b/app/build/intermediates/symbols/debug/R.txt @@ -464,51 +464,53 @@ int drawable abc_textfield_search_activated_mtrl_alpha 0x7f020042 int drawable abc_textfield_search_default_mtrl_alpha 0x7f020043 int drawable abc_textfield_search_material 0x7f020044 int drawable background 0x7f020045 -int drawable ball 0x7f020046 -int drawable blueparticle 0x7f020047 -int drawable bomb 0x7f020048 -int drawable bombbutton 0x7f020049 -int drawable custom_button 0x7f02004a -int drawable emptybutton 0x7f02004b -int drawable goal 0x7f02004c -int drawable grasslands_preview 0x7f02004d -int drawable levelbutton_background 0x7f02004e -int drawable levelupbackground 0x7f02004f -int drawable lock 0x7f020050 -int drawable lockedbutton 0x7f020051 -int drawable magnet 0x7f020052 -int drawable magnetbutton 0x7f020053 -int drawable menu_background 0x7f020054 -int drawable notification_template_icon_bg 0x7f020072 -int drawable obstacle 0x7f020055 -int drawable pausebutton 0x7f020056 -int drawable playerarrow 0x7f020057 -int drawable purple 0x7f020058 -int drawable ramp 0x7f020059 -int drawable rampbutton 0x7f02005a -int drawable redparticle 0x7f02005b -int drawable shortmenubackground 0x7f02005c -int drawable sound_off 0x7f02005d -int drawable sound_on 0x7f02005e -int drawable sound_toggle 0x7f02005f -int drawable splitter 0x7f020060 -int drawable spring 0x7f020061 -int drawable springbutton 0x7f020062 -int drawable star 0x7f020063 -int drawable star_icon 0x7f020064 -int drawable stars_0 0x7f020065 -int drawable stars_1 0x7f020066 -int drawable stars_2 0x7f020067 -int drawable stars_3 0x7f020068 -int drawable terrain 0x7f020069 -int drawable test 0x7f02006a -int drawable tool_slot_background 0x7f02006b -int drawable toolprogressbarlayers 0x7f02006c -int drawable unlock_message_background 0x7f02006d -int drawable unlocked 0x7f02006e -int drawable unlockedbutton 0x7f02006f -int drawable worldbutton_background 0x7f020070 -int drawable yellowparticle 0x7f020071 +int drawable background_cave 0x7f020046 +int drawable background_icymountains 0x7f020047 +int drawable ball 0x7f020048 +int drawable blueparticle 0x7f020049 +int drawable bomb 0x7f02004a +int drawable bombbutton 0x7f02004b +int drawable custom_button 0x7f02004c +int drawable emptybutton 0x7f02004d +int drawable goal 0x7f02004e +int drawable grasslands_preview 0x7f02004f +int drawable levelbutton_background 0x7f020050 +int drawable levelupbackground 0x7f020051 +int drawable lock 0x7f020052 +int drawable lockedbutton 0x7f020053 +int drawable magnet 0x7f020054 +int drawable magnetbutton 0x7f020055 +int drawable menu_background 0x7f020056 +int drawable notification_template_icon_bg 0x7f020074 +int drawable obstacle 0x7f020057 +int drawable pausebutton 0x7f020058 +int drawable playerarrow 0x7f020059 +int drawable purple 0x7f02005a +int drawable ramp 0x7f02005b +int drawable rampbutton 0x7f02005c +int drawable redparticle 0x7f02005d +int drawable shortmenubackground 0x7f02005e +int drawable sound_off 0x7f02005f +int drawable sound_on 0x7f020060 +int drawable sound_toggle 0x7f020061 +int drawable splitter 0x7f020062 +int drawable spring 0x7f020063 +int drawable springbutton 0x7f020064 +int drawable star 0x7f020065 +int drawable star_icon 0x7f020066 +int drawable stars_0 0x7f020067 +int drawable stars_1 0x7f020068 +int drawable stars_2 0x7f020069 +int drawable stars_3 0x7f02006a +int drawable terrain 0x7f02006b +int drawable test 0x7f02006c +int drawable tool_slot_background 0x7f02006d +int drawable toolprogressbarlayers 0x7f02006e +int drawable unlock_message_background 0x7f02006f +int drawable unlocked 0x7f020070 +int drawable unlockedbutton 0x7f020071 +int drawable worldbutton_background 0x7f020072 +int drawable yellowparticle 0x7f020073 int id action0 0x7f0d0069 int id action_bar 0x7f0d0041 int id action_bar_activity_content 0x7f0d0000 diff --git a/app/src/main/assets/levelpacks/Grasslands.xml b/app/src/main/assets/levelpacks/Grasslands.xml index bfdcc0b..7ec3811 100644 --- a/app/src/main/assets/levelpacks/Grasslands.xml +++ b/app/src/main/assets/levelpacks/Grasslands.xml @@ -1,7 +1,7 @@ GRASSLANDS - + @@ -9,10 +9,10 @@ - - - - + + + + @@ -20,7 +20,7 @@ - + @@ -30,16 +30,16 @@ - - - - - - - - - - + + + + + + + + + + @@ -47,7 +47,7 @@ - + @@ -55,12 +55,12 @@ - - - - - - + + + + + + @@ -68,7 +68,7 @@ - + @@ -78,13 +78,13 @@ - - - - - - - + + + + + + + @@ -92,17 +92,17 @@ - + - - - - + + + + @@ -110,7 +110,7 @@ - + @@ -119,20 +119,20 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -140,7 +140,7 @@ - + @@ -151,19 +151,19 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -171,7 +171,7 @@ - + @@ -180,16 +180,16 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/app/src/main/assets/levelpacks/Testcave.xml b/app/src/main/assets/levelpacks/Testcave.xml index b708464..1b2f69a 100644 --- a/app/src/main/assets/levelpacks/Testcave.xml +++ b/app/src/main/assets/levelpacks/Testcave.xml @@ -1,93 +1,97 @@ TESTCAVE - + - - - - + - - + - - - - - - - - - - + + + + + + + + + + + + - - - - - + - + - + + + - - - + - - + + + + + + + + + + + + + + + - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + diff --git a/app/src/main/java/com/example/julian/endlessroll/entities/Entity.java b/app/src/main/java/com/example/julian/endlessroll/entities/Entity.java index 6653229..437b288 100644 --- a/app/src/main/java/com/example/julian/endlessroll/entities/Entity.java +++ b/app/src/main/java/com/example/julian/endlessroll/entities/Entity.java @@ -34,6 +34,10 @@ public class Entity extends Quad { position.y = terrainEdge + height / 2; } + public void setTopEdge(float y){ + position.y = y - height / 2; + } + public Texture getTexture() { return texture; } diff --git a/app/src/main/java/com/example/julian/endlessroll/entities/Obstacle.java b/app/src/main/java/com/example/julian/endlessroll/entities/Obstacle.java index 09c6472..9c72377 100644 --- a/app/src/main/java/com/example/julian/endlessroll/entities/Obstacle.java +++ b/app/src/main/java/com/example/julian/endlessroll/entities/Obstacle.java @@ -1,18 +1,89 @@ package com.example.julian.endlessroll.entities; import com.example.julian.endlessroll.data.Vector; +import com.example.julian.endlessroll.levels.MoveComponent; import com.example.julian.endlessroll.levels.ObstacleData; import com.example.julian.endlessroll.levels.worlds.World; +import com.example.julian.endlessroll.main.GameLog; + +import java.util.Random; /** * Created by Julian on 20.11.2015. */ public class Obstacle extends Entity { + private boolean deadly; + private boolean floating; + private boolean moving; + private MoveComponent moveComponent; + + private Vertex zeroPoint; + private boolean clockwise; + private float totalMoveDistance; + + private float moveProgress; + public Obstacle(World world, ObstacleData data, float terrainEdge) { - super(world.getObstacle(), new Vector(data.getX(), data.getY()), data.getWidth(), data.getHeight()); - if (data.isAttachedToGround()) + super(world.getObstacleTexture(), new Vector(data.getX(), data.getY()), data.getWidth(), data.getHeight()); + this.deadly = data.isDeadly(); + this.floating = data.isFloating(); + this.moving = data.isMoving(); + this.moveComponent = data.getMoveComponent(); + + if (!floating) super.setToTerrain(terrainEdge); + setTextureAtlasIndex(); + if (moving) + randomMovementData(); } + public void moveWithMoveComponent(float value) { + float distance = value * moveComponent.getSpeed() * 0.001f; + moveProgress += distance / totalMoveDistance; + moveProgress %= 1.0f; + setPositionForMoveProgress(); + } + + private void setPositionForMoveProgress() { + float distance = 0; + Vertex lastVertex = zeroPoint; + while (true) { + Vertex nextVertex = lastVertex.getNext(clockwise); + float nextDistance = distance + (Math.abs(lastVertex.getX() - nextVertex.getX()) * 0.5f * moveComponent.getWidth()) + (Math.abs(lastVertex.getY() - nextVertex.getY()) * 0.5f * moveComponent.getHeight()); + if (nextDistance >= moveProgress * totalMoveDistance) { + float distanceLeft = moveProgress * totalMoveDistance - distance; + Vector direction = new Vector(nextVertex.getX(), nextVertex.getY()).translate(new Vector(lastVertex.getX(), lastVertex.getY()).negate()); + direction = direction.mul(0.5f * distanceLeft); + GameLog.i("Direction: "+direction.toString()); + super.setPosition(moveComponent.getPositionOfVertex(lastVertex).translate(direction)); + return; + } + distance = nextDistance; + lastVertex = nextVertex; + } + } + + private void randomMovementData() { + Random random = new Random(); + int index = random.nextInt(4); + zeroPoint = Vertex.values()[index]; + clockwise = random.nextBoolean(); + totalMoveDistance = moveComponent.getWidth() * 2 + moveComponent.getHeight() * 2; + } + + private void setTextureAtlasIndex() { + if (deadly) + super.getTexture().setAtlasIndex(1); + if (floating) + super.getTexture().setAtlasIndex(2); + } + + public boolean isMoving() { + return moving; + } + + public boolean isDeadly() { + return deadly; + } } diff --git a/app/src/main/java/com/example/julian/endlessroll/entities/Vertex.java b/app/src/main/java/com/example/julian/endlessroll/entities/Vertex.java new file mode 100644 index 0000000..1646539 --- /dev/null +++ b/app/src/main/java/com/example/julian/endlessroll/entities/Vertex.java @@ -0,0 +1,45 @@ +package com.example.julian.endlessroll.entities; + +import com.example.julian.endlessroll.data.Vector; +import com.example.julian.endlessroll.main.GameLog; + +/** + * Created by Julian on 11.12.2016. + */ + +public enum Vertex { + + UL(0, -1, 1), UR(1, 1, 1), BL(3, -1, -1), BR(2, 1, -1); + + private int index; + private float x, y; + + Vertex(int index, float x, float y) { + this.index = index; + this.x = x; + this.y = y; + } + + public Vertex getNext(boolean clockwise) { + int newIndex = index + 1; + if (!clockwise) + newIndex = index - 1; + if (newIndex > 3) + newIndex = 0; + if (newIndex < 0) + newIndex = 3; + for (Vertex vertex : values()) + if (vertex.index == newIndex) + return vertex; + GameLog.e("No vertex with index "+ index +" found!!!"); + return null; + } + + public float getX() { + return x; + } + + public float getY() { + return y; + } +} diff --git a/app/src/main/java/com/example/julian/endlessroll/entities/collision/CollisionManager.java b/app/src/main/java/com/example/julian/endlessroll/entities/collision/CollisionManager.java index 611c0ed..e0efcc1 100644 --- a/app/src/main/java/com/example/julian/endlessroll/entities/collision/CollisionManager.java +++ b/app/src/main/java/com/example/julian/endlessroll/entities/collision/CollisionManager.java @@ -1,5 +1,6 @@ package com.example.julian.endlessroll.entities.collision; +import com.example.julian.endlessroll.entities.Obstacle; import com.example.julian.endlessroll.entities.Player; import com.example.julian.endlessroll.entities.Star; import com.example.julian.endlessroll.entities.collision.collisionData.EntityCollisionData; @@ -29,6 +30,8 @@ public class CollisionManager { PlayerCollisionData data = physics.getPlayerCollisionData(scene); if (data.isTerrainCollision()) checkTerrainCollision(data.getTerrainCollisionData()); + if (data.isCeilingCollision()) + checkCeilingCollision(data.getCeilingCollisionData()); if (data.isObstacleCollision()) checkObstacleCollision(data.getObstacleCollisionData()); if (data.isToolCollision()) @@ -43,6 +46,12 @@ public class CollisionManager { game.onGameOver(true); } + private void checkCeilingCollision(EntityCollisionData data) { + checkEntityCollision(data, -0.01f); + if (data.getEdge() == Edge.RIGHT || data.getEdge() == Edge.LEFT) + game.onGameOver(true); + } + private void checkToolCollision(ToolCollisionData data) { for (Tool tool : data.getTools()) tool.onPlayerCollision(player); @@ -51,7 +60,7 @@ public class CollisionManager { private void checkObstacleCollision(ObstacleCollisionData data) { for (EntityCollisionData entityData : data.getCollisions()) { checkEntityCollision(entityData, 0); - if (entityData.getEdge() != Edge.TOP) + if (entityData.getEdge() != Edge.TOP || ((Obstacle)entityData.getEntity()).isDeadly()) game.onGameOver(true); } } @@ -62,6 +71,10 @@ public class CollisionManager { player.getMovement().y = 0; player.setToTerrain(data.getEntity().getTopEdge()); break; + case BOTTOM: + player.getMovement().y = 0; + player.setTopEdge(data.getEntity().getBottomEdge()); + break; case LEFT: player.getMovement().x *= xBounceFactor; player.getPosition().x = data.getEntity().getLeftEdge() - player.RADIUS; diff --git a/app/src/main/java/com/example/julian/endlessroll/entities/collision/collisionData/PlayerCollisionData.java b/app/src/main/java/com/example/julian/endlessroll/entities/collision/collisionData/PlayerCollisionData.java index b34817c..0492de6 100644 --- a/app/src/main/java/com/example/julian/endlessroll/entities/collision/collisionData/PlayerCollisionData.java +++ b/app/src/main/java/com/example/julian/endlessroll/entities/collision/collisionData/PlayerCollisionData.java @@ -6,12 +6,14 @@ package com.example.julian.endlessroll.entities.collision.collisionData; public class PlayerCollisionData { private EntityCollisionData terrainCollision; + private EntityCollisionData ceilingCollision; private ObstacleCollisionData obstacleCollision; private ToolCollisionData toolCollision; private EntityCollisionData starCollision; - public PlayerCollisionData(EntityCollisionData terrainCollision, ObstacleCollisionData obstacleCollision, ToolCollisionData toolCollision, EntityCollisionData starCollision) { + public PlayerCollisionData(EntityCollisionData terrainCollision, EntityCollisionData ceilingCollision, ObstacleCollisionData obstacleCollision, ToolCollisionData toolCollision, EntityCollisionData starCollision) { this.terrainCollision = terrainCollision; + this.ceilingCollision = ceilingCollision; this.obstacleCollision = obstacleCollision; this.toolCollision = toolCollision; this.starCollision = starCollision; @@ -25,6 +27,14 @@ public class PlayerCollisionData { return terrainCollision; } + public boolean isCeilingCollision() { + return ceilingCollision.isCollision(); + } + + public EntityCollisionData getCeilingCollisionData() { + return ceilingCollision; + } + public boolean isObstacleCollision() { return obstacleCollision.isCollision(); } diff --git a/app/src/main/java/com/example/julian/endlessroll/entities/particles/ParticleEffect.java b/app/src/main/java/com/example/julian/endlessroll/entities/particles/ParticleEffect.java index 00f2370..e71f795 100644 --- a/app/src/main/java/com/example/julian/endlessroll/entities/particles/ParticleEffect.java +++ b/app/src/main/java/com/example/julian/endlessroll/entities/particles/ParticleEffect.java @@ -10,6 +10,7 @@ import com.example.julian.endlessroll.entities.textures.Texture; import com.example.julian.endlessroll.main.game.Timer; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Random; @@ -44,15 +45,17 @@ public class ParticleEffect { private String textureName; private Random random; - private List sources = new ArrayList<>(); + private List sources = Collections.synchronizedList(new ArrayList()); public ParticleEffect() { this.random = new Random(); } public void update(Timer timer) { - for (ParticleSource source : sources) - source.update(timer); + synchronized (sources) { + for (ParticleSource source : sources) + source.update(timer); + } } public ParticleData createParticleData() { @@ -195,7 +198,7 @@ public class ParticleEffect { return yOffset; } - public List getSources() { + public synchronized List getSources() { return sources; } @@ -212,9 +215,11 @@ public class ParticleEffect { } public void deleteSources() { - for(ParticleSource source : sources) - source.kill(); - sources.clear(); + synchronized (sources) { + for (ParticleSource source : sources) + source.kill(); + sources.clear(); + } } public TimelineRange getSpawnWidth() { diff --git a/app/src/main/java/com/example/julian/endlessroll/entities/particles/ParticleSystem.java b/app/src/main/java/com/example/julian/endlessroll/entities/particles/ParticleSystem.java index eb0d994..34eba7f 100644 --- a/app/src/main/java/com/example/julian/endlessroll/entities/particles/ParticleSystem.java +++ b/app/src/main/java/com/example/julian/endlessroll/entities/particles/ParticleSystem.java @@ -29,22 +29,28 @@ public class ParticleSystem { } public void update(Timer timer) { - for (ParticleEffect effect : effects) - effect.update(timer); - } - - public void loadTextures() throws Exception { - for (ParticleEffect effect : effects) - effect.setTexture(textureLoader.loadTexture("particleEffects/"+effect.getTextureName())); - } - - public void deleteAllSources(){ - for(ParticleEffect effect : effects){ - effect.deleteSources(); + synchronized (effects) { + for (ParticleEffect effect : effects) + effect.update(timer); } } - public ParticleEffect[] getEffects() { + public void loadTextures() throws Exception { + synchronized (effects) { + for (ParticleEffect effect : effects) + effect.setTexture(textureLoader.loadTexture("particleEffects/" + effect.getTextureName())); + } + } + + public void deleteAllSources() { + synchronized (effects) { + for (ParticleEffect effect : effects) { + effect.deleteSources(); + } + } + } + + public synchronized ParticleEffect[] getEffects() { return effects; } } diff --git a/app/src/main/java/com/example/julian/endlessroll/entities/particles/attributes/attributeValues/TintTimeline.java b/app/src/main/java/com/example/julian/endlessroll/entities/particles/attributes/attributeValues/TintTimeline.java index c01ec9e..6ed1679 100644 --- a/app/src/main/java/com/example/julian/endlessroll/entities/particles/attributes/attributeValues/TintTimeline.java +++ b/app/src/main/java/com/example/julian/endlessroll/entities/particles/attributes/attributeValues/TintTimeline.java @@ -18,7 +18,6 @@ public class TintTimeline extends ParticleAttributeValue { } public void setValueOfPoint(int index, int colorIndex, float value) { - GameLog.i("Set value: index="+index+"; colorIndex="+colorIndex+"; value="+value); if (points.size() <= index) { points.add(new TintTimelinePoint()); } @@ -26,7 +25,6 @@ public class TintTimeline extends ParticleAttributeValue { } public void setTimeOfPoint(int index, float time) { - GameLog.i("Set time: index="+index+"; time="+time); if (points.size() <= index) { points.add(new TintTimelinePoint()); } 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 9533d34..cf1bb69 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,7 +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; import com.example.julian.endlessroll.levels.worlds.World; @@ -38,7 +37,7 @@ public class TileList extends SynchronizedArrayList { } public void loadData(World world, float edge, List tileData) { - this.texture = world.getTerrain(); + this.texture = world.getTerrainTexture(); this.endless = false; super.clear(); for (TileData data : tileData) diff --git a/app/src/main/java/com/example/julian/endlessroll/levels/MoveComponent.java b/app/src/main/java/com/example/julian/endlessroll/levels/MoveComponent.java new file mode 100644 index 0000000..8eae66f --- /dev/null +++ b/app/src/main/java/com/example/julian/endlessroll/levels/MoveComponent.java @@ -0,0 +1,47 @@ +package com.example.julian.endlessroll.levels; + +import com.example.julian.endlessroll.data.Vector; +import com.example.julian.endlessroll.entities.Vertex; + +import org.simpleframework.xml.Attribute; + +public class MoveComponent { + + @Attribute + private float width; + @Attribute + private float height; + @Attribute + private float x; + @Attribute + private float y; + @Attribute + private float speed; + + public float getWidth() { + return width; + } + + public float getHeight() { + return height; + } + + public float getX() { + return x; + } + + public float getY() { + return y; + } + + public float getSpeed() { + return speed; + } + + public Vector getPositionOfVertex(Vertex vertex) { + float x = this.x + (width / 2f) * vertex.getX(); + float y = this.y + (height / 2f) * vertex.getY(); + return new Vector(x, y); + } + +} diff --git a/app/src/main/java/com/example/julian/endlessroll/levels/ObstacleData.java b/app/src/main/java/com/example/julian/endlessroll/levels/ObstacleData.java index f9c8751..e11ed2e 100644 --- a/app/src/main/java/com/example/julian/endlessroll/levels/ObstacleData.java +++ b/app/src/main/java/com/example/julian/endlessroll/levels/ObstacleData.java @@ -1,6 +1,7 @@ package com.example.julian.endlessroll.levels; import org.simpleframework.xml.Attribute; +import org.simpleframework.xml.Element; /** * Created by Julian on 07.12.2015. @@ -8,7 +9,11 @@ import org.simpleframework.xml.Attribute; public class ObstacleData { @Attribute - private String type; + private boolean floating; + @Attribute + private boolean moving; + @Attribute + private boolean deadly; @Attribute private float leftEdge; @Attribute @@ -17,11 +22,19 @@ public class ObstacleData { private float height; @Attribute private float y; - @Attribute - public boolean attachedToGround; + @Element(required = false) + private MoveComponent moveComponent; - public String getType() { - return type; + public boolean isFloating() { + return floating; + } + + public boolean isMoving() { + return moving; + } + + public boolean isDeadly() { + return deadly; } public float getX() { @@ -40,7 +53,7 @@ public class ObstacleData { return y; } - public boolean isAttachedToGround() { - return attachedToGround; + public MoveComponent getMoveComponent() { + return moveComponent; } } diff --git a/app/src/main/java/com/example/julian/endlessroll/levels/worlds/World.java b/app/src/main/java/com/example/julian/endlessroll/levels/worlds/World.java index b2fd432..0e8ed47 100644 --- a/app/src/main/java/com/example/julian/endlessroll/levels/worlds/World.java +++ b/app/src/main/java/com/example/julian/endlessroll/levels/worlds/World.java @@ -13,8 +13,8 @@ import com.example.julian.endlessroll.entities.textures.TexturePack; public enum World { GRASSLANDS(0, "Grasslands", R.drawable.grasslands_preview, R.drawable.background, R.drawable.terrain, R.drawable.obstacle), - TESTCAVE(1, "Testcave", R.drawable.grasslands_preview, R.drawable.background, R.drawable.terrain, R.drawable.obstacle), - ICY_MOUNTAINS(2, "Icy Mountains", R.drawable.grasslands_preview, R.drawable.background, R.drawable.terrain, R.drawable.obstacle); + TESTCAVE(1, "Testcave", R.drawable.grasslands_preview, R.drawable.background_cave, R.drawable.terrain, R.drawable.obstacle), + ICY_MOUNTAINS(2, "Icy Mountains", R.drawable.grasslands_preview, R.drawable.background_icymountains, R.drawable.terrain, R.drawable.obstacle); private int index; private String name; @@ -48,7 +48,7 @@ public enum World { private void loadSpecificTextures(TexturePack texturePack) { background = texturePack.loadTexture(backgroundId); terrain = texturePack.loadTexture(terrainId); - obstacle = texturePack.loadTexture(obstacleId); + obstacle = texturePack.loadAtlas(obstacleId, 2, 2); } public int getIndex() { @@ -63,15 +63,15 @@ public enum World { return previewId; } - public Texture getBackground() { + public Texture getBackgroundTexture() { return background; } - public Texture getTerrain() { + public Texture getTerrainTexture() { return terrain; } - public Texture getObstacle() { + public Texture getObstacleTexture() { return obstacle; } } 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 13ba0e6..e2cefc6 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 @@ -33,9 +33,9 @@ public class GameScene extends Scene { private Goal goal; private float goalX; - private List obstacles = new ArrayList<>(); - private List stars = new ArrayList<>(); - private List tools = new ArrayList<>(); + private List obstacles = Collections.synchronizedList(new ArrayList()); + private List stars = Collections.synchronizedList(new ArrayList()); + private List tools = Collections.synchronizedList(new ArrayList()); public GameScene(TexturePack texturePack, ParticleSystem particleSystem) throws Exception { super(texturePack, particleSystem); @@ -47,7 +47,7 @@ public class GameScene extends Scene { public void loadLevel(Level level, World world) throws Exception { this.currentWorld = world; reset(); - background.changeTexture(world.getBackground()); + background.changeTexture(world.getBackgroundTexture()); terrain.loadData(world, level.getTerrainEdge(), level.getTerrainTiles()); ceiling.loadData(world, level.getCeilingEdge(), level.getCeilingTiles()); super.add(goal); @@ -78,12 +78,14 @@ public class GameScene extends Scene { } public void onStarCollision(Star collisionStar) { - Iterator iter = stars.iterator(); - while (iter.hasNext()) { - Star star = iter.next(); - if (star.equals(collisionStar)) { - star.destroy(DestroyEffect.STAR_EXPLOSION); - iter.remove(); + synchronized (stars) { + Iterator iter = stars.iterator(); + while (iter.hasNext()) { + Star star = iter.next(); + if (star.equals(collisionStar)) { + star.destroy(DestroyEffect.STAR_EXPLOSION); + iter.remove(); + } } } } @@ -114,14 +116,17 @@ public class GameScene extends Scene { public void update(Timer timer) { super.update(timer); player.setSpeedByProgress(player.getProgress() / goalX); - for (Tool tool : tools) { - tool.update(timer); - if (tool instanceof Bomb) { - Bomb bomb = (Bomb) tool; - if (bomb.isExploding()) - bomb.explode(obstacles, collisionDetector); + synchronized (tools) { + for (Tool tool : tools) { + tool.update(timer); + if (tool instanceof Bomb) { + Bomb bomb = (Bomb) tool; + if (bomb.isExploding()) + bomb.explode(obstacles, collisionDetector); + } } } + } @Override @@ -135,15 +140,15 @@ public class GameScene extends Scene { obstacles.remove(entity); } - public List getTools() { + public synchronized List getTools() { return tools; } - public List getObstacles() { + public synchronized List getObstacles() { return obstacles; } - public List getStars() { + public synchronized List getStars() { return stars; } 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 b59f884..a7da977 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 @@ -5,6 +5,7 @@ import android.support.annotation.Nullable; import com.example.julian.endlessroll.entities.Entity; import com.example.julian.endlessroll.entities.Obstacle; import com.example.julian.endlessroll.entities.Star; +import com.example.julian.endlessroll.entities.tileLists.Ceiling; import com.example.julian.endlessroll.entities.tileLists.Terrain; import com.example.julian.endlessroll.entities.tileLists.Tile; import com.example.julian.endlessroll.entities.collision.CollisionDetector; @@ -36,6 +37,7 @@ public class Physics { public void applyGravity(GameScene scene) { scene.getPlayer().getMovement().y -= GRAVITY_FORCE; + synchronized (scene.getTools()){ for (Tool tool : scene.getTools()) { if (tool.isFloating()) continue; @@ -70,15 +72,18 @@ public class Physics { tool.setToTerrain(orientingHeight); } } - } + }} @Nullable private Obstacle getObstacleToolIsOver(Entity tool, List obstacles) { Map isOver = new HashMap<>(); + synchronized (obstacles){ for (Obstacle obstacle : obstacles) { - if ((tool.getLeftEdge() >= obstacle.getLeftEdge() && tool.getLeftEdge() <= obstacle.getRightEdge()) || (tool.getRightEdge() <= obstacle.getRightEdge() && tool.getRightEdge() >= obstacle.getLeftEdge())) + boolean toolVertexInObstacleEdge = (tool.getLeftEdge() >= obstacle.getLeftEdge() && tool.getLeftEdge() <= obstacle.getRightEdge()) || (tool.getRightEdge() <= obstacle.getRightEdge() && tool.getRightEdge() >= obstacle.getLeftEdge()); + boolean obstacleVertexInToolEdge = (obstacle.getLeftEdge() >= tool.getLeftEdge() && obstacle.getLeftEdge() <= tool.getRightEdge()) || (obstacle.getRightEdge() <= tool.getRightEdge() && obstacle.getRightEdge() >= tool.getLeftEdge()); + if (toolVertexInObstacleEdge || obstacleVertexInToolEdge) isOver.put(obstacle.getTopEdge(), obstacle); - } + }} float max = -100; for (float height : isOver.keySet()) { if(isOver.get(height).getBottomEdge() < tool.getTopEdge()) { @@ -103,10 +108,11 @@ public class Physics { public PlayerCollisionData getPlayerCollisionData(GameScene scene) { EntityCollisionData terrainData = playerCollidesWithTerrain(scene); + EntityCollisionData ceilingData = playerCollidesWithCeiling(scene); ObstacleCollisionData obstacleData = playerCollidesWithObstacle(scene); ToolCollisionData toolData = playerCollidesWithTool(scene); EntityCollisionData starData = playerCollidesWithStar(scene); - return new PlayerCollisionData(terrainData, obstacleData, toolData, starData); + return new PlayerCollisionData(terrainData, ceilingData, obstacleData, toolData, starData); } private EntityCollisionData playerCollidesWithTerrain(GameScene scene) { @@ -119,32 +125,45 @@ public class Physics { return new EntityCollisionData(null, null); } + private EntityCollisionData playerCollidesWithCeiling(GameScene scene) { + Ceiling ceiling = scene.getCeiling(); + for (Tile ceilingTile : ceiling) { + EntityCollisionData data = detector.playerEntityCollision(scene.getPlayer(), ceilingTile); + if (data.isCollision()) + return data; + } + return new EntityCollisionData(null, null); + } + private ObstacleCollisionData playerCollidesWithObstacle(GameScene scene) { List collisions = new ArrayList<>(); + synchronized (scene.getObstacles()){ for (Obstacle obstacle : scene.getObstacles()) { EntityCollisionData data = detector.playerEntityCollision(scene.getPlayer(), obstacle); if (data.isCollision()) collisions.add(data); - } + }} return new ObstacleCollisionData(collisions); } private ToolCollisionData playerCollidesWithTool(GameScene scene) { List tools = new ArrayList<>(); Circle circle = new Circle(scene.getPlayer()); + synchronized (scene.getTools()){ for (Tool tool : scene.getTools()) { if (detector.circleToolCollision(circle, tool.getCollisionBounds())) tools.add(tool); - } + }} return new ToolCollisionData(tools); } private EntityCollisionData playerCollidesWithStar(GameScene scene) { + synchronized (scene.getStars()){ for (Star star : scene.getStars()) { EntityCollisionData data = detector.playerEntityCollision(scene.getPlayer(), star); if (data.isCollision()) return data; - } + }} return new EntityCollisionData(null, null); } } 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 12a04b7..f43a7a2 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 @@ -4,13 +4,13 @@ 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; +import com.example.julian.endlessroll.entities.Obstacle; import com.example.julian.endlessroll.entities.Player; import com.example.julian.endlessroll.entities.particles.ParticleSystem; import com.example.julian.endlessroll.entities.textures.TexturePack; import com.example.julian.endlessroll.entities.tileLists.Ceiling; 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.Iterator; @@ -35,9 +35,9 @@ public abstract class Scene extends SynchronizedArrayList { this.particleSystem = particleSystem; setTexturePack(texturePack); playerArrow = new Entity(textures.playerArrow, new Vector(0, 0.9f), .2f, .2f); - background = new Background(World.GRASSLANDS.getBackground()); - terrain = new Terrain(World.GRASSLANDS.getTerrain()); - ceiling = new Ceiling(World.GRASSLANDS.getTerrain()); + background = new Background(World.GRASSLANDS.getBackgroundTexture()); + terrain = new Terrain(World.GRASSLANDS.getTerrainTexture()); + ceiling = new Ceiling(World.GRASSLANDS.getTerrainTexture()); player = new Player(textures.player); } @@ -53,6 +53,11 @@ public abstract class Scene extends SynchronizedArrayList { Vector movement = entity.getMovement(); Vector finalMovement = new Vector(movement).mul(timer.getFrameTime()); entity.move(finalMovement); + if(entity instanceof Obstacle){ + Obstacle obstacle = (Obstacle) entity; + if(obstacle.isMoving()) + obstacle.moveWithMoveComponent(timer.getFrameTime()); + } 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)) diff --git a/app/src/main/java/com/example/julian/endlessroll/rendering/renderer/ParticleRenderer.java b/app/src/main/java/com/example/julian/endlessroll/rendering/renderer/ParticleRenderer.java index 4f9035e..83761fe 100644 --- a/app/src/main/java/com/example/julian/endlessroll/rendering/renderer/ParticleRenderer.java +++ b/app/src/main/java/com/example/julian/endlessroll/rendering/renderer/ParticleRenderer.java @@ -48,16 +48,19 @@ public class ParticleRenderer { particleShader.start(); particleShader.loadMVPMatrix(matrixCreator, scene.cameraX); - for (ParticleEffect effect : scene.getParticleSystem().getEffects()) { - gl.glActiveTexture(GL10.GL_TEXTURE0); - gl.glBindTexture(GL10.GL_TEXTURE_2D, effect.getTexture().getId()); + synchronized (scene.getParticleSystem().getEffects()) { + for (ParticleEffect effect : scene.getParticleSystem().getEffects()) { + gl.glActiveTexture(GL10.GL_TEXTURE0); + gl.glBindTexture(GL10.GL_TEXTURE_2D, effect.getTexture().getId()); - switchAdditiveBlending(gl, effect.getOptions().isAdditive()); - for (ParticleSource source : effect.getSources()) { - source.getActiveParticleLock().lock(); - for (Particle particle : source.getActiveParticles()) - renderParticle(particle); - source.getActiveParticleLock().unlock(); + switchAdditiveBlending(gl, effect.getOptions().isAdditive()); + synchronized (effect.getSources()){ + for (ParticleSource source : effect.getSources()) { + source.getActiveParticleLock().lock(); + for (Particle particle : source.getActiveParticles()) + renderParticle(particle); + source.getActiveParticleLock().unlock(); + }} } } disableAdditiveBlending(gl); diff --git a/particlelab/particlelab.iml b/particlelab/particlelab.iml index e2a5c28..cc6a111 100644 --- a/particlelab/particlelab.iml +++ b/particlelab/particlelab.iml @@ -66,14 +66,6 @@ - - - - - - - - @@ -82,6 +74,14 @@ + + + + + + + +