diff --git a/core/src/com/dungeoncrawler/control/Controller.java b/core/src/com/dungeoncrawler/control/Controller.java index 9f6398d..7a9ac1b 100644 --- a/core/src/com/dungeoncrawler/control/Controller.java +++ b/core/src/com/dungeoncrawler/control/Controller.java @@ -103,143 +103,140 @@ public class Controller extends ApplicationAdapter implements InputProcessor{ entityMovement = new Timer(); entityMovement.scheduleTask(new Timer.Task() { - @Override - public void run() { - if(gs != null){ - //m.updateEntitySprite(d.getCurrentEntities()); - - for(int i = 0; i < d.getCurrentEntities().length; i++){ - if(d.getCurrentEntities()[i] != null){ - // Gets the collisions relevant sprites - MapObjects mapObjects = gs.getM().getMaps()[level][roomPosX][roomPosY].getMap().getLayers().get(0).getObjects(); - Rectangle playerSprite = gs.getPlayer().getCollisionSprite(); - - Entity temp = d.getCurrentEntities()[i]; - - int x = (int) temp.getxPos(); - int y = (int) temp.getyPos(); - - 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(); - } + @Override + public void run() { + + if(gs != null){ + + if(gs.player.getAttackState() == 2){ + playerAttack(d.getCurrentEntities(), d.getPlayer(), d.getPlayer().getDirection()); + } + + for(int i = 0; i < d.getCurrentEntities().length; i++){ + if(d.getCurrentEntities()[i] != null){ + // Gets the collisions relevant sprites + MapObjects mapObjects = gs.getM().getMaps()[level][roomPosX][roomPosY].getMap().getLayers().get(0).getObjects(); + Rectangle playerSprite = gs.getPlayer().getFullCollisionSprite(); + + Entity temp = d.getCurrentEntities()[i]; - EntitySprite tempObject = gs.entitySprites[i]; - tempObject.update((int) temp.getxPos(), (int) temp.getyPos()); + int x = (int) temp.getxPos(); + int y = (int) temp.getyPos(); - boolean overlaps = false; - boolean delete = false; - - if(d.getCurrentEntities()[i].getId() == 2){ - if(Intersector.overlaps(tempObject.getCollisionSprite(), gs.getPlayer().getFullCollisionSprite())){ - overlaps = true; - delete = true; + boolean attacks = d.getCurrentEntities()[i].move((int) d.getPlayer().getxPos(), (int) d.getPlayer().getyPos()); + + // Attacke wird gestartet, wenn noch keine laueft + if(attacks && gs.entitySprites[i].getAttackState() == 0){ + gs.entitySprites[i].startAttack(); + } + + EntitySprite tempObject = gs.entitySprites[i]; + tempObject.update((int) temp.getxPos(), (int) temp.getyPos()); + + boolean overlaps = false; + boolean delete = false; + + if(Intersector.overlaps(tempObject.getCollisionSprite(), playerSprite)){ + overlaps = true; + + if(d.getCurrentEntities()[i].getType() == 2){ + delete = true; + d.getCurrentEntities()[i].attack(d.getPlayer()); + } + else{ + if(d.getCurrentEntities()[i].getType() == 0){ + switch(gs.entitySprites[i].getAttackState()){ + case 0: + gs.entitySprites[i].startAttack(); + break; + case 1: + break; + case 2: d.getCurrentEntities()[i].attack(d.getPlayer()); - } + gs.entitySprites[i].resetAttackState(); + break; + default: } - else if(Intersector.overlaps(tempObject.getCollisionSprite(), playerSprite)){ - - overlaps = true; - if(d.getCurrentEntities()[i].getId() != 0){ - switch(gs.entitySprites[i].getAttackState()){ - case 0: - gs.entitySprites[i].startAttack(); - break; - case 1: - break; - case 2: - d.getCurrentEntities()[i].attack(d.getPlayer()); - gs.entitySprites[i].resetAttackState(); - break; - default: - } - } + } + } + } + else{ + for(RectangleMapObject rectangleObject : mapObjects.getByType(RectangleMapObject.class)){ + Rectangle rectangle = rectangleObject.getRectangle(); + + if(Intersector.overlaps(tempObject.getCollisionSprite(), rectangle)){ + overlaps = true; + + if(d.getCurrentEntities()[i].getType() == 2){ + delete = true; } - else{ - for(RectangleMapObject rectangleObject : mapObjects.getByType(RectangleMapObject.class)){ - Rectangle rectangle = rectangleObject.getRectangle(); - if(Intersector.overlaps(tempObject.getCollisionSprite(), rectangle)){ + break; + } + } + + if(d.getCurrentEntities()[i].getType() != 2){ + for(int j = 0; j < gs.entitySprites.length; j++){ + if(i != j){ + if(d.getCurrentEntities()[j] != null && d.getCurrentEntities()[j].getId() != 2){ + if(Intersector.overlaps(tempObject.getCollisionSprite(), gs.entitySprites[j].getCollisionSprite())){ + overlaps = true; - - if(d.getCurrentEntities()[i].getId() == 2){ - delete = true; - } - break; - } - } - - if(d.getCurrentEntities()[i].getId() != 2){ - for(int j = 0; j < gs.entitySprites.length; j++){ - if(i != j){ - if(d.getCurrentEntities()[j] != null && d.getCurrentEntities()[j].getId() != 2){ - if(Intersector.overlaps(tempObject.getCollisionSprite(), gs.entitySprites[j].getCollisionSprite())){ - - overlaps = true; - break; - } - } - } - } + } } - } - - if(gs.entitySprites[i].getAttackState() == 2 && d.getCurrentEntities()[i].getId() != 0){ - gs.entitySprites[i].resetAttackState(); - } - if(gs.player.getAttackState() == 2){ - playerAttack(d.getCurrentEntities(), d.getPlayer(), d.getPlayer().getDirection()); - } - if(overlaps){ - d.getCurrentEntities()[i].setxPos(x); - d.getCurrentEntities()[i].setyPos(y); + } + } - tempObject.update(x, y); - } + } - gs.entitySprites[i] = tempObject; - - 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()); - arrow.setxPos(d.getCurrentEntities()[i].getxPos() + 32); - arrow.setyPos(d.getCurrentEntities()[i].getyPos() + 32); - d.getCurrentEntities()[k] = arrow; - gs.generateNewEntitySprite(arrow, k); - gs.entitySprites[i].resetAttackState(); - break; - } - } - } - - if(delete || d.getCurrentEntities()[i].isToDelete()){ - if(d.getCurrentEntities()[i].getId() == 2){ - d.getCurrentEntities()[i] = null; - gs.deleteEntitySprite(i); - } - else{ - if(gs.entitySprites[i].getDie() == 0){ - gs.entitySprites[i].setDie(1); - } - else if(gs.entitySprites[i].getDie() == 2){ - //d.getCurrentEntities()[i] = null; - } - } - } - + if(gs.entitySprites[i].getAttackState() == 2 && d.getCurrentEntities()[i].getType() != 0){ + gs.entitySprites[i].resetAttackState(); + } + + if(overlaps){ + d.getCurrentEntities()[i].setxPos(x); + d.getCurrentEntities()[i].setyPos(y); + + tempObject.update(x, y); + } + + gs.entitySprites[i] = tempObject; + + if(d.getCurrentEntities()[i].getType()== 0 && gs.entitySprites[i].getAttackState() == 2){ + Entity arrow = d.getCurrentEntities()[i].shoot((int) d.getPlayer().getxPos(), (int) d.getPlayer().getyPos()); + + for(int k = 5; k < d.getCurrentEntities().length; k++){ + if(d.getCurrentEntities()[k] == null){ + d.getCurrentEntities()[k] = arrow; + gs.generateNewEntitySprite(arrow, k); + gs.entitySprites[i].resetAttackState(); + break; } - } - } + } + } + + if(delete || d.getCurrentEntities()[i].isToDelete()){ + if(d.getCurrentEntities()[i].getId() == 2){ + d.getCurrentEntities()[i] = null; + gs.deleteEntitySprite(i); + } + else{ + if(gs.entitySprites[i].getDie() == 0){ + gs.entitySprites[i].setDie(1); + } + else if(gs.entitySprites[i].getDie() == 2){ + //d.getCurrentEntities()[i] = null; + } + } + } } - },0, 0.03f); + } + } + } + },0, 0.03f); - - - } @@ -455,42 +452,23 @@ public class Controller extends ApplicationAdapter implements InputProcessor{ } else if(player.getAttackState() == 2){ - if(attackDirection== 0){ - Texture attackTexture = new Texture("sprites/AttackVert.png"); - Sprite attackSprite = new Sprite(attackTexture); - attackSprite.setX(p.getxPos() - 32f); - attackSprite.setY(p.getyPos() - 8f); - for(int i = 0; i < e.length ; i++){ - if(entitySprites[i] != null){ - if(Intersector.overlaps(entitySprites[i].getCollisionSprite(), attackSprite.getBoundingRectangle())){ - if(e[i] != null){ - if(e[i].getHp() - p.getDmg() <= 0){ - e[i].setToDelete(true); - } - else{ - e[i].setHp(e[i].getHp() - p.getDmg()); - } - } - } - } - } + Rectangle collision = new Rectangle(0, 0, gs.player.getCollisionSprite().getWidth(), gs.player.getFullCollisionSprite().getHeight()); + + if(attackDirection == 0){ + collision.setPosition(p.getxPos() - 32f, p.getyPos()); } else if(attackDirection== 1){ - Texture attackTexture = new Texture("sprites/AttackVert.png"); - Sprite attackSprite = new Sprite(attackTexture); - attackSprite.setX(p.getxPos()+ 32f); - attackSprite.setY(p.getyPos()- 2f); - for(int i = 0; i< e.length ; i++){ - if(entitySprites[i] != null){ - if(Intersector.overlaps(entitySprites[i].getCollisionSprite(), attackSprite.getBoundingRectangle())){ - if(e[i] != null){ - if(e[i].getHp() - p.getDmg() <= 0){ - e[i].setToDelete(true); - } - else{ - e[i].setHp(e[i].getHp() - p.getDmg()); - } - } + collision.setPosition(p.getxPos() + 32f, p.getyPos()); + } + + for(int i = 0; i < e.length ; i++){ + if(entitySprites[i] != null && e[i] != null){ + if(Intersector.overlaps(entitySprites[i].getCollisionSprite(), collision)){ + if(e[i].getHp() - p.getDmg() <= 0){ + e[i].setToDelete(true); + } + else{ + e[i].setHp(e[i].getHp() - p.getDmg()); } } } diff --git a/core/src/com/dungeoncrawler/model/DungeonGenerator.java b/core/src/com/dungeoncrawler/model/DungeonGenerator.java index e0403a5..2690983 100644 --- a/core/src/com/dungeoncrawler/model/DungeonGenerator.java +++ b/core/src/com/dungeoncrawler/model/DungeonGenerator.java @@ -298,6 +298,10 @@ public class DungeonGenerator { temp = new Swordsman(xPos, yPos, lvl); break; + case 2: + temp = new Wizard(xPos, yPos, lvl); + break; + default: temp = null; } diff --git a/core/src/com/dungeoncrawler/model/Entity.java b/core/src/com/dungeoncrawler/model/Entity.java index 372f7d1..9206a7c 100644 --- a/core/src/com/dungeoncrawler/model/Entity.java +++ b/core/src/com/dungeoncrawler/model/Entity.java @@ -11,6 +11,7 @@ public abstract class Entity { protected float movementX; protected float movementY; protected int id; + protected int type; protected int direction; protected Inventory inv; private boolean toDelete; @@ -177,5 +178,12 @@ public abstract class Entity { public void setToDelete(boolean toDelete) { this.toDelete = toDelete; } + + /** + * @return the type + */ + public int getType() { + return type; + } } \ 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 10e76f6..e24ca77 100644 --- a/core/src/com/dungeoncrawler/model/entities/Archer.java +++ b/core/src/com/dungeoncrawler/model/entities/Archer.java @@ -11,9 +11,10 @@ public class Archer extends Entity{ this.maxhp = 5*lvl; this.hp = this.maxhp; - this.direction = 2; + this.direction = 1; this.dmg = 3*lvl; this.id = 0; + this.type = 1; counter = 0; // TODO: Sinnvolle Werte finden @@ -113,7 +114,7 @@ public class Archer extends Entity{ alpha = 2*Math.PI - alpha; } } - a = new Arrow(this.xPos, this.yPos, this.lvl, 0); + a = new Arrow(this.xPos + 32, this.yPos + 32, this.lvl, 0); movementX = (int) (6 * Math.cos(alpha)); movementY = (int) (6 * Math.sin(alpha)); diff --git a/core/src/com/dungeoncrawler/model/entities/Arrow.java b/core/src/com/dungeoncrawler/model/entities/Arrow.java index d79e919..9374f04 100644 --- a/core/src/com/dungeoncrawler/model/entities/Arrow.java +++ b/core/src/com/dungeoncrawler/model/entities/Arrow.java @@ -21,6 +21,7 @@ public class Arrow extends Entity{ this.direction = direction; this.dmg = 3*lvl; this.id = 2; + type = 2; this.lifetime = 0; } diff --git a/core/src/com/dungeoncrawler/model/entities/Player.java b/core/src/com/dungeoncrawler/model/entities/Player.java index 9a42e0c..2aca959 100644 --- a/core/src/com/dungeoncrawler/model/entities/Player.java +++ b/core/src/com/dungeoncrawler/model/entities/Player.java @@ -27,6 +27,7 @@ public class Player extends Entity { this.dmg = 3*lvl; this.standartDmg = dmg; id = -1; + type = -1; inv = new Inventory(3,2); // TODO: Sinnvolle Werte finden diff --git a/core/src/com/dungeoncrawler/model/entities/Swordsman.java b/core/src/com/dungeoncrawler/model/entities/Swordsman.java index 586fa64..28cbb5e 100644 --- a/core/src/com/dungeoncrawler/model/entities/Swordsman.java +++ b/core/src/com/dungeoncrawler/model/entities/Swordsman.java @@ -9,9 +9,10 @@ public class Swordsman extends Entity { this.maxhp = 5*lvl; this.hp = this.maxhp; - this.direction = 2; + this.direction = 1; this.dmg = 3*lvl; this.id = 1; + this.type = 0; // TODO: Sinnvolle Werte finden direction = 2; diff --git a/core/src/com/dungeoncrawler/model/entities/Wizard.java b/core/src/com/dungeoncrawler/model/entities/Wizard.java new file mode 100644 index 0000000..8fd9ca4 --- /dev/null +++ b/core/src/com/dungeoncrawler/model/entities/Wizard.java @@ -0,0 +1,143 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.dungeoncrawler.model.entities; + +import com.dungeoncrawler.model.Entity; + +/** + * + * @author jonathan + */ +public class Wizard extends Entity{ + + int counter; + + public Wizard(float xPos, float yPos, int lvl) { + super(xPos, yPos, lvl); + + this.maxhp = 5*lvl; + this.hp = this.maxhp; + this.direction = 1; + this.dmg = 3*lvl; + this.id = 3; + this.type = 1; + counter = 0; + // TODO: Sinnvolle Werte finden + + direction = 1; + } + + @Override + public boolean move(int xPosPlayer, int yPosPlayer) { + if(!isToDelete()){ + 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; + } + } + + int distance = (int) Math.abs((deltaY / Math.sin(alpha))); + + if(distance >= 104 && distance <= 184 && counter % 40 == 0){ + return true; + } + else{ + movementX = (int) (3 * Math.cos(alpha)); + movementY = (int) (3 * Math.sin(alpha)); + + System.out.println(distance); + if(distance < 124){ + movementX *= -1; + movementY *= -1; + } + else if(distance >= 124 && distance <= 164){ + movementX = 0; + movementY = 0; + } + + + xPos += movementX; + yPos += movementY; + } + + if(alpha >= Math.PI / -2 && alpha <= Math.PI / 2){ + setDirection(1); + } + else{ + setDirection(0); + } + + counter++; + } + + return false; + } + + @Override + public Entity shoot(int xPosPlayer, int yPosPlayer){ + Arrow a = null; + + if(!isToDelete()){ + 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; + } + } + a = new Arrow(this.xPos + 32, this.yPos + 32, this.lvl, 0); + movementX = (int) (6 * Math.cos(alpha)); + movementY = (int) (6 * Math.sin(alpha)); + + a.setMovementX(movementX); + a.setMovementY(movementY); + a.setAngle(alpha); + + if((alpha >= 0 && alpha <= Math.PI / 2) || (alpha <= 2 * Math.PI && alpha >= 2 * Math.PI - Math.PI / 2)){ + setDirection(1); + } + else{ + setDirection(0); + } + } + + return a; + } +} diff --git a/core/src/com/dungeoncrawler/view/GameScreen.java b/core/src/com/dungeoncrawler/view/GameScreen.java index cfb12a6..2ab3396 100644 --- a/core/src/com/dungeoncrawler/view/GameScreen.java +++ b/core/src/com/dungeoncrawler/view/GameScreen.java @@ -249,17 +249,28 @@ public class GameScreen { public void generateNewEntitySprite(Entity e, int i){ if(e != null){ 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/arrow.png"); - entitySprites[i] = new EntitySprite(tx, 36, 15); + + //nimmt entity ID -> 0 = Archer || 1 = Swordsman || 2 = Arrow || 3 = Wizard + switch(e.getId()){ + case 0: + tx[0] = new Texture("sprites/archer.png"); + entitySprites[i] = new EntitySprite(tx, 64, 64); + break; + + case 1: + tx[0] = new Texture("sprites/swordsman.png"); + entitySprites[i] = new EntitySprite(tx, 64, 64); + break; + + case 2: + tx[0] = new Texture("sprites/arrow.png"); + entitySprites[i] = new EntitySprite(tx, 36, 15); + break; + + case 3: + tx[0] = new Texture("sprites/wizard.png"); + entitySprites[i] = new EntitySprite(tx, 64, 64); + break; } entitySprites[i].update((int) e.getxPos() + 32, (int) e.getyPos() + 32);