From 8fddf389bffb5222fba30b7302d83532122b17f9 Mon Sep 17 00:00:00 2001 From: fred-boy Date: Thu, 19 Apr 2018 22:26:40 +0700 Subject: [PATCH 01/16] Update in-game version number --- core/src/ru/deadsoftware/cavecraft/CaveGame.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/ru/deadsoftware/cavecraft/CaveGame.java b/core/src/ru/deadsoftware/cavecraft/CaveGame.java index fc6d0bd..57f560b 100644 --- a/core/src/ru/deadsoftware/cavecraft/CaveGame.java +++ b/core/src/ru/deadsoftware/cavecraft/CaveGame.java @@ -4,7 +4,7 @@ import com.badlogic.gdx.Game; public class CaveGame extends Game { - public static final String VERSION = "alpha 0.0"; + public static final String VERSION = "alpha 0.1"; public static GameState STATE; -- 2.29.2 From 49f9dadc73656e59ca9317e7e5d17a697d73e585 Mon Sep 17 00:00:00 2001 From: fred-boy Date: Fri, 20 Apr 2018 12:38:42 +0700 Subject: [PATCH 02/16] Update web icon --- android/ic_launcher-web.png | Bin 22195 -> 23278 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/android/ic_launcher-web.png b/android/ic_launcher-web.png index 8f0110dd3c1fcb756c2b9e2cdaef289b9990e7f3..837504eeac60e6c74690b34b8d25529d0571b5b3 100644 GIT binary patch literal 23278 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

wl*>W`DcOmD())M|SdZX!%zLKQvADnfx}Ym-RR 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 Date: Fri, 20 Apr 2018 12:39:01 +0700 Subject: [PATCH 03/16] Add README.md --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..713b0b4 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# CaveCraft +2D Minecraft clone for Android and Desktop.
+Written in Java using libGDX framework.
+## Build instructions +### Android +`./gradlew android:assembleRelease`
+### Desktop +`./gradlew desktop:assemble`
+*** +On Windows, use `gradlew.bat` instead of `./gradlew` + -- 2.29.2 From c6925c7674b71e9b6fe537aaca3aa7330e04e13f Mon Sep 17 00:00:00 2001 From: fred-boy Date: Fri, 20 Apr 2018 19:26:52 +0700 Subject: [PATCH 04/16] More convenient controls on desktop --- .../cavecraft/game/GameInputHandler.java | 14 ++--- .../cavecraft/game/GamePhysics.java | 12 ++-- .../deadsoftware/cavecraft/game/GameProc.java | 55 +++++++++++-------- .../cavecraft/game/GameRenderer.java | 8 +++ .../deadsoftware/cavecraft/game/WorldGen.java | 11 ++-- 5 files changed, 60 insertions(+), 40 deletions(-) diff --git a/core/src/ru/deadsoftware/cavecraft/game/GameInputHandler.java b/core/src/ru/deadsoftware/cavecraft/game/GameInputHandler.java index e8c31be..89fba69 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/GameInputHandler.java +++ b/core/src/ru/deadsoftware/cavecraft/game/GameInputHandler.java @@ -14,7 +14,7 @@ public class GameInputHandler { } private void wasdPressed(int keyCode) { - if (gameProc.ctrlMode==0) { + if (gameProc.ctrlMode==0 || !CaveGame.TOUCH) { switch (keyCode) { case Input.Keys.A: gameProc.player.moveX.x = -GamePhysics.PL_SPEED; @@ -25,7 +25,7 @@ public class GameInputHandler { gameProc.player.dir = 1; break; } - } else { + } else if (CaveGame.TOUCH){ switch (keyCode) { case Input.Keys.A: gameProc.cursorX--; @@ -40,10 +40,6 @@ public class GameInputHandler { gameProc.cursorY++; break; } - if (gameProc.cursorX<(gameProc.player.position.x+gameProc.player.texWidth/2)/16) - gameProc.player.dir=0; - if (gameProc.cursorX>(gameProc.player.position.x+gameProc.player.texWidth/2)/16) - gameProc.player.dir=1; } } @@ -53,8 +49,10 @@ public class GameInputHandler { wasdPressed(keyCode); } else switch (keyCode) { case Input.Keys.ALT_LEFT: - gameProc.ctrlMode++; - if (gameProc.ctrlMode > 1) gameProc.ctrlMode = 0; + if (CaveGame.TOUCH) { + gameProc.ctrlMode++; + if (gameProc.ctrlMode > 1) gameProc.ctrlMode = 0; + } break; case Input.Keys.SPACE: diff --git a/core/src/ru/deadsoftware/cavecraft/game/GamePhysics.java b/core/src/ru/deadsoftware/cavecraft/game/GamePhysics.java index 1bedc72..8e12e72 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/GamePhysics.java +++ b/core/src/ru/deadsoftware/cavecraft/game/GamePhysics.java @@ -16,7 +16,7 @@ public class GamePhysics { public GamePhysics(GameProc gameProc) { this.gameProc = gameProc; - gravity = new Vector2(0,1); + gravity = new Vector2(0,.9f); } private boolean checkJump(Rectangle rect, int dir) { @@ -27,12 +27,14 @@ public class GamePhysics { bl = gameProc.world.getForeMap( (int)((rect.x+(rect.width/2))/16) - 1, (int)(rect.y/16)+1); + if (gameProc.world.getForeMap((int)((rect.x+(rect.width/2))/16)-1,(int)(rect.y/16))>0) bl=0; break; case 1: if ((int)((rect.x+(rect.width/2))/16) + 10) bl=0; break; default: bl=0; @@ -66,17 +68,19 @@ public class GamePhysics { private void playerPhy(Player pl) { pl.position.add(pl.moveY); if (checkColl(pl.getRect())) { - pl.flyMode = false; - pl.canJump = true; int d = -1; if (pl.moveY.y<0) d=1; else if (pl.moveY.y>0) d=-1; + if (d==-1) { + pl.flyMode = false; + pl.canJump = true; + } pl.position.y = MathUtils.round(pl.position.y); while (checkColl(pl.getRect())) pl.position.y+=d; pl.moveY.setZero(); } else { pl.canJump = false; } - if (!pl.flyMode) pl.moveY.add(gravity); + if (!pl.flyMode && pl.moveY.y<18) pl.moveY.add(gravity); pl.position.add(pl.moveX); if (pl.position.x<0 || pl.position.x+pl.texWidth>=gameProc.world.getWidth()*16) diff --git a/core/src/ru/deadsoftware/cavecraft/game/GameProc.java b/core/src/ru/deadsoftware/cavecraft/game/GameProc.java index e49a405..47b3100 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/GameProc.java +++ b/core/src/ru/deadsoftware/cavecraft/game/GameProc.java @@ -1,13 +1,11 @@ package ru.deadsoftware.cavecraft.game; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.math.RandomXS128; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.TimeUtils; -import ru.deadsoftware.cavecraft.Assets; -import ru.deadsoftware.cavecraft.CaveGame; -import ru.deadsoftware.cavecraft.GameState; -import ru.deadsoftware.cavecraft.Items; +import ru.deadsoftware.cavecraft.*; import ru.deadsoftware.cavecraft.game.mobs.Human; import ru.deadsoftware.cavecraft.game.mobs.Mob; import ru.deadsoftware.cavecraft.game.objects.Player; @@ -39,7 +37,7 @@ public class GameProc { physics = new GamePhysics(this); player = new Player(world.getSpawnPoint()); mobs = new Array(); - + if (!CaveGame.TOUCH) ctrlMode = 1; } public void resetRenderer() { @@ -52,24 +50,31 @@ public class GameProc { } private void moveCursor() { - if (player.canJump) { - cursorX = (int) (player.position.x + player.texWidth / 2) / 16; - if (player.dir == 0) cursorX--; - else cursorX++; - cursorY = (int) (player.position.y + player.texWidth) / 16; - if (!isAutoselectable(cursorX, cursorY)) { - cursorY++; - } - if (!isAutoselectable(cursorX, cursorY)) { - cursorY++; - } - if (!isAutoselectable(cursorX, cursorY)) { - if (player.dir == 0) cursorX++; - else cursorX--; + if (ctrlMode==0) { + if (player.canJump) { + cursorX = (int) (player.position.x + player.texWidth / 2) / 16; + if (player.dir == 0) cursorX--; + else cursorX++; + cursorY = (int) (player.position.y + player.texWidth) / 16; + if (!isAutoselectable(cursorX, cursorY)) { + cursorY++; + } + if (!isAutoselectable(cursorX, cursorY)) { + cursorY++; + } + if (!isAutoselectable(cursorX, cursorY)) { + if (player.dir == 0) cursorX++; + else cursorX--; + } + } else { + cursorX = (int) (player.position.x + player.texWidth / 2) / 16; + cursorY = (int) (player.position.y + player.height+8)/16; } - } else { - cursorX = (int) (player.position.x + player.texWidth / 2) / 16; - cursorY = (int) (player.position.y + player.height+8)/16; + } else if (!CaveGame.TOUCH){ + cursorX = (int)(Gdx.input.getX()* + (renderer.camera.viewportWidth/GameScreen.getWidth())+renderer.camera.position.x)/16; + cursorY = (int)(Gdx.input.getY()* + (renderer.camera.viewportHeight/GameScreen.getHeight())+renderer.camera.position.y)/16; } } @@ -78,13 +83,17 @@ public class GameProc { if (cursorX >= world.getWidth()) cursorX = world.getWidth()-1; if (cursorY < 0) cursorY = 0; if (cursorY >= world.getHeight()) cursorY = world.getHeight()-1; + if (cursorX<(player.position.x+player.texWidth/2)/16) + player.dir=0; + if (cursorX>(player.position.x+player.texWidth/2)/16) + player.dir=1; } public void update(float delta) { RUN_TIME += delta; physics.update(delta); - if (ctrlMode==0) moveCursor(); + moveCursor(); checkCursorBounds(); if (isTouchDown && TimeUtils.timeSinceMillis(touchDownTime) > 500) { diff --git a/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java b/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java index 566f072..7eed8a7 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java +++ b/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java @@ -1,6 +1,7 @@ package ru.deadsoftware.cavecraft.game; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.g2d.SpriteBatch; @@ -219,6 +220,12 @@ public class GameRenderer { } spriteBatch.end(); + shapeRenderer.begin(ShapeRenderer.ShapeType.Line); + shapeRenderer.setColor(Color.ORANGE); + shapeRenderer.line(0-camera.position.x, 128*16-camera.position.y, + gameProc.world.getWidth()*16-camera.position.x, 128*16-camera.position.y); + shapeRenderer.end(); + if (CaveGame.TOUCH) { spriteBatch.begin(); drawTouchGui(); @@ -231,6 +238,7 @@ public class GameRenderer { drawString("FPS: "+GameScreen.FPS, 0, 20); drawString("X: "+(int)(gameProc.player.position.x/16), 0, 40); drawString("Y: "+(int)(gameProc.player.position.y/16), 0, 60); + drawString("Seed: "+WorldGen.getSeed(), 0, 80); fontBatch.end(); } diff --git a/core/src/ru/deadsoftware/cavecraft/game/WorldGen.java b/core/src/ru/deadsoftware/cavecraft/game/WorldGen.java index 8b1b699..48c8db8 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/WorldGen.java +++ b/core/src/ru/deadsoftware/cavecraft/game/WorldGen.java @@ -1,5 +1,6 @@ package ru.deadsoftware.cavecraft.game; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.math.RandomXS128; import com.badlogic.gdx.utils.ArrayMap; import com.badlogic.gdx.utils.TimeUtils; @@ -59,7 +60,7 @@ public class WorldGen { rand = new RandomXS128(seed); foreMap = new int[width][height]; backMap = new int[width][height]; - hMap = genLandscape(width, height/2, height/4, height/4*3); + hMap = genLandscape(width, height/4, height/8, height/2); for (int x=0; x2 && x Date: Fri, 20 Apr 2018 20:08:35 +0700 Subject: [PATCH 05/16] Add .travis.yml --- .travis.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..be19497 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,12 @@ +language: android + +android: + + jdk: + - oraclejdk8 + + components: + - build-tools-25.0.0 + - android-20 + +script: ./gradlew assemble assembleRelease -- 2.29.2 From 4af481b6e847a4276a50e07cb5a91e76ff53b95d Mon Sep 17 00:00:00 2001 From: fred-boy Date: Fri, 20 Apr 2018 20:30:45 +0700 Subject: [PATCH 06/16] Fix .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index be19497..f895d82 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,4 +9,4 @@ android: - build-tools-25.0.0 - android-20 -script: ./gradlew assemble assembleRelease +script: ./gradlew build -- 2.29.2 From 1bad62ea833826720fb222f58de14433dd06d81a Mon Sep 17 00:00:00 2001 From: fred-boy Date: Fri, 20 Apr 2018 20:32:53 +0700 Subject: [PATCH 07/16] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 713b0b4..9283566 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ +[![Build Status](https://travis-ci.org/fredboy/cavecraft.svg?branch=master)](https://travis-ci.org/fredboy/cavecraft)
# CaveCraft 2D Minecraft clone for Android and Desktop.
Written in Java using libGDX framework.
## Build instructions ### Android -`./gradlew android:assembleRelease`
+`./gradlew android:assemble`
### Desktop `./gradlew desktop:assemble`
*** -- 2.29.2 From c36c3406630a84698e578ea612fd56c1ab1de59c Mon Sep 17 00:00:00 2001 From: fred-boy Date: Fri, 20 Apr 2018 20:47:48 +0700 Subject: [PATCH 08/16] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9283566..c7ee65b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ -[![Build Status](https://travis-ci.org/fredboy/cavecraft.svg?branch=master)](https://travis-ci.org/fredboy/cavecraft)
# CaveCraft +[![Build Status](https://travis-ci.org/fredboy/cavecraft.svg?branch=master)](https://travis-ci.org/fredboy/cavecraft) +[![Releases](https://img.shields.io/github/release/fredboy/cavecraft.svg)](https://github.com/fredboy/cavecraft/releases/latest)
2D Minecraft clone for Android and Desktop.
Written in Java using libGDX framework.
## Build instructions -- 2.29.2 From 9bbcef90af8cf413dffafe78043c4dcdb0febba8 Mon Sep 17 00:00:00 2001 From: fred-boy Date: Fri, 20 Apr 2018 20:57:50 +0700 Subject: [PATCH 09/16] Remove unused class Human --- .../cavecraft/game/mobs/Human.java | 70 ------------------- 1 file changed, 70 deletions(-) delete mode 100644 core/src/ru/deadsoftware/cavecraft/game/mobs/Human.java diff --git a/core/src/ru/deadsoftware/cavecraft/game/mobs/Human.java b/core/src/ru/deadsoftware/cavecraft/game/mobs/Human.java deleted file mode 100644 index 245d349..0000000 --- a/core/src/ru/deadsoftware/cavecraft/game/mobs/Human.java +++ /dev/null @@ -1,70 +0,0 @@ -package ru.deadsoftware.cavecraft.game.mobs; - -import com.badlogic.gdx.graphics.g2d.Sprite; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.math.RandomXS128; -import com.badlogic.gdx.math.Rectangle; -import com.badlogic.gdx.math.Vector2; -import ru.deadsoftware.cavecraft.Assets; -import ru.deadsoftware.cavecraft.game.GameProc; - -public class Human extends Mob{ - - private RandomXS128 rand = new RandomXS128(); - private GameProc gameProc; - private Sprite[][] tex; - - public Human(int x, int y, GameProc gameProc) { - this.gameProc = gameProc; - position = new Vector2(x, y); - moveX = new Vector2(0, 0); - moveY = new Vector2(0, 0); - width = 8; - height = 30; - dir = 0; - canJump = false; - tex = Assets.playerSkin.clone(); - animation = 0; - anim_d = 1; - } - - @Override - public void ai() { - if (canJump && gameProc.world.getForeMap( - (int)(position.x/16)+(dir*2-1), (int)(position.y/16)+1)>0) - moveY.add(0, -8); - if (rand.nextInt(500)>490) dir++; - if (dir>1) dir = 0; - moveX.setZero(); - moveX.add(-2+4*dir, 0); - } - - @Override - public void draw(SpriteBatch spriteBatch, float x, float y) { - if (moveX.x!=0) { - animation+=Mob.ANIM_SPEED*anim_d; - if (animation<=-60 || animation>=60) anim_d=-anim_d; - } - tex[0][2].setRotation(animation); - tex[1][2].setRotation(-animation); - tex[0][3].setRotation(-animation); - tex[1][3].setRotation(animation); - spriteBatch.draw(tex[dir][0], x-2, y-2); - if (tex[0][2].getRotation()>=60 || tex[0][2].getRotation()<=-60) - Mob.ANIM_SPEED = -Mob.ANIM_SPEED; - tex[1][2].setPosition(x-6,y); - tex[1][2].draw(spriteBatch); - tex[1][3].setPosition(x-6, y+10); - tex[1][3].draw(spriteBatch); - tex[0][3].setPosition(x-6, y+10); - tex[0][3].draw(spriteBatch); - spriteBatch.draw(tex[dir][1], x-2, y + 8); - - tex[0][2].setPosition(x-6, y); - tex[0][2].draw(spriteBatch); - } - - public Rectangle getRect() { - return new Rectangle(position.x, position.y, width, height); - } -} -- 2.29.2 From 385255cc7b49fbfd3290497367cbc69919b24d4f Mon Sep 17 00:00:00 2001 From: fred-boy Date: Fri, 20 Apr 2018 22:26:25 +0700 Subject: [PATCH 10/16] Add pigs --- android/assets/mobs/pig.png | Bin 0 -> 1665 bytes .../src/ru/deadsoftware/cavecraft/Assets.java | 58 ++++++++++++------ .../cavecraft/game/GamePhysics.java | 1 - .../deadsoftware/cavecraft/game/GameProc.java | 5 +- .../cavecraft/game/GameRenderer.java | 45 +++++++------- .../deadsoftware/cavecraft/game/mobs/Mob.java | 15 ++++- .../deadsoftware/cavecraft/game/mobs/Pig.java | 56 +++++++++++++++++ .../cavecraft/game/objects/Player.java | 2 + 8 files changed, 137 insertions(+), 45 deletions(-) create mode 100644 android/assets/mobs/pig.png create mode 100644 core/src/ru/deadsoftware/cavecraft/game/mobs/Pig.java diff --git a/android/assets/mobs/pig.png b/android/assets/mobs/pig.png new file mode 100644 index 0000000000000000000000000000000000000000..826d7254d952c25974076f31ccfb9a5578e6e386 GIT binary patch literal 1665 zcmV-{27dX8P)VGd000McNliru;sg{94KY(qC0qai1`bI? zK~z}7?UzfBTvru^zw@}Ss;+)izuXRr1Q8YpCYJIikeDJSC7iBqYp613}2iu=UMv7@m+kfGtbflLOMMMcYIk1}1(NlEFC3lavKe z2UWewJ4cEAZo$gN2J@RY>F(S{`}AZD9A3SqoCN-HW1rXm{0Bl0c*}TekNV;sZtR|@ z0gn^#o;(Z~z&Rxk1J)I=7?5nZ@zP5=-dG{sJ3;y$Q-TW>s&m4k$BjU{1d9Q)JHcd+ zUs*wBE%Ow)^s8T+hZ_(FBgdD%{2Z_U^^dqB<9&(51m1vCs;UA!vwL^Rl8C)hl|npe zQOUS_iQyz*nv&^SjW#8ufDFR=h3V1>7=ZoX{6eJ{R(CIutl)d$-i;fqKeJ67GN$jy zYVeZ5WH5%*_h<;Hap-J7+hhE6#E=xP77B+k;EI~vmtTJP1P-rWBP#e!Lyi&K16f$R zcmaCBs)BX6n2AHe)^POhEqoIC5HKmCN!Z-lL9~Ew24#hxt|BKrW~Dki17%T}zrTH* zH{bXZmoGoh7j`$Xu0RWm&5ksv7F(YDUckAE_01iuH%wAbY6pl02?Jg5!fbq&8A)jPb*ObRC(DOR(rVD!@66s!LmB&0sv)TA(`n6z_cNg{2?e`q`_- ztb1(NK~uq^$9j*Z9<9deR!11?IeO8;w7W|u9ck9n ztTq(&I`hN3kTTh>QfcI|4M-fYO+nR6S$p>V4AcW_8&mpLh;7T-=9J(@ym4b6=N->~ z{#kGZVSjcujLy=s43u?=4H2u3adXOzzr6J(f4jL4K>geob?F3dUwK7MWLSbA}P{DY{-bF)Ay6|<2NE10=Nc07$gbZ>;TCL zFCH}!&6%i~!h7T}Vr`~gonoCOtNj!znYRp!Id0^Uu%Mc5Qlw0Xk)kQFLqG;YY#dD+ z!M?xmd8DwJr~1Fwr~1ov>&j1Yb@>sRH%8Pe>mQ2DG#Z{)(zQ#`{Kz;yw}D`m zqWO_=d|sV}=EJMkmQUdJl~*_qnsZd_2%NRZeP|vY0nHy@!2{4d*}bSBsH^aGL7JVI zWoUlw?YESeq4Zei2r-&vX#SW1=RgKwygU66%|yYijTsgJXA5+ZPtiOwNEaX*{5(ME zI6k-uqL`*aLc|)!_rCH~WY*&*6E?p6!txA!faa(M`ov;(aM}xE!aI*xXwyA}migTU z8anU_e1v8I6~S6ZHh@vIG!I4d|4iTkXwE`z2ec~jNtmo{E<-av|N7U^0q_o+GdnN7 zc>Y%WAT+y}$kyYmCG`PfUW#U$Git#YPmbvvG`!!y1JGQT6{hgSzQtA*NB`Mhie^cI zahA-0^~EPM@E|n%lud|{!j;%|&e~*qDVl%yyWg9qgnO!|`Xu@<8$PzXDN%rj00000 LNkvXXu0mjf&cF*X literal 0 HcmV?d00001 diff --git a/core/src/ru/deadsoftware/cavecraft/Assets.java b/core/src/ru/deadsoftware/cavecraft/Assets.java index 7dedb4b..acdebdf 100644 --- a/core/src/ru/deadsoftware/cavecraft/Assets.java +++ b/core/src/ru/deadsoftware/cavecraft/Assets.java @@ -13,7 +13,10 @@ public class Assets { public static BitmapFont minecraftFont; public static Texture charTexture; - public static Sprite[][] playerSkin = new Sprite[2][4]; + public static Sprite[][] playerSprite = new Sprite[2][4]; + + public static Texture pigTexture; + public static Sprite[][] pigSprite = new Sprite[2][2]; public static Sprite shade; @@ -35,36 +38,53 @@ public class Assets { public static TextureRegion touchToggleMode; public static TextureRegion touchSpace; - public static void load() { - minecraftFont = new BitmapFont(Gdx.files.internal("font.fnt"), true); + private static void loadPlayer() { charTexture = new Texture(Gdx.files.internal("mobs/char.png")); //LOOK TO LEFT //head - playerSkin[0][0] = new Sprite(new TextureRegion(charTexture, 0,0,12,12)); - playerSkin[0][0].flip(false,true); + playerSprite[0][0] = new Sprite(new TextureRegion(charTexture, 0,0,12,12)); + playerSprite[0][0].flip(false,true); //body - playerSkin[0][1] = new Sprite(new TextureRegion(charTexture, 0,13,12,12)); - playerSkin[0][1].flip(false,true); + playerSprite[0][1] = new Sprite(new TextureRegion(charTexture, 0,13,12,12)); + playerSprite[0][1].flip(false,true); //hand - playerSkin[0][2] = new Sprite(new TextureRegion(charTexture, 25,5,20,20)); - playerSkin[0][2].flip(false,true); + playerSprite[0][2] = new Sprite(new TextureRegion(charTexture, 25,5,20,20)); + playerSprite[0][2].flip(false,true); //leg - playerSkin[0][3] = new Sprite(new TextureRegion(charTexture, 25,27,20,20)); - playerSkin[0][3].flip(false,true); + playerSprite[0][3] = new Sprite(new TextureRegion(charTexture, 25,27,20,20)); + playerSprite[0][3].flip(false,true); //LOOK TO RIGHT //head - playerSkin[1][0] = new Sprite(new TextureRegion(charTexture, 13,0,12,12)); - playerSkin[1][0].flip(false,true); + playerSprite[1][0] = new Sprite(new TextureRegion(charTexture, 13,0,12,12)); + playerSprite[1][0].flip(false,true); //body - playerSkin[1][1] = new Sprite(new TextureRegion(charTexture, 13,13,12,12)); - playerSkin[1][1].flip(false,true); + playerSprite[1][1] = new Sprite(new TextureRegion(charTexture, 13,13,12,12)); + playerSprite[1][1].flip(false,true); //hand - playerSkin[1][2] = new Sprite(new TextureRegion(charTexture, 37,5,20,20)); - playerSkin[1][2].flip(false,true); + playerSprite[1][2] = new Sprite(new TextureRegion(charTexture, 37,5,20,20)); + playerSprite[1][2].flip(false,true); //leg - playerSkin[1][3] = new Sprite(new TextureRegion(charTexture, 37,27,20,20)); - playerSkin[1][3].flip(false,true); + playerSprite[1][3] = new Sprite(new TextureRegion(charTexture, 37,27,20,20)); + playerSprite[1][3].flip(false,true); + } + + private static void loadPig() { + pigTexture = new Texture(Gdx.files.internal("mobs/pig.png")); + pigSprite[0][0] = new Sprite(new TextureRegion(pigTexture, 0, 0, 25, 12)); + pigSprite[0][0].flip(false,true); + pigSprite[1][0] = new Sprite(new TextureRegion(pigTexture, 0, 12, 25, 12)); + pigSprite[1][0].flip(false,true); + pigSprite[0][1] = new Sprite(new TextureRegion(pigTexture, 4, 26, 12, 12)); + pigSprite[0][1].flip(false,true); + pigSprite[1][1] = new Sprite(new TextureRegion(pigTexture, 16, 26, 12, 12)); + pigSprite[1][1].flip(false,true); + } + + public static void load() { + minecraftFont = new BitmapFont(Gdx.files.internal("font.fnt"), true); + loadPlayer(); + loadPig(); shade = new Sprite(new Texture(Gdx.files.internal("shade.png"))); diff --git a/core/src/ru/deadsoftware/cavecraft/game/GamePhysics.java b/core/src/ru/deadsoftware/cavecraft/game/GamePhysics.java index 8e12e72..3bcbc9b 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/GamePhysics.java +++ b/core/src/ru/deadsoftware/cavecraft/game/GamePhysics.java @@ -131,7 +131,6 @@ public class GamePhysics { } public void update(float delta) { - for (Mob mob : gameProc.mobs) { mob.ai(); mobPhy(mob); diff --git a/core/src/ru/deadsoftware/cavecraft/game/GameProc.java b/core/src/ru/deadsoftware/cavecraft/game/GameProc.java index 47b3100..7ded79f 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/GameProc.java +++ b/core/src/ru/deadsoftware/cavecraft/game/GameProc.java @@ -6,8 +6,8 @@ import com.badlogic.gdx.math.RandomXS128; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.TimeUtils; import ru.deadsoftware.cavecraft.*; -import ru.deadsoftware.cavecraft.game.mobs.Human; import ru.deadsoftware.cavecraft.game.mobs.Mob; +import ru.deadsoftware.cavecraft.game.mobs.Pig; import ru.deadsoftware.cavecraft.game.objects.Player; public class GameProc { @@ -37,6 +37,9 @@ public class GameProc { physics = new GamePhysics(this); player = new Player(world.getSpawnPoint()); mobs = new Array(); + for (int i=0; i<1024/64; i++) { + mobs.add(new Pig(i*16*64, 0, world)); + } if (!CaveGame.TOUCH) ctrlMode = 1; } diff --git a/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java b/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java index 7eed8a7..d104b2f 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java +++ b/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java @@ -6,7 +6,6 @@ import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; -import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; import ru.deadsoftware.cavecraft.Assets; import ru.deadsoftware.cavecraft.CaveGame; @@ -108,47 +107,47 @@ public class GameRenderer { } private void drawPlayer(Player pl) { - if (!pl.moveX.equals(Vector2.Zero) || Assets.playerSkin[0][2].getRotation()!=0) { - Assets.playerSkin[0][2].rotate(Mob.ANIM_SPEED); - Assets.playerSkin[1][2].rotate(-Mob.ANIM_SPEED); - Assets.playerSkin[0][3].rotate(-Mob.ANIM_SPEED); - Assets.playerSkin[1][3].rotate(Mob.ANIM_SPEED); + if (!pl.moveX.equals(Vector2.Zero) || Assets.playerSprite[0][2].getRotation()!=0) { + Assets.playerSprite[0][2].rotate(Player.ANIM_SPEED); + Assets.playerSprite[1][2].rotate(-Player.ANIM_SPEED); + Assets.playerSprite[0][3].rotate(-Player.ANIM_SPEED); + Assets.playerSprite[1][3].rotate(Player.ANIM_SPEED); } else { - Assets.playerSkin[0][2].setRotation(0); - Assets.playerSkin[1][2].setRotation(0); - Assets.playerSkin[0][3].setRotation(0); - Assets.playerSkin[1][3].setRotation(0); + Assets.playerSprite[0][2].setRotation(0); + Assets.playerSprite[1][2].setRotation(0); + Assets.playerSprite[0][3].setRotation(0); + Assets.playerSprite[1][3].setRotation(0); } - if (Assets.playerSkin[0][2].getRotation()>=60 || Assets.playerSkin[0][2].getRotation()<=-60) - Mob.ANIM_SPEED = -Mob.ANIM_SPEED; + if (Assets.playerSprite[0][2].getRotation()>=60 || Assets.playerSprite[0][2].getRotation()<=-60) + Player.ANIM_SPEED = -Player.ANIM_SPEED; //back hand - Assets.playerSkin[1][2].setPosition( + Assets.playerSprite[1][2].setPosition( pl.position.x - camera.position.x - 6, pl.position.y - camera.position.y); - Assets.playerSkin[1][2].draw(spriteBatch); + Assets.playerSprite[1][2].draw(spriteBatch); //back leg - Assets.playerSkin[1][3].setPosition( + Assets.playerSprite[1][3].setPosition( pl.position.x - camera.position.x - 6, pl.position.y - camera.position.y + 10); - Assets.playerSkin[1][3].draw(spriteBatch); + Assets.playerSprite[1][3].draw(spriteBatch); //front leg - Assets.playerSkin[0][3].setPosition( + Assets.playerSprite[0][3].setPosition( pl.position.x - camera.position.x - 6, pl.position.y - camera.position.y + 10); - Assets.playerSkin[0][3].draw(spriteBatch); + Assets.playerSprite[0][3].draw(spriteBatch); //head - spriteBatch.draw(Assets.playerSkin[pl.dir][0], + spriteBatch.draw(Assets.playerSprite[pl.dir][0], pl.position.x - camera.position.x - 2, pl.position.y - camera.position.y - 2); //body - spriteBatch.draw(Assets.playerSkin[pl.dir][1], + spriteBatch.draw(Assets.playerSprite[pl.dir][1], pl.position.x - camera.position.x - 2, pl.position.y - camera.position.y + 8); //front hand - Assets.playerSkin[0][2].setPosition( + Assets.playerSprite[0][2].setPosition( pl.position.x - camera.position.x - 6, pl.position.y - camera.position.y); - Assets.playerSkin[0][2].draw(spriteBatch); + Assets.playerSprite[0][2].draw(spriteBatch); } private void drawCreative() { @@ -199,6 +198,7 @@ public class GameRenderer { private void drawGamePlay() { drawWorld(); + Mob.animateMobs(); for (Mob mob : gameProc.mobs) drawMob(mob); drawPlayer(gameProc.player); drawWorldForeground(); @@ -239,6 +239,7 @@ public class GameRenderer { drawString("X: "+(int)(gameProc.player.position.x/16), 0, 40); drawString("Y: "+(int)(gameProc.player.position.y/16), 0, 60); drawString("Seed: "+WorldGen.getSeed(), 0, 80); + drawString("Mobs: "+gameProc.mobs.size, 0, 100); fontBatch.end(); } diff --git a/core/src/ru/deadsoftware/cavecraft/game/mobs/Mob.java b/core/src/ru/deadsoftware/cavecraft/game/mobs/Mob.java index e0ff0e2..c52e78f 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/mobs/Mob.java +++ b/core/src/ru/deadsoftware/cavecraft/game/mobs/Mob.java @@ -3,16 +3,27 @@ package ru.deadsoftware.cavecraft.game.mobs; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Array; +import ru.deadsoftware.cavecraft.Assets; public abstract class Mob { public static int ANIM_SPEED = 6; - + public static int ANIMATION = 0; public Vector2 position; public Vector2 moveX, moveY; - public int width, height, dir, animation, anim_d; + public int width, height, dir; public boolean canJump; + public static void animateMobs() { + Assets.pigSprite[0][1].setRotation(ANIMATION); + Assets.pigSprite[1][1].setRotation(-ANIMATION); + ANIMATION+=ANIM_SPEED; + if (ANIMATION>=60 || ANIMATION<=-60) { + ANIM_SPEED = -ANIM_SPEED; + } + } + public abstract void ai(); public abstract void draw(SpriteBatch spriteBatch, float x, float y); public abstract Rectangle getRect(); diff --git a/core/src/ru/deadsoftware/cavecraft/game/mobs/Pig.java b/core/src/ru/deadsoftware/cavecraft/game/mobs/Pig.java new file mode 100644 index 0000000..0400be0 --- /dev/null +++ b/core/src/ru/deadsoftware/cavecraft/game/mobs/Pig.java @@ -0,0 +1,56 @@ +package ru.deadsoftware.cavecraft.game.mobs; + +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.math.Vector2; +import ru.deadsoftware.cavecraft.Assets; +import ru.deadsoftware.cavecraft.game.GameWorld; + +public class Pig extends Mob{ + + private GameWorld world; + + public Pig(int x, int y, GameWorld world) { + this.world = world; + position = new Vector2(x, y); + moveX = new Vector2(0, 0); + moveY = new Vector2(0, 0); + width = 25; + height = 18; + dir = 0; + canJump = false; + } + + @Override + public void ai() { + if (canJump && position.x>16 && position.x<(world.getWidth()-1)*16 && + world.getForeMap((int)(position.x/16)+(dir*2-1), (int)((position.y+height)/16))>0 && + world.getForeMap((int)(position.x/16)+(dir*2-1), (int)((position.y)/16))==0) + moveY.add(0, -8); + if (MathUtils.randomBoolean(.0001f)) dir++; + if (dir>1) dir = 0; + moveX.set(-1.5f+3*dir,0); + } + + @Override + public void draw(SpriteBatch spriteBatch, float x, float y) { + //back legs + Assets.pigSprite[1][1].setPosition(x-4+(9-dir*9),y+6); + Assets.pigSprite[1][1].draw(spriteBatch); + Assets.pigSprite[1][1].setPosition(x+17-(9*dir),y+6); + Assets.pigSprite[1][1].draw(spriteBatch); + //front legs + Assets.pigSprite[0][1].setPosition(x-4+(9-dir*9),y+6); + Assets.pigSprite[0][1].draw(spriteBatch); + Assets.pigSprite[0][1].setPosition(x+17-(9*dir),y+6); + Assets.pigSprite[0][1].draw(spriteBatch); + //head & body + spriteBatch.draw(Assets.pigSprite[dir][0], x, y); + } + + @Override + public Rectangle getRect() { + return new Rectangle(position.x, position.y, width, height); + } +} diff --git a/core/src/ru/deadsoftware/cavecraft/game/objects/Player.java b/core/src/ru/deadsoftware/cavecraft/game/objects/Player.java index 92c8171..415ed3d 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/objects/Player.java +++ b/core/src/ru/deadsoftware/cavecraft/game/objects/Player.java @@ -8,6 +8,8 @@ import ru.deadsoftware.cavecraft.game.WorldGen; public class Player { + public static int ANIM_SPEED = 6; + public Vector2 position; public Vector2 moveX, moveY; public int width, height, dir, texWidth; -- 2.29.2 From be2c0360e90fbeb3496e3960fe5aa1c30fd8926c Mon Sep 17 00:00:00 2001 From: fred-boy Date: Sat, 21 Apr 2018 00:25:51 +0700 Subject: [PATCH 11/16] Fix README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c7ee65b..ec43d0f 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Written in Java using libGDX framework.
### Android `./gradlew android:assemble`
### Desktop -`./gradlew desktop:assemble`
+`./gradlew desktop:dist`
*** On Windows, use `gradlew.bat` instead of `./gradlew` -- 2.29.2 From 20c99e213303aee769c1bf6320881badb524384f Mon Sep 17 00:00:00 2001 From: fred-boy Date: Sat, 21 Apr 2018 18:30:09 +0700 Subject: [PATCH 12/16] Fix water in the sky --- core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java | 6 ------ core/src/ru/deadsoftware/cavecraft/game/WorldGen.java | 6 +++--- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java b/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java index d104b2f..5a82102 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java +++ b/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java @@ -220,12 +220,6 @@ public class GameRenderer { } spriteBatch.end(); - shapeRenderer.begin(ShapeRenderer.ShapeType.Line); - shapeRenderer.setColor(Color.ORANGE); - shapeRenderer.line(0-camera.position.x, 128*16-camera.position.y, - gameProc.world.getWidth()*16-camera.position.x, 128*16-camera.position.y); - shapeRenderer.end(); - if (CaveGame.TOUCH) { spriteBatch.begin(); drawTouchGui(); diff --git a/core/src/ru/deadsoftware/cavecraft/game/WorldGen.java b/core/src/ru/deadsoftware/cavecraft/game/WorldGen.java index 48c8db8..32cb8f9 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/WorldGen.java +++ b/core/src/ru/deadsoftware/cavecraft/game/WorldGen.java @@ -81,9 +81,9 @@ public class WorldGen { } } for (int y = height-64; y2 && x Date: Sat, 21 Apr 2018 19:08:04 +0700 Subject: [PATCH 13/16] Fix bugs --- .../ru/deadsoftware/cavecraft/GameScreen.java | 5 +++ .../ru/deadsoftware/cavecraft/GameState.java | 1 + .../cavecraft/game/GameInputHandler.java | 41 +++++++++++-------- .../deadsoftware/cavecraft/game/GameProc.java | 4 +- .../cavecraft/game/GameRenderer.java | 2 +- .../cavecraft/game/GameWorld.java | 17 ++++++-- .../deadsoftware/cavecraft/game/WorldGen.java | 11 ++--- 7 files changed, 53 insertions(+), 28 deletions(-) diff --git a/core/src/ru/deadsoftware/cavecraft/GameScreen.java b/core/src/ru/deadsoftware/cavecraft/GameScreen.java index e1eea18..2a2c262 100644 --- a/core/src/ru/deadsoftware/cavecraft/GameScreen.java +++ b/core/src/ru/deadsoftware/cavecraft/GameScreen.java @@ -35,6 +35,11 @@ public class GameScreen implements Screen { @Override public void render(float delta) { + if (CaveGame.STATE == GameState.RESTART) { + gameProc = new GameProc(); + Gdx.input.setInputProcessor(new InputHandler(gameProc)); + CaveGame.STATE = GameState.GAME_PLAY; + } FPS = (int)(1/delta); gameProc.update(delta); gameProc.renderer.render(); diff --git a/core/src/ru/deadsoftware/cavecraft/GameState.java b/core/src/ru/deadsoftware/cavecraft/GameState.java index 9de340d..dd6b021 100644 --- a/core/src/ru/deadsoftware/cavecraft/GameState.java +++ b/core/src/ru/deadsoftware/cavecraft/GameState.java @@ -1,6 +1,7 @@ package ru.deadsoftware.cavecraft; public enum GameState { + RESTART, GAME_PLAY, GAME_CREATIVE_INV } diff --git a/core/src/ru/deadsoftware/cavecraft/game/GameInputHandler.java b/core/src/ru/deadsoftware/cavecraft/game/GameInputHandler.java index 89fba69..dc19afd 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/GameInputHandler.java +++ b/core/src/ru/deadsoftware/cavecraft/game/GameInputHandler.java @@ -13,9 +13,9 @@ public class GameInputHandler { this.gameProc = gameProc; } - private void wasdPressed(int keyCode) { + private void wasdPressed(int keycode) { if (gameProc.ctrlMode==0 || !CaveGame.TOUCH) { - switch (keyCode) { + switch (keycode) { case Input.Keys.A: gameProc.player.moveX.x = -GamePhysics.PL_SPEED; gameProc.player.dir = 0; @@ -26,7 +26,7 @@ public class GameInputHandler { break; } } else if (CaveGame.TOUCH){ - switch (keyCode) { + switch (keycode) { case Input.Keys.A: gameProc.cursorX--; break; @@ -43,11 +43,13 @@ public class GameInputHandler { } } - public void keyDown(int keyCode) { - if (keyCode == Input.Keys.W || keyCode == Input.Keys.A || - keyCode == Input.Keys.S || keyCode == Input.Keys.D) { - wasdPressed(keyCode); - } else switch (keyCode) { + public void keyDown(int keycode) { + gameProc.isKeyDown = true; + gameProc.keyDownCode = keycode; + if (keycode == Input.Keys.W || keycode == Input.Keys.A || + keycode == Input.Keys.S || keycode == Input.Keys.D) { + wasdPressed(keycode); + } else switch (keycode) { case Input.Keys.ALT_LEFT: if (CaveGame.TOUCH) { gameProc.ctrlMode++; @@ -74,11 +76,14 @@ public class GameInputHandler { if (CaveGame.STATE == GameState.GAME_PLAY) CaveGame.STATE = GameState.GAME_CREATIVE_INV; else CaveGame.STATE = GameState.GAME_PLAY; break; + + case Input.Keys.N: + CaveGame.STATE = GameState.RESTART; } } - public void keyUp(int keyCode) { - switch (keyCode) { + public void keyUp(int keycode) { + switch (keycode) { case Input.Keys.A: case Input.Keys.D: gameProc.player.moveX.x = 0; break; @@ -98,16 +103,14 @@ public class GameInputHandler { screenXgameProc.renderer.camera.viewportHeight/2-Assets.creativeInv.getRegionHeight()/2 && screenY= 0 && item < Items.BLOCKS.size) { for (int i = 8; i > 0; i--) { gameProc.player.inventory[i] = gameProc.player.inventory[i - 1]; } - if (item >= 0 && item < Items.BLOCKS.size) gameProc.player.inventory[0] = item; - } catch (Exception e) { - Gdx.app.error("GameInputHandler", e.toString()); + gameProc.player.inventory[0] = item; } } else if (CaveGame.STATE == GameState.GAME_CREATIVE_INV) { CaveGame.STATE = GameState.GAME_PLAY; @@ -121,6 +124,10 @@ public class GameInputHandler { } public void touchUp(int screenX, int screenY, int button) { + if (gameProc.isKeyDown) { + keyUp(gameProc.keyDownCode); + gameProc.isKeyDown = false; + } if (gameProc.isTouchDown) { if (button == Input.Buttons.RIGHT){ gameProc.world.placeToForeground(gameProc.cursorX, gameProc.cursorY, diff --git a/core/src/ru/deadsoftware/cavecraft/game/GameProc.java b/core/src/ru/deadsoftware/cavecraft/game/GameProc.java index 7ded79f..6a2bf04 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/GameProc.java +++ b/core/src/ru/deadsoftware/cavecraft/game/GameProc.java @@ -26,8 +26,8 @@ public class GameProc { public int invSlot; public int ctrlMode; - public boolean isTouchDown = false; - public int touchDownX, touchDownY; + public boolean isTouchDown, isKeyDown; + public int touchDownX, touchDownY, keyDownCode; public int touchDownButton; public long touchDownTime; diff --git a/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java b/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java index 5a82102..b8b5324 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java +++ b/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java @@ -231,7 +231,7 @@ public class GameRenderer { drawString("CaveCraft "+CaveGame.VERSION, 0, 0); drawString("FPS: "+GameScreen.FPS, 0, 20); drawString("X: "+(int)(gameProc.player.position.x/16), 0, 40); - drawString("Y: "+(int)(gameProc.player.position.y/16), 0, 60); + drawString("Y: "+(gameProc.world.getHeight()-(int)(gameProc.player.position.y/16)), 0, 60); drawString("Seed: "+WorldGen.getSeed(), 0, 80); drawString("Mobs: "+gameProc.mobs.size, 0, 100); fontBatch.end(); diff --git a/core/src/ru/deadsoftware/cavecraft/game/GameWorld.java b/core/src/ru/deadsoftware/cavecraft/game/GameWorld.java index c4655bf..e6b0b00 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/GameWorld.java +++ b/core/src/ru/deadsoftware/cavecraft/game/GameWorld.java @@ -3,6 +3,8 @@ package ru.deadsoftware.cavecraft.game; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.ArrayMap; +import ru.deadsoftware.cavecraft.CaveGame; +import ru.deadsoftware.cavecraft.GameState; import ru.deadsoftware.cavecraft.Items; public class GameWorld { @@ -84,13 +86,22 @@ public class GameWorld { while (!found) { for (int i = 0; i < getHeight(); i++) { if (getForeMap((int)x, i)>0 && - Items.BLOCKS.getValueAt(getForeMap((int)x, i)).collision) { - y = i-3; + Items.BLOCKS.getValueAt(getForeMap((int)x, i)).collision && + getForeMap((int)x, i-1)==0 && getForeMap((int)x, i-1)==0) { + y = i-2; found = true; break; } } - if (!found) x--; + if (!found) { + x--; + if (x<0) x=getWidth()-1; + if ((int)x == getWidth()/2+1) { + x--; + y=0; + break; + } + } } x = x*16 + 4; y *= 16; diff --git a/core/src/ru/deadsoftware/cavecraft/game/WorldGen.java b/core/src/ru/deadsoftware/cavecraft/game/WorldGen.java index 32cb8f9..954bdff 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/WorldGen.java +++ b/core/src/ru/deadsoftware/cavecraft/game/WorldGen.java @@ -54,16 +54,14 @@ public class WorldGen { genWorld(width, height, TimeUtils.millis()); } - static void genWorld(int width, int height, long s) { + static void genWorld(int width, int height, long worldseed) { int dirtH; - seed = s; + seed = worldseed; rand = new RandomXS128(seed); foreMap = new int[width][height]; backMap = new int[width][height]; hMap = genLandscape(width, height/4, height/8, height/2); for (int x=0; x2 && x Date: Sat, 21 Apr 2018 23:48:22 +0700 Subject: [PATCH 14/16] Ciclic worlds --- .../cavecraft/game/GamePhysics.java | 29 ++++----- .../deadsoftware/cavecraft/game/GameProc.java | 12 ++-- .../cavecraft/game/GameRenderer.java | 28 +++------ .../cavecraft/game/GameWorld.java | 61 +++++++++---------- .../deadsoftware/cavecraft/game/WorldGen.java | 8 ++- 5 files changed, 62 insertions(+), 76 deletions(-) diff --git a/core/src/ru/deadsoftware/cavecraft/game/GamePhysics.java b/core/src/ru/deadsoftware/cavecraft/game/GamePhysics.java index 3bcbc9b..2fdc29b 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/GamePhysics.java +++ b/core/src/ru/deadsoftware/cavecraft/game/GamePhysics.java @@ -1,6 +1,9 @@ package ru.deadsoftware.cavecraft.game; -import com.badlogic.gdx.math.*; +import com.badlogic.gdx.math.Intersector; +import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.math.Vector2; import ru.deadsoftware.cavecraft.CaveGame; import ru.deadsoftware.cavecraft.Items; import ru.deadsoftware.cavecraft.game.mobs.Mob; @@ -23,18 +26,18 @@ public class GamePhysics { int bl = 0; switch (dir) { case 0: - if ((int)((rect.x+(rect.width/2))/16) - 1>=0) - bl = gameProc.world.getForeMap( - (int)((rect.x+(rect.width/2))/16) - 1, - (int)(rect.y/16)+1); + bl = gameProc.world.getForeMap( + (int)((rect.x+(rect.width/2))/16) - 1, + (int)(rect.y/16)+1); if (gameProc.world.getForeMap((int)((rect.x+(rect.width/2))/16)-1,(int)(rect.y/16))>0) bl=0; + if (gameProc.world.getForeMap((int)((rect.x+(rect.width/2))/16)-1,(int)(rect.y/16)-1)>0) bl=0; break; case 1: - if ((int)((rect.x+(rect.width/2))/16) + 10) bl=0; + if (gameProc.world.getForeMap((int)((rect.x+(rect.width/2))/16)+1,(int)(rect.y/16)-1)>0) bl=0; break; default: bl=0; @@ -48,9 +51,7 @@ public class GamePhysics { int minY = (int) ((rect.y+rect.height/2)/16)-4; int maxX = (int) ((rect.x+rect.width/2)/16)+4; int maxY = (int) ((rect.y+rect.height/2)/16)+4; - if (minX<0) minX=0; if (minY<0) minY=0; - if (maxX>gameProc.world.getWidth()) maxX = gameProc.world.getWidth(); if (maxY>gameProc.world.getHeight()) maxY = gameProc.world.getHeight(); for (int y=minY; y=gameProc.world.getWidth()*16) - pl.position.sub(pl.moveX); if (checkColl(pl.getRect())) { if (pl.canJump && !pl.flyMode) pl.position.y-=8; if (checkColl(pl.getRect())) { @@ -119,9 +117,6 @@ public class GamePhysics { } mob.moveY.add(gravity); mob.position.add(mob.moveX); - if (mob.position.x<32 || - mob.position.x+mob.width>gameProc.world.getWidth()*16-32) - mob.position.sub(mob.moveX); if (checkColl(mob.getRect())) { int d = 0; if (mob.moveX.x<0) d=1; else if (mob.moveX.x>0) d=-1; diff --git a/core/src/ru/deadsoftware/cavecraft/game/GameProc.java b/core/src/ru/deadsoftware/cavecraft/game/GameProc.java index 6a2bf04..6c532ac 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/GameProc.java +++ b/core/src/ru/deadsoftware/cavecraft/game/GameProc.java @@ -2,7 +2,6 @@ package ru.deadsoftware.cavecraft.game; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; -import com.badlogic.gdx.math.RandomXS128; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.TimeUtils; import ru.deadsoftware.cavecraft.*; @@ -37,8 +36,8 @@ public class GameProc { physics = new GamePhysics(this); player = new Player(world.getSpawnPoint()); mobs = new Array(); - for (int i=0; i<1024/64; i++) { - mobs.add(new Pig(i*16*64, 0, world)); + for (int i=0; i= world.getWidth()) cursorX = world.getWidth()-1; if (cursorY < 0) cursorY = 0; if (cursorY >= world.getHeight()) cursorY = world.getHeight()-1; if (cursorX<(player.position.x+player.texWidth/2)/16) diff --git a/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java b/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java index b8b5324..9440938 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java +++ b/core/src/ru/deadsoftware/cavecraft/game/GameRenderer.java @@ -1,7 +1,6 @@ package ru.deadsoftware.cavecraft.game; import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.g2d.SpriteBatch; @@ -9,8 +8,8 @@ import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.math.Vector2; import ru.deadsoftware.cavecraft.Assets; import ru.deadsoftware.cavecraft.CaveGame; -import ru.deadsoftware.cavecraft.Items; import ru.deadsoftware.cavecraft.GameScreen; +import ru.deadsoftware.cavecraft.Items; import ru.deadsoftware.cavecraft.game.mobs.Mob; import ru.deadsoftware.cavecraft.game.objects.Player; @@ -53,22 +52,16 @@ public class GameRenderer { Assets.minecraftFont.draw(fontBatch, str, x, y); } - private void drawWorld() { - int minX = (int) (camera.position.x/16); - int minY = (int) (camera.position.y/16); + private void drawWorldBackground() { + int minX = (int) (camera.position.x/16)-1; + int minY = (int) (camera.position.y/16)-1; int maxX = (int) ((camera.position.x+camera.viewportWidth)/16)+1; int maxY = (int) ((camera.position.y+camera.viewportHeight)/16)+1; - if (minX<0) minX=0; if (minY<0) minY=0; - if (maxX>gameProc.world.getWidth()) maxX = gameProc.world.getWidth(); if (maxY>gameProc.world.getHeight()) maxY = gameProc.world.getHeight(); for (int y=minY; y0){/* && - !Items.BLOCKS.getValueAt(gameProc.world.getForeMap(x,y)).foreground) { - spriteBatch.draw( - Items.BLOCKS.getValueAt(gameProc.world.getForeMap(x,y)).getTexture(), - x * 16 - camera.position.x,y * 16 - camera.position.y);*/ + if (gameProc.world.getForeMap(x,y)>0){ } else if (gameProc.world.getBackMap(x,y)>0) { spriteBatch.draw( Items.BLOCKS.getValueAt(gameProc.world.getBackMap(x,y)).getTexture(), @@ -81,18 +74,15 @@ public class GameRenderer { } private void drawWorldForeground(){ - int minX = (int) (camera.position.x/16); - int minY = (int) (camera.position.y/16); + int minX = (int) (camera.position.x/16)-1; + int minY = (int) (camera.position.y/16)-1; int maxX = (int) ((camera.position.x+camera.viewportWidth)/16)+1; int maxY = (int) ((camera.position.y+camera.viewportHeight)/16)+1; - if (minX<0) minX=0; if (minY<0) minY=0; - if (maxX>gameProc.world.getWidth()) maxX = gameProc.world.getWidth(); if (maxY>gameProc.world.getHeight()) maxY = gameProc.world.getHeight(); for (int y=minY; y0) { /*&& - Items.BLOCKS.getValueAt(gameProc.world.getForeMap(x,y)).foreground) {*/ + if (gameProc.world.getForeMap(x,y)>0) { spriteBatch.draw( Items.BLOCKS.getValueAt(gameProc.world.getForeMap(x,y)).getTexture(), x * 16 - camera.position.x,y * 16 - camera.position.y); @@ -197,7 +187,7 @@ public class GameRenderer { } private void drawGamePlay() { - drawWorld(); + drawWorldBackground(); Mob.animateMobs(); for (Mob mob : gameProc.mobs) drawMob(mob); drawPlayer(gameProc.player); diff --git a/core/src/ru/deadsoftware/cavecraft/game/GameWorld.java b/core/src/ru/deadsoftware/cavecraft/game/GameWorld.java index e6b0b00..ab89dd7 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/GameWorld.java +++ b/core/src/ru/deadsoftware/cavecraft/game/GameWorld.java @@ -2,9 +2,6 @@ package ru.deadsoftware.cavecraft.game; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.math.Vector2; -import com.badlogic.gdx.utils.ArrayMap; -import ru.deadsoftware.cavecraft.CaveGame; -import ru.deadsoftware.cavecraft.GameState; import ru.deadsoftware.cavecraft.Items; public class GameWorld { @@ -32,17 +29,29 @@ public class GameWorld { } public int getForeMap(int x, int y) { - int ret = 0; + int map = 0; try { - ret = foreMap[x][y]; + if (x<0) { + x = x % (getWidth()-1)-1; + x = getWidth()- Math.abs(x); + } else if (x>0) { + x = x % (getWidth()-1)+1; + } + map = foreMap[x][y]; } catch (ArrayIndexOutOfBoundsException e) { Gdx.app.error("GameWorld",e.toString()); } - return ret; + return map; } public void setForeMap(int x, int y, int value) { try { + if (x<0) { + x = x % (getWidth()-1)-1; + x = getWidth()- Math.abs(x); + } else if (x>0) { + x = x % (getWidth()-1)+1; + } foreMap[x][y] = value; } catch (ArrayIndexOutOfBoundsException e) { Gdx.app.error("GameWorld", e.toString()); @@ -50,17 +59,29 @@ public class GameWorld { } public int getBackMap(int x, int y) { - int ret = 0; + int map = 0; try { - ret = backMap[x][y]; + if (x<0) { + x = x % (getWidth()-1)-1; + x = getWidth()- Math.abs(x); + } else if (x>0) { + x = x % (getWidth()-1)+1; + } + map = backMap[x][y]; } catch (ArrayIndexOutOfBoundsException e) { Gdx.app.error("GameWorld",e.toString()); } - return ret; + return map; } public void setBackMap(int x, int y, int value) { try { + if (x<0) { + x = x % (getWidth()-1)-1; + x = getWidth()- Math.abs(x); + } else if (x>0) { + x = x % (getWidth()-1)+1; + } backMap[x][y] = value; } catch (ArrayIndexOutOfBoundsException e) { Gdx.app.error("GameWorld", e.toString()); @@ -81,28 +102,6 @@ public class GameWorld { public Vector2 getSpawnPoint() { float x=0, y=0; - boolean found = false; - x = getWidth()/2; - while (!found) { - for (int i = 0; i < getHeight(); i++) { - if (getForeMap((int)x, i)>0 && - Items.BLOCKS.getValueAt(getForeMap((int)x, i)).collision && - getForeMap((int)x, i-1)==0 && getForeMap((int)x, i-1)==0) { - y = i-2; - found = true; - break; - } - } - if (!found) { - x--; - if (x<0) x=getWidth()-1; - if ((int)x == getWidth()/2+1) { - x--; - y=0; - break; - } - } - } x = x*16 + 4; y *= 16; return new Vector2(x,y); diff --git a/core/src/ru/deadsoftware/cavecraft/game/WorldGen.java b/core/src/ru/deadsoftware/cavecraft/game/WorldGen.java index 954bdff..ccbe50a 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/WorldGen.java +++ b/core/src/ru/deadsoftware/cavecraft/game/WorldGen.java @@ -1,8 +1,6 @@ package ru.deadsoftware.cavecraft.game; -import com.badlogic.gdx.Gdx; import com.badlogic.gdx.math.RandomXS128; -import com.badlogic.gdx.utils.ArrayMap; import com.badlogic.gdx.utils.TimeUtils; public class WorldGen { @@ -23,6 +21,10 @@ public class WorldGen { res[0] = mid; for (int i=1; iwidth-(max-min)) { + if (res[i-1]+tres[0]) t=-Math.abs(t); + } res[i] = res[i-1] + t; if (res[i]max) res[i] = max; @@ -60,7 +62,7 @@ public class WorldGen { rand = new RandomXS128(seed); foreMap = new int[width][height]; backMap = new int[width][height]; - hMap = genLandscape(width, height/4, height/8, height/2); + hMap = genLandscape(width, height/8*3, height/8, height/2); for (int x=0; x Date: Sun, 22 Apr 2018 00:24:32 +0700 Subject: [PATCH 15/16] Fix controls on Android --- .../cavecraft/game/GamePhysics.java | 1 + .../deadsoftware/cavecraft/game/GameProc.java | 42 +++++++++---------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/core/src/ru/deadsoftware/cavecraft/game/GamePhysics.java b/core/src/ru/deadsoftware/cavecraft/game/GamePhysics.java index 2fdc29b..b20575a 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/GamePhysics.java +++ b/core/src/ru/deadsoftware/cavecraft/game/GamePhysics.java @@ -24,6 +24,7 @@ public class GamePhysics { private boolean checkJump(Rectangle rect, int dir) { int bl = 0; + if (rect.x<0) rect.x-=16; switch (dir) { case 0: bl = gameProc.world.getForeMap( diff --git a/core/src/ru/deadsoftware/cavecraft/game/GameProc.java b/core/src/ru/deadsoftware/cavecraft/game/GameProc.java index 6c532ac..f3ea4ac 100644 --- a/core/src/ru/deadsoftware/cavecraft/game/GameProc.java +++ b/core/src/ru/deadsoftware/cavecraft/game/GameProc.java @@ -52,26 +52,22 @@ public class GameProc { } private void moveCursor() { - if (ctrlMode==0 && CaveGame.TOUCH) { - if (player.canJump) { - cursorX = (int) (player.position.x + player.texWidth / 2) / 16; - if (player.dir == 0) cursorX--; + if (ctrlMode == 0 && CaveGame.TOUCH) { + cursorX = (int) (player.position.x + player.texWidth / 2) / 16; + if (player.dir == 0) cursorX--; else cursorX++; - cursorY = (int) (player.position.y + player.texWidth) / 16; - if (!isAutoselectable(cursorX, cursorY)) { - cursorY++; - } - if (!isAutoselectable(cursorX, cursorY)) { - cursorY++; - } - if (!isAutoselectable(cursorX, cursorY)) { - if (player.dir == 0) cursorX++; - else cursorX--; - } - } else { - cursorX = (int) (player.position.x + player.texWidth / 2) / 16; - cursorY = (int) (player.position.y + player.height+8)/16; + cursorY = (int) (player.position.y + player.texWidth) / 16; + if (!isAutoselectable(cursorX, cursorY)) { + cursorY++; } + if (!isAutoselectable(cursorX, cursorY)) { + cursorY++; + } + if (!isAutoselectable(cursorX, cursorY)) { + if (player.dir == 0) cursorX++; + else cursorX--; + } + if (player.position.x<0) cursorX--; } else if (!CaveGame.TOUCH){ cursorX = (int)(Gdx.input.getX()* (renderer.camera.viewportWidth/GameScreen.getWidth())+renderer.camera.position.x)/16; @@ -86,10 +82,12 @@ public class GameProc { private void checkCursorBounds() { if (cursorY < 0) cursorY = 0; if (cursorY >= world.getHeight()) cursorY = world.getHeight()-1; - if (cursorX<(player.position.x+player.texWidth/2)/16) - player.dir=0; - if (cursorX>(player.position.x+player.texWidth/2)/16) - player.dir=1; + if (ctrlMode==1) { + if (cursorX*16+8player.position.x+player.texWidth/2) + player.dir=1; + } } public void update(float delta) { -- 2.29.2 From 7e901796f1eb536505728f34fca8c0ea5204cf24 Mon Sep 17 00:00:00 2001 From: fred-boy Date: Sun, 22 Apr 2018 00:29:56 +0700 Subject: [PATCH 16/16] Update version --- android/build.gradle | 4 ++-- build.gradle | 2 +- core/src/ru/deadsoftware/cavecraft/CaveGame.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 114e1b5..2b6fa39 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -21,8 +21,8 @@ android { applicationId "ru.deadsoftware.cavecraft" minSdkVersion 9 targetSdkVersion 20 - versionCode 1 - versionName "alpha0.1" + versionCode 2 + versionName "alpha0.2" } buildTypes { release { diff --git a/build.gradle b/build.gradle index 9d3557f..51e0e43 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ allprojects { apply plugin: "eclipse" apply plugin: "idea" - version = 'alpha0.1' + version = 'alpha0.2' ext { appName = "CaveCraft" gdxVersion = '1.9.7' diff --git a/core/src/ru/deadsoftware/cavecraft/CaveGame.java b/core/src/ru/deadsoftware/cavecraft/CaveGame.java index 57f560b..99e4f68 100644 --- a/core/src/ru/deadsoftware/cavecraft/CaveGame.java +++ b/core/src/ru/deadsoftware/cavecraft/CaveGame.java @@ -4,7 +4,7 @@ import com.badlogic.gdx.Game; public class CaveGame extends Game { - public static final String VERSION = "alpha 0.1"; + public static final String VERSION = "alpha 0.2"; public static GameState STATE; -- 2.29.2