diff --git a/core/assets/sprites/arrow.png b/core/assets/sprites/arrow.png index e2ebc18..c837897 100644 Binary files a/core/assets/sprites/arrow.png and b/core/assets/sprites/arrow.png differ diff --git a/core/src/com/dungeoncrawler/control/Controller.java b/core/src/com/dungeoncrawler/control/Controller.java index 96a5a4e..c824691 100644 --- a/core/src/com/dungeoncrawler/control/Controller.java +++ b/core/src/com/dungeoncrawler/control/Controller.java @@ -117,8 +117,9 @@ public class Controller extends ApplicationAdapter implements InputProcessor{ int x = (int) temp.getxPos(); int y = (int) temp.getyPos(); - Entity arrow = d.getCurrentEntities()[i].move((int) d.getPlayer().getxPos(), (int) d.getPlayer().getyPos()); - if(arrow != null && gs.entitySprites[i].getAttackState() == 0){ + boolean attacks = d.getCurrentEntities()[i].move((int) d.getPlayer().getxPos(), (int) d.getPlayer().getyPos()); + + if(attacks && gs.entitySprites[i].getAttackState() == 0){ gs.entitySprites[i].startAttack(); } @@ -188,9 +189,10 @@ public class Controller extends ApplicationAdapter implements InputProcessor{ gs.entitySprites[i] = tempObject; - if(arrow != null && gs.entitySprites[i].getAttackState() == 2){ + if(d.getCurrentEntities()[i].getId() == 0 && gs.entitySprites[i].getAttackState() == 2){ for(int k = 5; k < d.getCurrentEntities().length; k++){ if(d.getCurrentEntities()[k] == null){ + Entity arrow = d.getCurrentEntities()[i].shoot((int) d.getPlayer().getxPos(), (int) d.getPlayer().getyPos()); d.getCurrentEntities()[k] = arrow; gs.generateNewEntitySprite(arrow, k); gs.entitySprites[i].resetAttackState(); diff --git a/core/src/com/dungeoncrawler/model/Entity.java b/core/src/com/dungeoncrawler/model/Entity.java index dd0d4de..abda571 100644 --- a/core/src/com/dungeoncrawler/model/Entity.java +++ b/core/src/com/dungeoncrawler/model/Entity.java @@ -18,6 +18,7 @@ public abstract class Entity { protected int direction; protected Inventory inv; protected boolean toDelete; + private double angle; @@ -39,6 +40,11 @@ public abstract class Entity { e.setHp(e.getHp() - this.dmg); } } + + public Entity shoot(int xPosPlayer, int yPosPlayer){ + return null; + } + public void update(){ xPos += movementX; yPos += movementY; @@ -56,12 +62,7 @@ public abstract class Entity { public void die(){ } - public void move(){ - xPos = xPos + movementX; - yPos = yPos + movementY; - movementX = 0; - movementY = 0; - } + abstract public boolean move(int xPosPlayer, int yPosPlayer); public void updateDirection(){ if(movementX > 1){ @@ -72,8 +73,6 @@ public abstract class Entity { } } - abstract public Entity move(int xPosPlayer, int yPosPlayer); - // GETTER + SETTER public float getxPos() { return xPos; @@ -154,5 +153,19 @@ public abstract class Entity { public boolean getToDelete(){ return this.toDelete; } + + /** + * @return the angle + */ + public double getAngle() { + return angle; + } + + /** + * @param angle the angle to set + */ + public void setAngle(double angle) { + this.angle = angle; + } } \ No newline at end of file diff --git a/core/src/com/dungeoncrawler/model/entities/Archer.java b/core/src/com/dungeoncrawler/model/entities/Archer.java index 1a9bf3a..bb1f123 100644 --- a/core/src/com/dungeoncrawler/model/entities/Archer.java +++ b/core/src/com/dungeoncrawler/model/entities/Archer.java @@ -22,7 +22,7 @@ public class Archer extends Entity{ } @Override - public Entity move(int xPosPlayer, int yPosPlayer) { + public boolean move(int xPosPlayer, int yPosPlayer) { float deltaX = xPosPlayer - (int) xPos; float deltaY = yPosPlayer - (int) yPos; @@ -49,15 +49,8 @@ public class Archer extends Entity{ int distance = (int) Math.abs((deltaY / Math.sin(alpha))); - Arrow a = null; if(distance >= 104 && distance <= 184 && counter % 40 == 0){ - a = new Arrow(this.xPos, this.yPos, this.lvl, 0); - - movementX = (int) (4 * Math.cos(alpha)); - movementY = (int) (4 * Math.sin(alpha)); - - a.setMovementX(movementX); - a.setMovementY(movementY); + return true; } else{ movementX = (int) (3 * Math.cos(alpha)); @@ -79,9 +72,45 @@ public class Archer extends Entity{ } counter++; - return a; + + return false; } - + @Override + public Entity shoot(int xPosPlayer, int yPosPlayer){ + + float deltaX = xPosPlayer - (int) xPos; + float deltaY = yPosPlayer - (int) yPos; + + double alpha; + if(deltaX == 0 && deltaY >= 0){ + alpha = Math.PI / 2; + } + else if(deltaX == 0 && deltaY < 0){ + alpha = Math.PI / -2; + } + else{ + alpha = Math.abs(Math.atan(deltaY / deltaX)); + + if(deltaX < 0 && deltaY < 0){ + alpha = Math.PI + alpha; + } + else if(deltaX < 0 && deltaY > 0){ + alpha = Math.PI - alpha; + } + else if(deltaX > 0 && deltaY < 0){ + alpha = 2*Math.PI - alpha; + } + } + Arrow a = new Arrow(this.xPos, this.yPos, this.lvl, 0); + movementX = (int) (5 * Math.cos(alpha)); + movementY = (int) (5 * Math.sin(alpha)); + + a.setMovementX(movementX); + a.setMovementY(movementY); + a.setAngle(alpha); + + return a; + } } diff --git a/core/src/com/dungeoncrawler/model/entities/Arrow.java b/core/src/com/dungeoncrawler/model/entities/Arrow.java index 5b4b8c6..a8973bf 100644 --- a/core/src/com/dungeoncrawler/model/entities/Arrow.java +++ b/core/src/com/dungeoncrawler/model/entities/Arrow.java @@ -32,7 +32,7 @@ public class Arrow extends Entity{ } @Override - public Entity move(int xPosPlayer, int yPosPlayer) { + public boolean move(int xPosPlayer, int yPosPlayer) { lifetime++; xPos += movementX; @@ -42,6 +42,6 @@ public class Arrow extends Entity{ this.toDelete = true; } - return null; + return false; } } diff --git a/core/src/com/dungeoncrawler/model/entities/Player.java b/core/src/com/dungeoncrawler/model/entities/Player.java index 691265a..9a42e0c 100644 --- a/core/src/com/dungeoncrawler/model/entities/Player.java +++ b/core/src/com/dungeoncrawler/model/entities/Player.java @@ -50,8 +50,8 @@ public class Player extends Entity { } } - public Entity move(int x, int y){ - return null; + public boolean move(int x, int y){ + return false; } diff --git a/core/src/com/dungeoncrawler/model/entities/Swordsman.java b/core/src/com/dungeoncrawler/model/entities/Swordsman.java index 23cbb9d..9b2b982 100644 --- a/core/src/com/dungeoncrawler/model/entities/Swordsman.java +++ b/core/src/com/dungeoncrawler/model/entities/Swordsman.java @@ -18,7 +18,7 @@ public class Swordsman extends Entity { } @Override - public Entity move(int xPosPlayer, int yPosPlayer){ + public boolean move(int xPosPlayer, int yPosPlayer){ float deltaX = xPosPlayer - (int) xPos; float deltaY = yPosPlayer - (int) yPos; @@ -49,8 +49,7 @@ public class Swordsman extends Entity { xPos += movementX; yPos += movementY; - System.out.println("Winkel: " + Math.toDegrees(alpha)); - return null; + return false; } diff --git a/core/src/com/dungeoncrawler/view/EntitySprite.java b/core/src/com/dungeoncrawler/view/EntitySprite.java index 234a7a2..d68f2a9 100644 --- a/core/src/com/dungeoncrawler/view/EntitySprite.java +++ b/core/src/com/dungeoncrawler/view/EntitySprite.java @@ -27,7 +27,7 @@ public class EntitySprite { // 0: links, 1: rechts private int direction; - public EntitySprite(Texture[] textures){ + public EntitySprite(Texture[] textures, int width, int height){ sprites = new Sprite[1]; regions = new TextureRegion[1][][]; @@ -36,12 +36,12 @@ public class EntitySprite { direction = 0; attackState = 0; - for(int i = 0; i < regions.length; i++){ - regions[i] = TextureRegion.split(textures[i], 64, 64); + for(int i = 0; i < sprites.length; i++){ + regions[i] = TextureRegion.split(textures[i], width, height); sprites[i] = new Sprite(regions[i][0][0]); + collisionSprite = new Rectangle(0, 0, 32, 16); } - - collisionSprite = new Rectangle(0, 0, 32, 16); + fullCollisionSprite = sprites[0].getBoundingRectangle(); } @@ -84,7 +84,7 @@ public class EntitySprite { frames[0]++; } - sprites[0].setRegion(regions[0][0][frames[0]]); + sprites[0].setRegion(regions[0][2][frames[0]]); updateFlip(); } @@ -99,7 +99,7 @@ public class EntitySprite { frames[1]++; } - sprites[0].setRegion(regions[0][2][frames[1]]); + sprites[0].setRegion(regions[0][0][frames[1]]); updateFlip(); } diff --git a/core/src/com/dungeoncrawler/view/GameScreen.java b/core/src/com/dungeoncrawler/view/GameScreen.java index 0db65cf..f9afcf9 100644 --- a/core/src/com/dungeoncrawler/view/GameScreen.java +++ b/core/src/com/dungeoncrawler/view/GameScreen.java @@ -83,7 +83,7 @@ public class GameScreen { playerTexture[2] = new Texture(Gdx.files.internal("sprites/player.png")); playerTexture[3] = new Texture(Gdx.files.internal("sprites/player.png")); - player = new EntitySprite(playerTexture); + player = new EntitySprite(playerTexture, 64, 64); player.update(200, 200); @@ -279,16 +279,22 @@ public class GameScreen { Texture[] tx = new Texture[1]; if(e.getId() == 0){ //nimmt entity ID -> 0 = Archer || 1 = Swordsman || 2 = Arrow tx[0] = new Texture("sprites/archer.png"); + entitySprites[i] = new EntitySprite(tx, 64, 64); } if(e.getId() == 1){ tx[0] = new Texture("sprites/swordsman.png"); + entitySprites[i] = new EntitySprite(tx, 64, 64); } if(e.getId() == 2){ - tx[0] = new Texture("sprites/player.png"); + tx[0] = new Texture("sprites/arrow.png"); + entitySprites[i] = new EntitySprite(tx, 18, 9); } - entitySprites[i] = new EntitySprite(tx); entitySprites[i].update((int) e.getxPos(), (int) e.getyPos()); + + if(e.getId() == 2){ + entitySprites[i].getSprites()[0].setRotation((float) Math.toDegrees(e.getAngle() + Math.PI)); + } } }