From 40cc3ed7edd7bd39073cb172e95a34c9c425d5bc Mon Sep 17 00:00:00 2001 From: EmaMaker Date: Wed, 10 Jun 2020 01:02:32 +0200 Subject: [PATCH] Particles! --- .../data/particles/ball_and_chain.particle | 149 +++++++++ core/assets/data/particles/boom.particle | 142 ++++++++ core/assets/data/particles/boom.png | Bin 0 -> 1996 bytes core/assets/data/particles/explosion.particle | 313 ++++++++++++++++++ core/assets/data/particles/explosion.png | Bin 0 -> 1821 bytes .../data/particles/explosion_small.particle | 313 ++++++++++++++++++ core/assets/data/particles/feather.particle | 149 +++++++++ core/assets/data/particles/slugs.particle | 149 +++++++++ core/src/com/emamaker/amazeing/AMazeIng.java | 39 ++- .../amazeing/manager/GameManager.java | 8 +- .../amazeing/manager/network/GameClient.java | 40 ++- .../amazeing/manager/network/GameServer.java | 27 +- .../manager/network/NetworkHandler.java | 37 ++- .../manager/network/action/NetworkAction.java | 27 +- .../client/game/NACGameStatusUpdate.java | 6 + .../actions/client/game/NACServerClosed.java | 38 --- .../actions/client/login/NACLoginAO.java | 2 +- .../actions/client/login/NACRemovePlayer.java | 4 +- .../client/player/NACUpdatePlayersPos.java | 11 +- .../actions/server/game/NASServerClosed.java | 36 -- .../actions/server/login/NASLoginAO2.java | 2 + .../actions/server/login/NASLoginUUID.java | 1 + .../server/player/NASUpdatePlayerPos.java | 1 + .../emamaker/amazeing/maze/MazeGenerator.java | 15 +- .../amazeing/maze/settings/MazeSetting.java | 13 + .../amazeing/maze/settings/MazeSettings.java | 2 +- .../emamaker/amazeing/player/MazePlayer.java | 4 +- .../amazeing/player/MazePlayerLocal.java | 1 - .../amazeing/player/powerups/PowerUp.java | 70 +++- .../player/powerups/PowerUpBallAndChain.java | 10 +- .../amazeing/player/powerups/PowerUpBomb.java | 12 +- .../player/powerups/PowerUpFeather.java | 5 +- .../amazeing/player/powerups/PowerUpSlug.java | 9 +- .../amazeing/ui/screens/PreGameScreen.java | 2 +- .../amazeing/ui/screens/ServerJoinScreen.java | 9 +- .../emamaker/amazeing/utils/MathUtils.java | 27 +- .../assets/data/textures/texture_atlas.png | Bin 0 -> 60803 bytes desktop/build.gradle | 4 +- 38 files changed, 1516 insertions(+), 161 deletions(-) create mode 100644 core/assets/data/particles/ball_and_chain.particle create mode 100644 core/assets/data/particles/boom.particle create mode 100644 core/assets/data/particles/boom.png create mode 100644 core/assets/data/particles/explosion.particle create mode 100644 core/assets/data/particles/explosion.png create mode 100644 core/assets/data/particles/explosion_small.particle create mode 100644 core/assets/data/particles/feather.particle create mode 100644 core/assets/data/particles/slugs.particle delete mode 100644 core/src/com/emamaker/amazeing/manager/network/action/actions/client/game/NACServerClosed.java delete mode 100644 core/src/com/emamaker/amazeing/manager/network/action/actions/server/game/NASServerClosed.java create mode 100755 desktop/assets/data/textures/texture_atlas.png diff --git a/core/assets/data/particles/ball_and_chain.particle b/core/assets/data/particles/ball_and_chain.particle new file mode 100644 index 0000000..bf9d80d --- /dev/null +++ b/core/assets/data/particles/ball_and_chain.particle @@ -0,0 +1,149 @@ +slugs +- Delay - +active: false +- Duration - +lowMin: 10000.0 +lowMax: 10000.0 +- Count - +min: 0 +max: 200 +- Emission - +lowMin: 2.0 +lowMax: 2.0 +highMin: 4.0 +highMax: 4.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Life - +lowMin: 0.0 +lowMax: 0.0 +highMin: 500.0 +highMax: 750.0 +relative: false +scalingCount: 3 +scaling0: 1.0 +scaling1: 1.0 +scaling2: 1.0 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.66 +timeline2: 1.0 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: square +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 60.0 +highMax: 60.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 60.0 +highMax: 60.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 0.0 +lowMax: 0.0 +highMin: 20.0 +highMax: 20.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 359.0 +highMax: 359.0 +relative: false +scalingCount: 3 +scaling0: 0.0 +scaling1: 1.0 +scaling2: 1.0 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.999 +timeline2: 1.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: false +- Tint - +colorsCount: 9 +colors0: 1.0 +colors1: 1.0 +colors2: 1.0 +colors3: 0.0 +colors4: 0.0 +colors5: 0.0 +colors6: 1.0 +colors7: 1.0 +colors8: 1.0 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.050933786 +timeline2: 1.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 4 +scaling0: 0.0 +scaling1: 1.0 +scaling2: 1.0 +scaling3: 0.0 +timelineCount: 4 +timeline0: 0.0 +timeline1: 0.21232876 +timeline2: 0.65068495 +timeline3: 0.9794521 +- Options - +attached: false +continuous: false +aligned: false +additive: false +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +/home/emamaker/github/amazeing/gdx/core/assets/data/powerups/ball_and_chain.png + diff --git a/core/assets/data/particles/boom.particle b/core/assets/data/particles/boom.particle new file mode 100644 index 0000000..f057199 --- /dev/null +++ b/core/assets/data/particles/boom.particle @@ -0,0 +1,142 @@ +Untitled +- Delay - +active: false +- Duration - +lowMin: 5000.0 +lowMax: 5000.0 +- Count - +min: 0 +max: 200 +- Emission - +lowMin: 1.0 +lowMax: 1.0 +highMin: 10.0 +highMax: 10.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Life - +lowMin: 0.0 +lowMax: 0.0 +highMin: 150.0 +highMax: 350.0 +relative: false +scalingCount: 3 +scaling0: 1.0 +scaling1: 1.0 +scaling2: 0.9183673 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.66 +timeline2: 1.0 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: square +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 200.0 +highMax: 200.0 +relative: true +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 200.0 +highMax: 200.0 +relative: true +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 300.0 +lowMax: 300.0 +highMin: 400.0 +highMax: 400.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 3.0 +highMax: 3.0 +relative: true +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 3 +scaling0: 0.0 +scaling1: 0.0 +scaling2: 0.0 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.5 +timeline2: 1.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: false +- Tint - +colorsCount: 3 +colors0: 1.0 +colors1: 1.0 +colors2: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 4 +scaling0: 1.0 +scaling1: 1.0 +scaling2: 1.0 +scaling3: 1.0 +timelineCount: 4 +timeline0: 0.0 +timeline1: 0.25342464 +timeline2: 0.60761464 +timeline3: 0.98057497 +- Options - +attached: false +continuous: false +aligned: false +additive: false +behind: false +premultipliedAlpha: false +spriteMode: random +- Image Paths - +explosion.png +boom.png + diff --git a/core/assets/data/particles/boom.png b/core/assets/data/particles/boom.png new file mode 100644 index 0000000000000000000000000000000000000000..03a853b53a808090378417a5e35d2b8b3691a735 GIT binary patch literal 1996 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 LNkvXXu0mjfqla6% literal 0 HcmV?d00001 diff --git a/core/assets/data/particles/explosion_small.particle b/core/assets/data/particles/explosion_small.particle new file mode 100644 index 0000000..7d83b8f --- /dev/null +++ b/core/assets/data/particles/explosion_small.particle @@ -0,0 +1,313 @@ +explosion +- Delay - +active: false +- Duration - +lowMin: 1000.0 +lowMax: 1000.0 +- Count - +min: 0 +max: 200 +- Emission - +lowMin: 2.0 +lowMax: 2.0 +highMin: 5.0 +highMax: 5.0 +relative: false +scalingCount: 5 +scaling0: 1.0 +scaling1: 1.0 +scaling2: 1.0 +scaling3: 1.0 +scaling4: 0.59183675 +timelineCount: 5 +timeline0: 0.0 +timeline1: 0.1509288 +timeline2: 0.39041096 +timeline3: 0.72602737 +timeline4: 0.86986303 +- Life - +lowMin: 0.0 +lowMax: 0.0 +highMin: 200.0 +highMax: 1000.0 +relative: false +scalingCount: 6 +scaling0: 1.0 +scaling1: 1.0 +scaling2: 1.0 +scaling3: 1.0 +scaling4: 1.0 +scaling5: 1.0 +timelineCount: 6 +timeline0: 0.0 +timeline1: 0.113777086 +timeline2: 0.47678018 +timeline3: 0.5944272 +timeline4: 0.7972136 +timeline5: 0.89860684 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: square +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 100.0 +highMax: 100.0 +relative: false +scalingCount: 2 +scaling0: 1.0 +scaling1: 0.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 0.98630136 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 100.0 +highMax: 100.0 +relative: false +scalingCount: 2 +scaling0: 1.0 +scaling1: 0.020408163 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- X Scale - +lowMin: 40.0 +lowMax: 40.0 +highMin: 50.0 +highMax: 70.0 +relative: true +scalingCount: 6 +scaling0: 0.039325844 +scaling1: 0.2977528 +scaling2: 0.6011236 +scaling3: 0.71910113 +scaling4: 0.8707865 +scaling5: 1.0 +timelineCount: 6 +timeline0: 0.0 +timeline1: 0.16331269 +timeline2: 0.29256967 +timeline3: 0.46826625 +timeline4: 0.65634674 +timeline5: 0.996904 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 3.0 +highMax: 3.0 +relative: true +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 3 +scaling0: 0.0 +scaling1: 0.0 +scaling2: 0.0 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.5 +timeline2: 1.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Tint - +colorsCount: 3 +colors0: 1.0 +colors1: 1.0 +colors2: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 4 +scaling0: 0.0 +scaling1: 0.71929824 +scaling2: 0.8596491 +scaling3: 0.36842105 +timelineCount: 4 +timeline0: 0.0 +timeline1: 0.33561644 +timeline2: 0.65753424 +timeline3: 0.96575344 +- Options - +attached: false +continuous: false +aligned: false +additive: false +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +explosion.png + + +boom +- Delay - +active: false +- Duration - +lowMin: 1500.0 +lowMax: 1500.0 +- Count - +min: 0 +max: 25 +- Emission - +lowMin: 1.0 +lowMax: 1.0 +highMin: 2.0 +highMax: 2.0 +relative: false +scalingCount: 5 +scaling0: 0.0 +scaling1: 1.0 +scaling2: 0.67346936 +scaling3: 0.0 +scaling4: 0.0 +timelineCount: 5 +timeline0: 0.0 +timeline1: 0.15413533 +timeline2: 0.42465752 +timeline3: 0.5068493 +timeline4: 0.99303406 +- Life - +lowMin: 0.0 +lowMax: 0.0 +highMin: 500.0 +highMax: 500.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: ellipse +edges: false +side: both +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 100.0 +highMax: 100.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 100.0 +highMax: 100.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 10.0 +lowMax: 10.0 +highMin: 30.0 +highMax: 80.0 +relative: false +scalingCount: 3 +scaling0: 0.37078652 +scaling1: 0.75842696 +scaling2: 0.96067417 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.38467494 +timeline2: 0.996904 +- Y Scale - +active: false +- Velocity - +active: false +- Angle - +active: false +- Rotation - +active: true +lowMin: -15.0 +lowMax: -15.0 +highMin: 5.0 +highMax: 5.0 +relative: false +scalingCount: 2 +scaling0: 0.0 +scaling1: 1.0 +timelineCount: 2 +timeline0: 0.0 +timeline1: 1.0 +- Wind - +active: false +- Gravity - +active: false +- Tint - +colorsCount: 3 +colors0: 1.0 +colors1: 1.0 +colors2: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Options - +attached: false +continuous: false +aligned: false +additive: true +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +boom.png + diff --git a/core/assets/data/particles/feather.particle b/core/assets/data/particles/feather.particle new file mode 100644 index 0000000..3312ed9 --- /dev/null +++ b/core/assets/data/particles/feather.particle @@ -0,0 +1,149 @@ +slugs +- Delay - +active: false +- Duration - +lowMin: 10000.0 +lowMax: 10000.0 +- Count - +min: 0 +max: 200 +- Emission - +lowMin: 2.0 +lowMax: 2.0 +highMin: 4.0 +highMax: 4.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Life - +lowMin: 0.0 +lowMax: 0.0 +highMin: 500.0 +highMax: 750.0 +relative: false +scalingCount: 3 +scaling0: 1.0 +scaling1: 1.0 +scaling2: 1.0 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.66 +timeline2: 1.0 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: square +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 60.0 +highMax: 60.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 60.0 +highMax: 60.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 0.0 +lowMax: 0.0 +highMin: 20.0 +highMax: 20.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 359.0 +highMax: 359.0 +relative: false +scalingCount: 3 +scaling0: 0.0 +scaling1: 1.0 +scaling2: 1.0 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.999 +timeline2: 1.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: false +- Tint - +colorsCount: 9 +colors0: 1.0 +colors1: 1.0 +colors2: 1.0 +colors3: 1.0 +colors4: 1.0 +colors5: 1.0 +colors6: 1.0 +colors7: 1.0 +colors8: 1.0 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.01 +timeline2: 1.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 4 +scaling0: 0.0 +scaling1: 1.0 +scaling2: 1.0 +scaling3: 0.0 +timelineCount: 4 +timeline0: 0.0 +timeline1: 0.21232876 +timeline2: 0.65068495 +timeline3: 0.9794521 +- Options - +attached: false +continuous: false +aligned: false +additive: false +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +/home/emamaker/github/amazeing/gdx/core/assets/data/powerups/feather.png + diff --git a/core/assets/data/particles/slugs.particle b/core/assets/data/particles/slugs.particle new file mode 100644 index 0000000..bf3e43b --- /dev/null +++ b/core/assets/data/particles/slugs.particle @@ -0,0 +1,149 @@ +slugs +- Delay - +active: false +- Duration - +lowMin: 15000.0 +lowMax: 15000.0 +- Count - +min: 0 +max: 200 +- Emission - +lowMin: 2.0 +lowMax: 2.0 +highMin: 4.0 +highMax: 4.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Life - +lowMin: 0.0 +lowMax: 0.0 +highMin: 500.0 +highMax: 750.0 +relative: false +scalingCount: 3 +scaling0: 1.0 +scaling1: 1.0 +scaling2: 1.0 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.66 +timeline2: 1.0 +independent: false +- Life Offset - +active: false +independent: false +- X Offset - +active: false +- Y Offset - +active: false +- Spawn Shape - +shape: square +- Spawn Width - +lowMin: 0.0 +lowMax: 0.0 +highMin: 60.0 +highMax: 60.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Spawn Height - +lowMin: 0.0 +lowMax: 0.0 +highMin: 60.0 +highMax: 60.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- X Scale - +lowMin: 0.0 +lowMax: 0.0 +highMin: 20.0 +highMax: 20.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Y Scale - +active: false +- Velocity - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 0.0 +highMax: 0.0 +relative: false +scalingCount: 1 +scaling0: 1.0 +timelineCount: 1 +timeline0: 0.0 +- Angle - +active: true +lowMin: 0.0 +lowMax: 0.0 +highMin: 359.0 +highMax: 359.0 +relative: false +scalingCount: 3 +scaling0: 0.0 +scaling1: 1.0 +scaling2: 1.0 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.999 +timeline2: 1.0 +- Rotation - +active: false +- Wind - +active: false +- Gravity - +active: false +- Tint - +colorsCount: 9 +colors0: 0.58431375 +colors1: 0.8784314 +colors2: 0.43529412 +colors3: 0.0 +colors4: 0.0 +colors5: 0.0 +colors6: 1.0 +colors7: 1.0 +colors8: 1.0 +timelineCount: 3 +timeline0: 0.0 +timeline1: 0.050933786 +timeline2: 1.0 +- Transparency - +lowMin: 0.0 +lowMax: 0.0 +highMin: 1.0 +highMax: 1.0 +relative: false +scalingCount: 4 +scaling0: 0.0 +scaling1: 1.0 +scaling2: 1.0 +scaling3: 0.0 +timelineCount: 4 +timeline0: 0.0 +timeline1: 0.21232876 +timeline2: 0.65068495 +timeline3: 0.9794521 +- Options - +attached: false +continuous: false +aligned: false +additive: false +behind: false +premultipliedAlpha: false +spriteMode: single +- Image Paths - +/home/emamaker/github/amazeing/gdx/core/assets/data/powerups/slug.png + diff --git a/core/src/com/emamaker/amazeing/AMazeIng.java b/core/src/com/emamaker/amazeing/AMazeIng.java index 0f5fa32..3552980 100755 --- a/core/src/com/emamaker/amazeing/AMazeIng.java +++ b/core/src/com/emamaker/amazeing/AMazeIng.java @@ -6,7 +6,10 @@ import com.badlogic.gdx.Game; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.InputMultiplexer; import com.badlogic.gdx.graphics.FPSLogger; +import com.badlogic.gdx.graphics.g2d.ParticleEffectPool.PooledEffect; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.physics.bullet.Bullet; +import com.badlogic.gdx.utils.Array; import com.emamaker.amazeing.manager.GameManager; import com.emamaker.amazeing.manager.managers.GameManagerLocal; import com.emamaker.amazeing.manager.network.GameClient; @@ -39,6 +42,12 @@ public class AMazeIng extends Game { public static Platform PLATFORM; + public float delta = 0; + + public SpriteBatch spriteBatch; + public Array effects = new Array(); + + public AMazeIng(Platform p) { PLATFORM = p; } @@ -68,6 +77,8 @@ public class AMazeIng extends Game { setupGUI(); setupGameManager(); setupPowerUps(); + + spriteBatch = new SpriteBatch(); } public void setupGUI() { @@ -94,19 +105,45 @@ public class AMazeIng extends Game { @Override public void render() { super.render(); + delta = Math.min(1f / 30f, Gdx.graphics.getDeltaTime()); + server.update(); client.update(); gameManager.update(); + + spriteBatch.begin(); + // Update and draw effects: + for (int i = effects.size - 1; i >= 0; i--) { + PooledEffect effect = effects.get(i); + effect.draw(spriteBatch, delta); + if (effect.isComplete()) { + effect.free(); + effects.removeIndex(i); + } + } + spriteBatch.end(); + } @Override public void dispose() { gameManager.dispose(); - client.stop(); + if (server.isRunning()) + client.stop(true); + else + client.stop(); server.stop(); world.dispose(); + clearEffects(); } + public void clearEffects() { + // Reset all effects: + for (int i = effects.size - 1; i >= 0; i--) + effects.get(i).free(); //free all the effects back to the pool + effects.clear(); //clear the current effects array + } + @Override public void resize(int width, int height) { world.resize(width, height); diff --git a/core/src/com/emamaker/amazeing/manager/GameManager.java b/core/src/com/emamaker/amazeing/manager/GameManager.java index 9b15831..50497f9 100755 --- a/core/src/com/emamaker/amazeing/manager/GameManager.java +++ b/core/src/com/emamaker/amazeing/manager/GameManager.java @@ -173,8 +173,10 @@ public class GameManager { public void checkWin() { for (MazePlayer p : players) - if (checkWin(p)) + if (checkWin(p)) { setFinished(); + return; + } } public void setFinished() { @@ -183,7 +185,7 @@ public class GameManager { for (MazePlayer p : players) p.disablePowerUp(); - + main.clearEffects(); } public boolean getFinished() { @@ -321,7 +323,7 @@ public class GameManager { } public void requestChangeToMap(int[][] todraw) { - mazeGen.requestChangeToMap(todraw); + mazeGen.show(todraw); } public void resetCamera() { diff --git a/core/src/com/emamaker/amazeing/manager/network/GameClient.java b/core/src/com/emamaker/amazeing/manager/network/GameClient.java index e77d762..344f952 100755 --- a/core/src/com/emamaker/amazeing/manager/network/GameClient.java +++ b/core/src/com/emamaker/amazeing/manager/network/GameClient.java @@ -10,7 +10,6 @@ import com.emamaker.amazeing.AMazeIng; import com.emamaker.amazeing.manager.managers.GameManagerClient; import com.emamaker.amazeing.manager.network.action.NetworkAction; import com.emamaker.amazeing.manager.network.action.actions.client.game.NACGameStatusUpdate; -import com.emamaker.amazeing.manager.network.action.actions.client.game.NACServerClosed; import com.emamaker.amazeing.manager.network.action.actions.client.game.NACUpdateMap; import com.emamaker.amazeing.manager.network.action.actions.client.login.NACLoginAO; import com.emamaker.amazeing.manager.network.action.actions.client.login.NACLoginAO2; @@ -22,6 +21,7 @@ import com.emamaker.amazeing.maze.settings.MazeSettings; import com.emamaker.amazeing.player.MazePlayer; import com.emamaker.amazeing.player.MazePlayerLocal; import com.emamaker.amazeing.player.PlayerUtils; +import com.emamaker.amazeing.utils.MathUtils.Constants; import com.esotericsoftware.kryonet.Client; public class GameClient extends NetworkHandler { @@ -29,7 +29,7 @@ public class GameClient extends NetworkHandler { public Client client; String addr; - boolean updateMobilePlayers = false; + boolean updateMobilePlayers = true; public CopyOnWriteArrayList localPlayers = new CopyOnWriteArrayList(); @@ -72,7 +72,6 @@ public class GameClient extends NetworkHandler { actions.add(new NACUpdatePlayerPosForced(this)); actions.add(new NACUpdatePlayersPos(this)); actions.add(new NACUpdateOtherPlayerPos(this)); - actions.add(new NACServerClosed(this)); } @Override @@ -83,8 +82,14 @@ public class GameClient extends NetworkHandler { @Override public void update() { super.update(); - + if (isRunning()) { + //Check if the server disconnected or it's timing out + if(!client.isConnected() || ((NACGameStatusUpdate.gotMessage && System.currentTimeMillis() - NACGameStatusUpdate.lastMsgTime > Constants.COMMUNICATION_TIMEOUT_MILLIS))) { + stop(true); + main.uiManager.srvJoinScreen.showErrorDlg(1); + } + //Normal client update if (gameManager != null) { if (gameManager.gameStarted) { } else { @@ -106,26 +111,39 @@ public class GameClient extends NetworkHandler { @Override public void stop() { + stop(false); + } + + public void stop(boolean fromserver) { if (isRunning()) { - for (String s : localPlayers) { - ((NACRemovePlayer) getActionByClass(NACRemovePlayer.class)).startAction(null, null, s); + if (!fromserver) { + for (String s : localPlayers) { + ((NACRemovePlayer) getActionByClass(NACRemovePlayer.class)).startAction(null, null, s); + } } for (MazePlayer p : players.values()) p.dispose(); players.clear(); - for (NetworkAction n : pendingActions) - n.onParentClosing(); - while (!pendingActions.isEmpty()) - update(); + if (!fromserver) { + for (NetworkAction n : pendingActions) + n.onParentClosing(); + + while (!pendingActions.isEmpty()) + update(); + } + + pendingActions.clear(); + todoActions.clear(); + actions.clear(); client.stop(); running = false; -// } } + } /* CHECKING FOR NEW PLAYERS */ diff --git a/core/src/com/emamaker/amazeing/manager/network/GameServer.java b/core/src/com/emamaker/amazeing/manager/network/GameServer.java index 3d988e6..78e944e 100755 --- a/core/src/com/emamaker/amazeing/manager/network/GameServer.java +++ b/core/src/com/emamaker/amazeing/manager/network/GameServer.java @@ -7,7 +7,6 @@ import java.util.concurrent.ConcurrentHashMap; import com.emamaker.amazeing.manager.managers.GameManagerServer; import com.emamaker.amazeing.manager.network.action.actions.server.game.NASGameStatusUpdate; -import com.emamaker.amazeing.manager.network.action.actions.server.game.NASServerClosed; import com.emamaker.amazeing.manager.network.action.actions.server.game.NASUpdateMap; import com.emamaker.amazeing.manager.network.action.actions.server.login.NASLoginAO2; import com.emamaker.amazeing.manager.network.action.actions.server.login.NASLoginUUID; @@ -15,6 +14,7 @@ import com.emamaker.amazeing.manager.network.action.actions.server.login.NASRemo import com.emamaker.amazeing.manager.network.action.actions.server.player.NASUpdatePlayerPos; import com.emamaker.amazeing.manager.network.action.actions.server.player.NASUpdatePlayerPosForced; import com.emamaker.amazeing.player.MazePlayer; +import com.emamaker.amazeing.utils.MathUtils.Constants; import com.esotericsoftware.kryonet.Server; public class GameServer extends NetworkHandler { @@ -26,7 +26,6 @@ public class GameServer extends NetworkHandler { // Returns true if the server started successfully public boolean start(int port_) { port = port_; - running = true; try { server = new Server(); // For consistency, the classes to be sent over the network are @@ -41,6 +40,8 @@ public class GameServer extends NetworkHandler { startDefaultActions(); System.out.println("Server registered and running on port " + port); + + running = true; return true; } catch (IOException e) { @@ -59,7 +60,6 @@ public class GameServer extends NetworkHandler { actions.add(new NASUpdateMap(this)); actions.add(new NASUpdatePlayerPosForced(this)); actions.add(new NASUpdatePlayerPos(this)); - actions.add(new NASServerClosed(this)); } @Override @@ -68,6 +68,22 @@ public class GameServer extends NetworkHandler { // getActionByClass(NAServerUpdatePlayers.class).startAction(null, null); } + @Override + public void update() { + super.update(); + + if(isRunning()) { + //Check if there's some player not responding that needs to be removed + for(String s: players.keySet()) { + if(System.currentTimeMillis() - players.get(s).LAST_NETWORK_TIME > Constants.COMMUNICATION_TIMEOUT_MILLIS) { + players.get(s).dispose(); + players.remove(s); + } + System.out.println(Arrays.toString(players.values().toArray())); + } + } + } + @Override public void periodicNonGameUpdate() { } @@ -99,9 +115,12 @@ public class GameServer extends NetworkHandler { for (MazePlayer p : players.values()) { p.dispose(); players.clear(); - getActionByClass(NASServerClosed.class).startAction(null, null); server.stop(); running = false; + + pendingActions.clear(); + todoActions.clear(); + actions.clear(); } } } diff --git a/core/src/com/emamaker/amazeing/manager/network/NetworkHandler.java b/core/src/com/emamaker/amazeing/manager/network/NetworkHandler.java index 42f211b..ecab8d7 100644 --- a/core/src/com/emamaker/amazeing/manager/network/NetworkHandler.java +++ b/core/src/com/emamaker/amazeing/manager/network/NetworkHandler.java @@ -1,9 +1,5 @@ package com.emamaker.amazeing.manager.network; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.CopyOnWriteArrayList; - import com.badlogic.gdx.math.Vector3; import com.emamaker.amazeing.AMazeIng; import com.emamaker.amazeing.manager.GameManager; @@ -12,6 +8,10 @@ import com.emamaker.amazeing.manager.network.NetworkCommon.UpdatePlayerPosition; import com.emamaker.amazeing.manager.network.action.NetworkAction; import com.emamaker.amazeing.player.MazePlayer; +import java.util.Arrays; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; + public abstract class NetworkHandler { public ConcurrentHashMap players = new ConcurrentHashMap(); @@ -26,7 +26,7 @@ public abstract class NetworkHandler { // Some actions (such as the first step of login) cannot be done in multiple // instances at the same time // Actions of this type have to be stored here - public ConcurrentLinkedQueue todoActions = new ConcurrentLinkedQueue<>(); + public CopyOnWriteArrayList todoActions = new CopyOnWriteArrayList<>(); CopyOnWriteArrayList deletePending = new CopyOnWriteArrayList<>(); int port; @@ -61,11 +61,23 @@ public abstract class NetworkHandler { } public void updatePending() { - if (!todoActions.isEmpty()) { - if (!alreadyPending(todoActions.peek())) - todoActions.peek().startAction(null, null); - addToPending(todoActions.remove()); + //System.out.println(Arrays.toString(todoActions.toArray())); + for(NetworkAction a : todoActions) { + if(!alreadyPending(a)) { + System.out.println(a); + addToPending(a); + todoActions.remove(a); + } } + + // if (!todoActions.isEmpty()) { +// System.out.println("Actions queue: " + Arrays.toString(todoActions.toArray())); +// if (!alreadyPending(todoActions.peek())) { +// todoActions.peek().startAction(null, null); +// System.out.println("Getting action from queue: " + todoActions.peek()); +// addToPending(todoActions.remove()); +// } +// } for (NetworkAction n : pendingActions) n.update(); @@ -75,7 +87,7 @@ public abstract class NetworkHandler { * Unluckily, we can't check if a specific action is already pending. But we can * check if there's another type of the same action running. NetworkActions can * override the startAction method to be started even if there's another one - * already running (e.g. PositionUpdates) + * already running (e.g. Player Removal) */ public boolean alreadyPending(NetworkAction act) { for (NetworkAction a : pendingActions) { @@ -83,6 +95,10 @@ public abstract class NetworkHandler { // System.out.println("Already pending " + act); return true; } + /*for(int i = 0; i < act.maskActions.length; i++){ + if(a.getClass().isAssignableFrom(a.maskActions[i].getClass())) return true; + }*/ + } return false; } @@ -94,6 +110,7 @@ public abstract class NetworkHandler { } public void addToPending(NetworkAction a) { + a.registerEndListener(); pendingActions.add(a); } diff --git a/core/src/com/emamaker/amazeing/manager/network/action/NetworkAction.java b/core/src/com/emamaker/amazeing/manager/network/action/NetworkAction.java index f2aafe6..cd933de 100644 --- a/core/src/com/emamaker/amazeing/manager/network/action/NetworkAction.java +++ b/core/src/com/emamaker/amazeing/manager/network/action/NetworkAction.java @@ -4,6 +4,7 @@ import com.emamaker.amazeing.AMazeIng; import com.emamaker.amazeing.manager.network.GameClient; import com.emamaker.amazeing.manager.network.GameServer; import com.emamaker.amazeing.manager.network.NetworkHandler; +import com.emamaker.amazeing.utils.MathUtils.Constants; import com.esotericsoftware.kryonet.Connection; import com.esotericsoftware.kryonet.Listener; @@ -36,12 +37,14 @@ public abstract class NetworkAction { protected NetworkHandler parent; protected boolean oneTime; - protected long TIMEOUT_TIME = 5000; protected long startTime; boolean tookTimeout = false; boolean usingTimeout = true; boolean oneAtTheTime = true; - + + //A list of actions that prevent the action to be started inside alreadyPending method + //(e.g NACLoginAO cannot be started if there's still a NACLoginAO2 running) + public AMazeIng main = AMazeIng.getMain(); Listener startListener = new Listener() { @@ -74,13 +77,9 @@ public abstract class NetworkAction { this.parent = parent_; this.oneTime = oneTime; - if (client() != null) - client().client.addListener(endListener); - if (server() != null) - server().server.addListener(endListener); - tookTimeout = false; usingTimeout = true; +// setMaskActions(maskActions); // update(); } @@ -96,6 +95,8 @@ public abstract class NetworkAction { client().client.addListener(startListener); if (server() != null) server().server.addListener(startListener); + +// setMaskActions(maskActions_); } public void startAction() { @@ -110,6 +111,8 @@ public abstract class NetworkAction { if (oneAtTheTime) { if (!parent.alreadyPending(this)) parent.addToPending(newInstance()); +// else +// addToQueue(); } else { parent.addToPending(newInstance()); } @@ -123,7 +126,7 @@ public abstract class NetworkAction { resolveAction(); if (oneTime) responseReceived(null, null); - if (System.currentTimeMillis() - startTime > TIMEOUT_TIME && usingTimeout) + if (System.currentTimeMillis() - startTime > Constants.NETWORK_ACTION_TIMEOUT_MILLIS && usingTimeout) detachFromParent(); } @@ -182,5 +185,13 @@ public abstract class NetworkAction { public void addToQueue() { parent.todoActions.add(newInstance()); } + + public void registerEndListener() { + if (client() != null) + client().client.addListener(endListener); + if (server() != null) + server().server.addListener(endListener); + } + } \ No newline at end of file diff --git a/core/src/com/emamaker/amazeing/manager/network/action/actions/client/game/NACGameStatusUpdate.java b/core/src/com/emamaker/amazeing/manager/network/action/actions/client/game/NACGameStatusUpdate.java index 779dd4c..4785cb3 100644 --- a/core/src/com/emamaker/amazeing/manager/network/action/actions/client/game/NACGameStatusUpdate.java +++ b/core/src/com/emamaker/amazeing/manager/network/action/actions/client/game/NACGameStatusUpdate.java @@ -12,6 +12,9 @@ import com.esotericsoftware.kryonet.Connection; public class NACGameStatusUpdate extends NetworkAction { + public static boolean gotMessage = false; + public static long lastMsgTime = 0; + protected NACGameStatusUpdate(NetworkHandler parent, Connection c, Object incomingMsg_, Object responsePacket_, Object endPacket_, boolean oneTime) { super(parent, c, incomingMsg_, responsePacket_, endPacket_, oneTime); @@ -51,6 +54,9 @@ public class NACGameStatusUpdate extends NetworkAction { client().gameManager.gameStarted = ((GameStatusUpdate) incomingMsg).gameStarted; client().gameManager.anyoneWon = ((GameStatusUpdate) incomingMsg).anyoneWon; + gotMessage = true; + lastMsgTime = System.currentTimeMillis(); + } @Override diff --git a/core/src/com/emamaker/amazeing/manager/network/action/actions/client/game/NACServerClosed.java b/core/src/com/emamaker/amazeing/manager/network/action/actions/client/game/NACServerClosed.java deleted file mode 100644 index 7b0a5e4..0000000 --- a/core/src/com/emamaker/amazeing/manager/network/action/actions/client/game/NACServerClosed.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.emamaker.amazeing.manager.network.action.actions.client.game; - -import com.emamaker.amazeing.manager.network.NetworkCommon; -import com.emamaker.amazeing.manager.network.NetworkHandler; -import com.emamaker.amazeing.manager.network.action.NetworkAction; -import com.esotericsoftware.kryonet.Connection; - -public class NACServerClosed extends NetworkAction { - - protected NACServerClosed(NetworkHandler parent, Connection c, Object incomingMsg_, Object responsePacket_, - Object endPacket_, boolean oneTime) { - super(parent, c, incomingMsg_, responsePacket_, endPacket_, oneTime); - } - - public NACServerClosed(NetworkHandler parent_) { - super(parent_, new NetworkCommon.ServerClosed(), null, null, true); - } - - @Override - public void resolveAction() { - super.resolveAction(); - - System.out.println("Server stopped!"); - parent.stop(); - main.uiManager.srvJoinScreen.showErrorDlg(0); - } - - @Override - public void responseReceived(Connection conn, Object msg) { - super.responseReceived(conn, msg); - } - - @Override - public NetworkAction newInstance() { - return new NACServerClosed(client(), incomingConnection, incomingMsg, responsePacket, endPacket, oneTime); - } - -} diff --git a/core/src/com/emamaker/amazeing/manager/network/action/actions/client/login/NACLoginAO.java b/core/src/com/emamaker/amazeing/manager/network/action/actions/client/login/NACLoginAO.java index 54c52e9..6febc94 100644 --- a/core/src/com/emamaker/amazeing/manager/network/action/actions/client/login/NACLoginAO.java +++ b/core/src/com/emamaker/amazeing/manager/network/action/actions/client/login/NACLoginAO.java @@ -11,7 +11,7 @@ public class NACLoginAO extends NetworkAction { boolean oneTime) { super(parent, c, incomingMsg_, responsePacket_, endPacket_, oneTime); } - + public NACLoginAO(NetworkHandler parent_) { super(parent_, null, new NetworkCommon.ClientLoginAO(), new NetworkCommon.ServerLoginUUID(), false); } diff --git a/core/src/com/emamaker/amazeing/manager/network/action/actions/client/login/NACRemovePlayer.java b/core/src/com/emamaker/amazeing/manager/network/action/actions/client/login/NACRemovePlayer.java index 77f84c8..9b4028e 100644 --- a/core/src/com/emamaker/amazeing/manager/network/action/actions/client/login/NACRemovePlayer.java +++ b/core/src/com/emamaker/amazeing/manager/network/action/actions/client/login/NACRemovePlayer.java @@ -43,7 +43,7 @@ public class NACRemovePlayer extends NetworkAction { @Override public void resolveAction() { super.resolveAction(); - System.out.println("Asking the server to remove player " + uuid); +// System.out.println("Asking the server to remove player " + uuid); ((RemovePlayer) responsePacket).uuid = uuid; client().client.sendUDP(responsePacket); } @@ -63,7 +63,7 @@ public class NACRemovePlayer extends NetworkAction { } detachFromParent(); } -// System.out.println("Response received for " + this); + System.out.println("Response received for " + this); } @Override diff --git a/core/src/com/emamaker/amazeing/manager/network/action/actions/client/player/NACUpdatePlayersPos.java b/core/src/com/emamaker/amazeing/manager/network/action/actions/client/player/NACUpdatePlayersPos.java index e3a6a1a..452cc83 100644 --- a/core/src/com/emamaker/amazeing/manager/network/action/actions/client/player/NACUpdatePlayersPos.java +++ b/core/src/com/emamaker/amazeing/manager/network/action/actions/client/player/NACUpdatePlayersPos.java @@ -4,10 +4,13 @@ import com.emamaker.amazeing.manager.network.NetworkCommon; import com.emamaker.amazeing.manager.network.NetworkHandler; import com.emamaker.amazeing.manager.network.action.NetworkAction; import com.emamaker.amazeing.player.MazePlayerLocal; +import com.emamaker.amazeing.utils.MathUtils.Constants; import com.esotericsoftware.kryonet.Connection; public class NACUpdatePlayersPos extends NetworkAction { + long lastTime = 0; + protected NACUpdatePlayersPos(NetworkHandler parent, Connection c, Object incomingMsg_, Object responsePacket_, Object endPacket_, boolean oneTime) { super(parent, c, incomingMsg_, responsePacket_, endPacket_, oneTime); @@ -24,9 +27,13 @@ public class NACUpdatePlayersPos extends NetworkAction { if (parent.gameManager.gameStarted) for (String s : client().localPlayers) { - if (parent.players.containsKey(s) && ((MazePlayerLocal) parent.players.get(s)).getPressed()) { + // Update pos if the player moved or every sec + if (parent.players.containsKey(s) && (((MazePlayerLocal) parent.players.get(s)).getPressed() + || System.currentTimeMillis() - lastTime > Constants.CLIENT_POS_PERIODIC_UPDATE)) { responsePacket = parent.updatePlayer(s, parent.players.get(s), false); client().client.sendUDP(responsePacket); + if (System.currentTimeMillis() - lastTime > Constants.CLIENT_POS_PERIODIC_UPDATE) + lastTime = System.currentTimeMillis(); } } } @@ -40,5 +47,5 @@ public class NACUpdatePlayersPos extends NetworkAction { public NetworkAction newInstance() { return new NACUpdatePlayersPos(client(), incomingConnection, incomingMsg, responsePacket, endPacket, oneTime); } - + } diff --git a/core/src/com/emamaker/amazeing/manager/network/action/actions/server/game/NASServerClosed.java b/core/src/com/emamaker/amazeing/manager/network/action/actions/server/game/NASServerClosed.java deleted file mode 100644 index f42b74a..0000000 --- a/core/src/com/emamaker/amazeing/manager/network/action/actions/server/game/NASServerClosed.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.emamaker.amazeing.manager.network.action.actions.server.game; - -import com.emamaker.amazeing.manager.network.NetworkCommon; -import com.emamaker.amazeing.manager.network.NetworkHandler; -import com.emamaker.amazeing.manager.network.action.NetworkAction; -import com.esotericsoftware.kryonet.Connection; - -public class NASServerClosed extends NetworkAction { - - protected NASServerClosed(NetworkHandler parent, Connection c, Object incomingMsg_, Object responsePacket_, - Object endPacket_, boolean oneTime) { - super(parent, c, incomingMsg_, responsePacket_, endPacket_, oneTime); - } - - public NASServerClosed(NetworkHandler parent_) { - super(parent_, null, new NetworkCommon.ServerClosed(), null, true); - } - - @Override - public void resolveAction() { - super.resolveAction(); - System.out.println("Server stopped?"); - server().server.sendToAllUDP(responsePacket); - } - - @Override - public void responseReceived(Connection conn, Object msg) { - super.responseReceived(conn, msg); - } - - @Override - public NetworkAction newInstance() { - return new NASServerClosed(server(), incomingConnection, incomingMsg, responsePacket, endPacket, oneTime); - } - -} diff --git a/core/src/com/emamaker/amazeing/manager/network/action/actions/server/login/NASLoginAO2.java b/core/src/com/emamaker/amazeing/manager/network/action/actions/server/login/NASLoginAO2.java index 8053104..6e703e1 100644 --- a/core/src/com/emamaker/amazeing/manager/network/action/actions/server/login/NASLoginAO2.java +++ b/core/src/com/emamaker/amazeing/manager/network/action/actions/server/login/NASLoginAO2.java @@ -30,6 +30,8 @@ public class NASLoginAO2 extends NetworkAction { System.out.println("Client accepted uuid " + uuid); MazePlayerRemote player = new MazePlayerRemote(uuid); server().players.put(uuid, player); + server().players.get(uuid).LAST_NETWORK_TIME = System.currentTimeMillis(); + server().setUpdatePos(uuid, false); } ((ServerLoginAO2)responsePacket).uuid = uuid; diff --git a/core/src/com/emamaker/amazeing/manager/network/action/actions/server/login/NASLoginUUID.java b/core/src/com/emamaker/amazeing/manager/network/action/actions/server/login/NASLoginUUID.java index 6039649..cc53ec7 100644 --- a/core/src/com/emamaker/amazeing/manager/network/action/actions/server/login/NASLoginUUID.java +++ b/core/src/com/emamaker/amazeing/manager/network/action/actions/server/login/NASLoginUUID.java @@ -3,6 +3,7 @@ package com.emamaker.amazeing.manager.network.action.actions.server.login; import java.util.UUID; import com.emamaker.amazeing.manager.network.NetworkCommon; +import com.emamaker.amazeing.manager.network.NetworkCommon.ClientLoginAO2; import com.emamaker.amazeing.manager.network.NetworkCommon.ServerLoginUUID; import com.emamaker.amazeing.manager.network.NetworkHandler; import com.emamaker.amazeing.manager.network.action.NetworkAction; diff --git a/core/src/com/emamaker/amazeing/manager/network/action/actions/server/player/NASUpdatePlayerPos.java b/core/src/com/emamaker/amazeing/manager/network/action/actions/server/player/NASUpdatePlayerPos.java index 97172ac..54700ac 100644 --- a/core/src/com/emamaker/amazeing/manager/network/action/actions/server/player/NASUpdatePlayerPos.java +++ b/core/src/com/emamaker/amazeing/manager/network/action/actions/server/player/NASUpdatePlayerPos.java @@ -27,6 +27,7 @@ public class NASUpdatePlayerPos extends NetworkAction { float pz = ((UpdatePlayerPosition) incomingMsg).pz; if (parent.players.containsKey(uuid) && server().canUpdatePos(uuid) && parent.gameManager.gameStarted) { parent.players.get(uuid).setPos(px, py, pz); + parent.players.get(uuid).LAST_NETWORK_TIME = System.currentTimeMillis(); server().server.sendToAllUDP(incomingMsg); } } diff --git a/core/src/com/emamaker/amazeing/maze/MazeGenerator.java b/core/src/com/emamaker/amazeing/maze/MazeGenerator.java index 672ec3f..83c38c0 100755 --- a/core/src/com/emamaker/amazeing/maze/MazeGenerator.java +++ b/core/src/com/emamaker/amazeing/maze/MazeGenerator.java @@ -242,9 +242,12 @@ public class MazeGenerator { OLDMAZEX = MazeSettings.MAZEX; OLDMAZEZ = MazeSettings.MAZEZ; + todraw = new int[w][h]; + for (int j = 0; j < h; j++) { for (int i = 0; i < w; i++) { todraw[i][j] = todraw_[i][j]; + main.world.worldManager.setCell(i, 0, j, CellId.ID_GRASS); if (todraw[i][j] == 1) @@ -258,18 +261,16 @@ public class MazeGenerator { } } } - + public int[][] changeMap(int[][] tmp, int x, int z, int type) { - if(x > 0 && x < w - 1 && z > 0 && z < h - 1 && todraw[x][z] != 2) tmp[x][z] = type; + if (x > 0 && x < w - 1 && z > 0 && z < h - 1 && todraw[x][z] != 2) { + tmp[x][z] = type; + } return tmp; } public void requestChangeToMap(int[][] todraw_) { - if(AMazeIng.getMain().client.isRunning()) { -// AMazeIng.getMain().client.requestUpdateMap(todraw_); - }else { - show(todraw_); - } + show(todraw_); } boolean allCellsVisited() { diff --git a/core/src/com/emamaker/amazeing/maze/settings/MazeSetting.java b/core/src/com/emamaker/amazeing/maze/settings/MazeSetting.java index a51c162..ff60eb4 100755 --- a/core/src/com/emamaker/amazeing/maze/settings/MazeSetting.java +++ b/core/src/com/emamaker/amazeing/maze/settings/MazeSetting.java @@ -141,5 +141,18 @@ public class MazeSetting { public String getOptionString() { return options[currentOption]; } + + public String getValueAt(int i) { + if(i < options.length) return options[i]; + return ""; + } + + public String getFirstValue() { + return getValueAt(0); + } + + public String getLastValue() { + return getValueAt(options.length-1); + } } diff --git a/core/src/com/emamaker/amazeing/maze/settings/MazeSettings.java b/core/src/com/emamaker/amazeing/maze/settings/MazeSettings.java index de3db0c..22ceb56 100755 --- a/core/src/com/emamaker/amazeing/maze/settings/MazeSettings.java +++ b/core/src/com/emamaker/amazeing/maze/settings/MazeSettings.java @@ -36,7 +36,7 @@ public class MazeSettings { AMazeIng.getMain().uiManager); setStartPowerups = new MazeSettingStartPowerUps("POWERUPS AT START : ", - new String[] { "1", "2", "3", "4", "5", "8", "10", "15" }, 2, AMazeIng.getMain().uiManager); + new String[] { "1", "2", "3", "4", "5", "8", "10", "15" }, 6, AMazeIng.getMain().uiManager); setEpDist = new MazeSettingEPDIST("END POINT DISTANCE:", new String[] { "1", "2", "5", "10", "20" }, 2, AMazeIng.getMain().uiManager); diff --git a/core/src/com/emamaker/amazeing/player/MazePlayer.java b/core/src/com/emamaker/amazeing/player/MazePlayer.java index f4a0e51..154a11b 100755 --- a/core/src/com/emamaker/amazeing/player/MazePlayer.java +++ b/core/src/com/emamaker/amazeing/player/MazePlayer.java @@ -48,6 +48,8 @@ public abstract class MazePlayer implements Disposable { public float speed; public float turnSpeed; + public long LAST_NETWORK_TIME = 0; + Vector3 pos = new Vector3(); Quaternion rot = new Quaternion(); @@ -146,7 +148,7 @@ public abstract class MazePlayer implements Disposable { } public void usePowerUp() { - if (currentPowerUp != null && !currentPowerUp.beingUsed) + if (currentPowerUp != null) if (currentPowerUp.usePowerUp(this)) disablePowerUp(); } diff --git a/core/src/com/emamaker/amazeing/player/MazePlayerLocal.java b/core/src/com/emamaker/amazeing/player/MazePlayerLocal.java index b397760..049b884 100755 --- a/core/src/com/emamaker/amazeing/player/MazePlayerLocal.java +++ b/core/src/com/emamaker/amazeing/player/MazePlayerLocal.java @@ -304,7 +304,6 @@ public class MazePlayerLocal extends MazePlayer { if (!isDisposed() && initedPhysics) { characterTransform.set(x, y, z, i, j, k, l); ghostObject.setWorldTransform(characterTransform); - System.out.println(characterTransform.getTranslation(new Vector3()).toString()); } } diff --git a/core/src/com/emamaker/amazeing/player/powerups/PowerUp.java b/core/src/com/emamaker/amazeing/player/powerups/PowerUp.java index b9d6267..7e98ab5 100755 --- a/core/src/com/emamaker/amazeing/player/powerups/PowerUp.java +++ b/core/src/com/emamaker/amazeing/player/powerups/PowerUp.java @@ -1,8 +1,12 @@ package com.emamaker.amazeing.player.powerups; +import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.VertexAttributes; +import com.badlogic.gdx.graphics.g2d.ParticleEffect; +import com.badlogic.gdx.graphics.g2d.ParticleEffectPool; +import com.badlogic.gdx.graphics.g2d.ParticleEffectPool.PooledEffect; import com.badlogic.gdx.graphics.g3d.Environment; import com.badlogic.gdx.graphics.g3d.Material; import com.badlogic.gdx.graphics.g3d.Model; @@ -16,6 +20,7 @@ import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.utils.Disposable; import com.emamaker.amazeing.AMazeIng; import com.emamaker.amazeing.player.MazePlayer; +import com.emamaker.amazeing.utils.MathUtils; public class PowerUp implements Disposable { @@ -36,11 +41,15 @@ public class PowerUp implements Disposable { Vector3 pos = new Vector3(); - public PowerUp(String name_, Texture texture_, boolean cont) { - this(name_, texture_, cont, 1, 1); + ParticleEffect effect; + ParticleEffectPool effectPool; + + public PowerUp(String name_, Texture texture_, boolean cont, FileHandle effectFile, FileHandle imageSrc) { + this(name_, texture_, cont, 1, 1, effectFile, imageSrc); } - public PowerUp(String name_, Texture texture_, boolean cont, float scaleX, float scaleZ) { + public PowerUp(String name_, Texture texture_, boolean cont, float scaleX, float scaleZ, FileHandle effectFile, + FileHandle imageSrc) { this.name = name_; this.texture = texture_; this.scaleX = scaleX; @@ -54,6 +63,12 @@ public class PowerUp implements Disposable { beingUsed = false; built = false; toUpdatePos = false; + + if (effectFile != null && imageSrc != null) { + effect = new ParticleEffect(); + effect.load(effectFile, imageSrc); + effectPool = new ParticleEffectPool(effect, 1, 2); + } } @SuppressWarnings("deprecation") @@ -106,7 +121,15 @@ public class PowerUp implements Disposable { // Return true if the effect has been resolved public boolean usePowerUp(MazePlayer player) { -// System.out.println(this.name + "!"); + System.out.println(this.name + " ! "); + + if (effect != null) { + PooledEffect e = effectPool.obtain(); + Vector3 pos = MathUtils.toScreenCoords(player.getPos()); + e.setPosition(pos.x, pos.y); + + AMazeIng.getMain().effects.add(e); + } return true; } @@ -122,36 +145,47 @@ class PowerUpTemporized extends PowerUp { long time = 0, startTime = 0; boolean used = false; - public PowerUpTemporized(String name_, Texture texture_, boolean cont, float secs_) { - this(name_, texture_, cont, secs_, 1, 1); + public PowerUpTemporized(String name_, Texture texture_, boolean cont, float secs_, FileHandle effectFile, + FileHandle imageSrc) { + this(name_, texture_, cont, secs_, 1, 1, effectFile, imageSrc); } - public PowerUpTemporized(String name_, Texture texture_, boolean cont, float secs_, float scaleX, float scaleZ) { - super(name_, texture_, cont, scaleX, scaleZ); + public PowerUpTemporized(String name_, Texture texture_, boolean cont, float secs_, float scaleX, float scaleZ, + FileHandle effectFile, FileHandle imageSrc) { + super(name_, texture_, cont, scaleX, scaleZ, effectFile, imageSrc); this.time = (long) (secs_ * 1000); startTime = 0; } + PooledEffect e; + @Override public boolean usePowerUp(MazePlayer player) { - super.usePowerUp(player); - if (!used) { startTime = System.currentTimeMillis(); used = true; + + e = effectPool.obtain(); + AMazeIng.getMain().effects.add(e); } - if (System.currentTimeMillis() - startTime < time) { + if (System.currentTimeMillis() - startTime <= time) { temporizedEffect(player); + System.out.println("starting " + name); return false; } else { used = false; + System.out.println("finishing " + name); + e = null; temporizedEffectExpired(player); return true; } } public void temporizedEffect(MazePlayer player) { + Vector3 p = MathUtils.toScreenCoords(player.getPos()); + e.setPosition(p.x, p.y); + beingUsed = true; } @@ -166,24 +200,26 @@ class PowerUpGiver extends PowerUp { PowerUp powerup; MazePlayer p; - public PowerUpGiver(PowerUp p, String name, Texture texture, boolean continuos) { - this(p, name, texture, continuos, 1f, 1f); + public PowerUpGiver(PowerUp p, String name, Texture texture, boolean continuos, FileHandle effectFile, + FileHandle imageSrc) { + this(p, name, texture, continuos, 1f, 1f, effectFile, imageSrc); } - public PowerUpGiver(PowerUp p, String name, Texture texture, boolean continuos, float scaleX, float scaleZ) { - super(name, texture, continuos, scaleX, scaleZ); + public PowerUpGiver(PowerUp p, String name, Texture texture, boolean continuos, float scaleX, float scaleZ, + FileHandle effectFile, FileHandle imageSrc) { + super(name, texture, continuos, scaleX, scaleZ, effectFile, imageSrc); this.powerup = p; } @Override public boolean usePowerUp(MazePlayer player) { - super.usePowerUp(player); +// super.usePowerUp(player); p = null; if (AMazeIng.getMain().currentGameManager.players.size() > 1) { while (p == player || p == null) p = AMazeIng.getMain().currentGameManager.getRandomPlayer(); - p.currentPowerUp = new PowerUpBallAndChain(); + p.currentPowerUp = powerup; p.usePowerUp(); } diff --git a/core/src/com/emamaker/amazeing/player/powerups/PowerUpBallAndChain.java b/core/src/com/emamaker/amazeing/player/powerups/PowerUpBallAndChain.java index dc28fd5..df6cfb7 100755 --- a/core/src/com/emamaker/amazeing/player/powerups/PowerUpBallAndChain.java +++ b/core/src/com/emamaker/amazeing/player/powerups/PowerUpBallAndChain.java @@ -1,21 +1,25 @@ package com.emamaker.amazeing.player.powerups; +import com.badlogic.gdx.Gdx; import com.emamaker.amazeing.player.MazePlayer; import com.emamaker.amazeing.utils.TextureLoader; public class PowerUpBallAndChain extends PowerUpTemporized { public PowerUpBallAndChain() { - super("BALL AND CHAIN", TextureLoader.textureBallAndChain, true, 10, 1f, 1f); + super("BALL AND CHAIN", TextureLoader.textureBallAndChain, true, 10, 1f, 1f, + Gdx.files.internal("data/particles/ball_and_chain.particle"), Gdx.files.internal("data/powerups")); } @Override public void temporizedEffect(MazePlayer player) { + super.temporizedEffect(player); player.speedMult = 0.5f; } @Override public void temporizedEffectExpired(MazePlayer player) { + super.temporizedEffectExpired(player); player.speedMult = 1f; } } @@ -23,9 +27,7 @@ public class PowerUpBallAndChain extends PowerUpTemporized { class PowerUpGiveBallAndChain extends PowerUpGiver { public PowerUpGiveBallAndChain() { - super(new PowerUpBallAndChain(), "BALL AND CHAIN GIVER", - TextureLoader.textureBallAndChain, false, - 1f, 1f); + super(new PowerUpBallAndChain(), "BALL AND CHAIN GIVER", TextureLoader.textureBallAndChain, false, null, null); } } diff --git a/core/src/com/emamaker/amazeing/player/powerups/PowerUpBomb.java b/core/src/com/emamaker/amazeing/player/powerups/PowerUpBomb.java index 49db19e..138929d 100755 --- a/core/src/com/emamaker/amazeing/player/powerups/PowerUpBomb.java +++ b/core/src/com/emamaker/amazeing/player/powerups/PowerUpBomb.java @@ -1,5 +1,7 @@ package com.emamaker.amazeing.player.powerups; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Texture; import com.emamaker.amazeing.AMazeIng; import com.emamaker.amazeing.player.MazePlayer; @@ -12,11 +14,11 @@ public class PowerUpBomb extends PowerUp { AMazeIng main = AMazeIng.getMain(); public PowerUpBomb() { - this("BOMB", TextureLoader.textureBomb, false, 1f, 1f); + this("BOMB", TextureLoader.textureBomb, false, 1f, 1f, Gdx.files.internal("data/particles/explosion_small.particle"), Gdx.files.internal("data/particles")); } - public PowerUpBomb(String name, Texture texture, boolean cont, float sx, float sz) { - super(name, texture, cont, sx, sz); + public PowerUpBomb(String name, Texture texture, boolean cont, float sx, float sz, FileHandle effectFile, FileHandle imageSrc) { + super(name, texture, cont, sx, sz, effectFile, imageSrc); } @Override @@ -25,6 +27,8 @@ public class PowerUpBomb extends PowerUp { int px = (int) player.getPos().x; int pz = (int) player.getPos().z; + + System.out.println("Player in " + player.getPos()); int tmptodraw[][] = new int[main.currentGameManager.mazeGen.w][main.currentGameManager.mazeGen.h]; @@ -47,7 +51,7 @@ public class PowerUpBomb extends PowerUp { class PowerUpBigBomb extends PowerUpBomb{ public PowerUpBigBomb() { - super("BIG BOMB", TextureLoader.textureBomb, false, 1.5f, 1.5f); + super("BIG BOMB", TextureLoader.textureBomb, false, 1.5f, 1.5f, Gdx.files.internal("data/particles/explosion.particle"), Gdx.files.internal("data/particles")); radius = 2; } diff --git a/core/src/com/emamaker/amazeing/player/powerups/PowerUpFeather.java b/core/src/com/emamaker/amazeing/player/powerups/PowerUpFeather.java index 1b39a06..2a95c7f 100755 --- a/core/src/com/emamaker/amazeing/player/powerups/PowerUpFeather.java +++ b/core/src/com/emamaker/amazeing/player/powerups/PowerUpFeather.java @@ -1,5 +1,6 @@ package com.emamaker.amazeing.player.powerups; +import com.badlogic.gdx.Gdx; import com.emamaker.amazeing.player.MazePlayer; import com.emamaker.amazeing.utils.TextureLoader; @@ -7,16 +8,18 @@ public class PowerUpFeather extends PowerUpTemporized { public PowerUpFeather() { super("FEATHER", TextureLoader.textureFeather, true, 10, - 1f, 1f); + 1f, 1f, Gdx.files.internal("data/particles/feather.particle"), Gdx.files.internal("data/powerups")); } @Override public void temporizedEffect(MazePlayer player) { + super.temporizedEffect(player); player.speedMult = 2f; } @Override public void temporizedEffectExpired(MazePlayer player) { + super.temporizedEffectExpired(player); player.speedMult = 1f; } diff --git a/core/src/com/emamaker/amazeing/player/powerups/PowerUpSlug.java b/core/src/com/emamaker/amazeing/player/powerups/PowerUpSlug.java index 8daa911..fbd50a0 100755 --- a/core/src/com/emamaker/amazeing/player/powerups/PowerUpSlug.java +++ b/core/src/com/emamaker/amazeing/player/powerups/PowerUpSlug.java @@ -1,22 +1,25 @@ package com.emamaker.amazeing.player.powerups; +import com.badlogic.gdx.Gdx; import com.emamaker.amazeing.player.MazePlayer; import com.emamaker.amazeing.utils.TextureLoader; public class PowerUpSlug extends PowerUpTemporized { public PowerUpSlug() { - super("SLUG", TextureLoader.textureSlug, true, 20, - 1.3f, 1.3f); + super("SLUG", TextureLoader.textureSlug, true, 15, + 1.3f, 1.3f, Gdx.files.internal("data/particles/slugs.particle"), Gdx.files.internal("data/powerups")); } @Override public void temporizedEffect(MazePlayer player) { + super.temporizedEffect(player); player.speedMult = 0.25f; } @Override public void temporizedEffectExpired(MazePlayer player) { + super.temporizedEffectExpired(player); player.speedMult = 1f; } @@ -25,7 +28,7 @@ public class PowerUpSlug extends PowerUpTemporized { class PowerUpGiveSlug extends PowerUpGiver { public PowerUpGiveSlug() { - super(new PowerUpSlug(), "SLUG GIVER", TextureLoader.textureSlug, false, 1f, 1f); + super(new PowerUpSlug(), "SLUG GIVER", TextureLoader.textureSlug, false, 1f, 1f, null, null); } } diff --git a/core/src/com/emamaker/amazeing/ui/screens/PreGameScreen.java b/core/src/com/emamaker/amazeing/ui/screens/PreGameScreen.java index 5fe94c6..3e448f9 100755 --- a/core/src/com/emamaker/amazeing/ui/screens/PreGameScreen.java +++ b/core/src/com/emamaker/amazeing/ui/screens/PreGameScreen.java @@ -84,7 +84,7 @@ public class PreGameScreen extends MyScreen { public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { hide(); if (uiManager.main.client.isRunning()) { - uiManager.main.client.stop(); + uiManager.main.client.stop(true); uiManager.main.setScreen(uiManager.srvJoinScreen); } if (uiManager.main.server.isRunning()) { diff --git a/core/src/com/emamaker/amazeing/ui/screens/ServerJoinScreen.java b/core/src/com/emamaker/amazeing/ui/screens/ServerJoinScreen.java index 8810f37..3b64b35 100755 --- a/core/src/com/emamaker/amazeing/ui/screens/ServerJoinScreen.java +++ b/core/src/com/emamaker/amazeing/ui/screens/ServerJoinScreen.java @@ -78,9 +78,9 @@ public class ServerJoinScreen extends MyScreen { /* ERROR DIALOG */ errorDlg = new Dialog("Error in communicating with server", uiManager.skin); errorDlgText = new Label("", uiManager.skin); - errorDlg.text(helpDlgText); + errorDlg.text(errorDlgText); errorDlgOkBtn = new TextButton("OK", uiManager.skin); - errorDlg.button(helpDlgOkBtn); + errorDlg.button(errorDlgOkBtn); errorDlg.addListener(new InputListener() { @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { @@ -160,6 +160,11 @@ public class ServerJoinScreen extends MyScreen { failDlgText.setFontScale(labScale*0.9f); failDlgOkBtn.getLabel().setFontScale(labScale*0.9f); + errorDlg.setSize(cw*0.7f, ch*0.2f); + errorDlg.setPosition((sw-failDlg.getWidth())/2, (sh-failDlg.getHeight())/2); + errorDlgText.setFontScale(labScale*0.9f); + errorDlgOkBtn.getLabel().setFontScale(labScale*0.9f); + instLab.setFontScale(labScale); srvIpL.setFontScale(labScale); backBtn.getLabel().setFontScale(labScale); diff --git a/core/src/com/emamaker/amazeing/utils/MathUtils.java b/core/src/com/emamaker/amazeing/utils/MathUtils.java index 1aee5b8..aebd40b 100644 --- a/core/src/com/emamaker/amazeing/utils/MathUtils.java +++ b/core/src/com/emamaker/amazeing/utils/MathUtils.java @@ -1,10 +1,35 @@ package com.emamaker.amazeing.utils; import com.badlogic.gdx.math.Vector3; +import com.emamaker.amazeing.AMazeIng; public class MathUtils extends net.dermetfan.gdx.math.MathUtils { public static float vectorDistance(Vector3 v1, Vector3 v2) { - return (float) Math.sqrt((v1.x - v2.x)*(v1.x - v2.x) + (v1.y - v2.y)*(v1.y - v2.y) + (v1.z - v2.z)*(v1.z - v2.z)); + return (float) Math + .sqrt((v1.x - v2.x) * (v1.x - v2.x) + (v1.y - v2.y) * (v1.y - v2.y) + (v1.z - v2.z) * (v1.z - v2.z)); + } + + + public static Vector3 toScreenCoords(Vector3 vec) { + //This exta variable is needed otherwise the cam.project will convert the vector in argument from world coordinates to screen coordinates + Vector3 v1 = new Vector3(vec); + return AMazeIng.getMain().world.cam.project(v1); + } + + public static long map(long x, long in_min, long in_max, long out_min, long out_max) { + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; + } + + public static int map(int x, int in_min, int in_max, int out_min, int out_max) { + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; + } + + public static class Constants { + + public static int NETWORK_ACTION_TIMEOUT_MILLIS = 7000; + public static int COMMUNICATION_TIMEOUT_MILLIS = 100000; + public static int CLIENT_POS_PERIODIC_UPDATE = 1000; + } } diff --git a/desktop/assets/data/textures/texture_atlas.png b/desktop/assets/data/textures/texture_atlas.png new file mode 100755 index 0000000000000000000000000000000000000000..0c2262100ac367d28a39cee046891f5bec000f29 GIT binary patch literal 60803 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 literal 0 HcmV?d00001 diff --git a/desktop/build.gradle b/desktop/build.gradle index 089359f..3cd1bd1 100755 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -2,10 +2,10 @@ apply plugin: "java" sourceCompatibility = 1.7 sourceSets.main.java.srcDirs = [ "src/" ] -sourceSets.main.resources.srcDirs = ["../android/assets"] +sourceSets.main.resources.srcDirs = ["../core/assets/"] project.ext.mainClassName = "com.emamaker.amazeing.desktop.DesktopLauncher" -project.ext.assetsDir = new File("../android/assets") +project.ext.assetsDir = new File("../core/assets") task run(dependsOn: classes, type: JavaExec) { main = project.mainClassName