diff --git a/core/src/com/dungeoncrawler/StaticMath.java b/core/src/com/dungeoncrawler/StaticMath.java new file mode 100644 index 0000000..6dd36e1 --- /dev/null +++ b/core/src/com/dungeoncrawler/StaticMath.java @@ -0,0 +1,57 @@ +/* + * 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; + +/** + * + * @author jonathan + */ +public class StaticMath { + + public static double calculateAngle(int xPos1, int yPos1, int xPos2, int yPos2){ + float deltaX = xPos2 - xPos1; + float deltaY = yPos2 - yPos1; + + double alpha; + if(deltaY == 0){ + if(deltaX < 0){ + alpha = Math.PI; + } + else{ + alpha = 0; + } + } + else 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; + } + } + + return alpha; + } + + public static double calculateDistance(int xPos1, int yPos1, int xPos2, int yPos2, double angle){ + float deltaX = xPos2 - xPos1; + float deltaY = yPos2 - yPos1; + + double distance = Math.abs((deltaY / Math.sin(angle))); + return distance; + } +} diff --git a/core/src/com/dungeoncrawler/control/Controller.java b/core/src/com/dungeoncrawler/control/Controller.java index aae5459..4cc01eb 100644 --- a/core/src/com/dungeoncrawler/control/Controller.java +++ b/core/src/com/dungeoncrawler/control/Controller.java @@ -113,6 +113,7 @@ public class Controller extends ApplicationAdapter implements InputProcessor{ } 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(); @@ -136,7 +137,7 @@ public class Controller extends ApplicationAdapter implements InputProcessor{ boolean overlaps = false; boolean delete = false; - if(Intersector.overlaps(tempObject.getCollisionSprite(), playerSprite)){ + if(Intersector.overlaps(tempObject.getCollisionSprite(), playerSprite) && temp.isTargetsPlayer()){ overlaps = true; if(d.getCurrentEntities()[i].getType() == 2 && d.getCurrentEntities()[i].isTargetsPlayer()){ @@ -161,6 +162,7 @@ public class Controller extends ApplicationAdapter implements InputProcessor{ } } else{ + for(RectangleMapObject rectangleObject : mapObjects.getByType(RectangleMapObject.class)){ Rectangle rectangle = rectangleObject.getRectangle(); @@ -178,7 +180,7 @@ public class Controller extends ApplicationAdapter implements InputProcessor{ 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(d.getCurrentEntities()[j] != null && d.getCurrentEntities()[j].getType() != 2 && !d.getCurrentEntities()[j].isToDelete()){ if(Intersector.overlaps(tempObject.getCollisionSprite(), gs.entitySprites[j].getCollisionSprite())){ overlaps = true; break; @@ -187,9 +189,26 @@ public class Controller extends ApplicationAdapter implements InputProcessor{ } } } - } - + + if(temp.getType() == 2 && !temp.isTargetsPlayer()){ + for(int j = 0; j < gs.entitySprites.length; j++){ + if(i != j){ + if(d.getCurrentEntities()[j] != null && d.getCurrentEntities()[j].getType() != 2){ + if(Intersector.overlaps(tempObject.getFullCollisionSprite(), gs.entitySprites[j].getFullCollisionSprite())){ + delete = true; + boolean isDead = d.getCurrentEntities()[i].attack(d.getCurrentEntities()[j]); + if(isDead){ + gs.entitySprites[j].setDie(1); + d.getCurrentEntities()[j].setToDelete(true); + } + break; + } + } + } + } + } + if(d.getCurrentEntities()[i].getType() == 1 && gs.entitySprites[i].getAttackState() == 2){ Entity arrow = d.getCurrentEntities()[i].shoot((int) d.getPlayer().getxPos(), (int) d.getPlayer().getyPos()); @@ -571,9 +590,10 @@ public class Controller extends ApplicationAdapter implements InputProcessor{ Entity lol = d.getPlayer().shoot((int) d.getPlayer().getxPos() - 1, (int) d.getPlayer().getyPos()); for(int k = 5; k < d.getCurrentEntities().length; k++){ - if(d.getCurrentEntities()[k] == null){ + if(d.getCurrentEntities()[k] == null && gs.player.getSecondaryAttackState() != 1){ d.getCurrentEntities()[k] = lol; gs.generateNewEntitySprite(lol, k); + gs.player.startSecondaryAttack(); break; } } @@ -586,9 +606,10 @@ public class Controller extends ApplicationAdapter implements InputProcessor{ Entity lol = d.getPlayer().shoot((int) d.getPlayer().getxPos(), (int) d.getPlayer().getyPos() + 1); for(int k = 5; k < d.getCurrentEntities().length; k++){ - if(d.getCurrentEntities()[k] == null){ + if(d.getCurrentEntities()[k] == null && gs.player.getSecondaryAttackState() != 1){ d.getCurrentEntities()[k] = lol; gs.generateNewEntitySprite(lol, k); + gs.player.startSecondaryAttack(); break; } } @@ -600,9 +621,10 @@ public class Controller extends ApplicationAdapter implements InputProcessor{ Entity lol = d.getPlayer().shoot((int) d.getPlayer().getxPos() + 1, (int) d.getPlayer().getyPos()); for(int k = 5; k < d.getCurrentEntities().length; k++){ - if(d.getCurrentEntities()[k] == null){ + if(d.getCurrentEntities()[k] == null && gs.player.getSecondaryAttackState() != 1){ d.getCurrentEntities()[k] = lol; gs.generateNewEntitySprite(lol, k); + gs.player.startSecondaryAttack(); break; } } @@ -614,9 +636,10 @@ public class Controller extends ApplicationAdapter implements InputProcessor{ Entity lol = d.getPlayer().shoot((int) d.getPlayer().getxPos(), (int) d.getPlayer().getyPos() - 1); for(int k = 5; k < d.getCurrentEntities().length; k++){ - if(d.getCurrentEntities()[k] == null){ + if(d.getCurrentEntities()[k] == null && gs.player.getSecondaryAttackState() != 1){ d.getCurrentEntities()[k] = lol; gs.generateNewEntitySprite(lol, k); + gs.player.startSecondaryAttack(); break; } } diff --git a/core/src/com/dungeoncrawler/model/Entity.java b/core/src/com/dungeoncrawler/model/Entity.java index 97660e9..88081c8 100644 --- a/core/src/com/dungeoncrawler/model/Entity.java +++ b/core/src/com/dungeoncrawler/model/Entity.java @@ -31,12 +31,14 @@ public abstract class Entity { this.targetsPlayer = true; } - public void attack(Entity e){ + public boolean attack(Entity e){ if(e.getHp() - this.dmg < 0){ e.setHp(1); + return true; } else{ e.setHp(e.getHp() - this.dmg); + return false; } } diff --git a/core/src/com/dungeoncrawler/model/entities/Archer.java b/core/src/com/dungeoncrawler/model/entities/Archer.java index 3e0b9ce..d500a15 100644 --- a/core/src/com/dungeoncrawler/model/entities/Archer.java +++ b/core/src/com/dungeoncrawler/model/entities/Archer.java @@ -1,5 +1,6 @@ package com.dungeoncrawler.model.entities; +import com.dungeoncrawler.StaticMath; import com.dungeoncrawler.model.Entity; public class Archer extends Entity{ @@ -25,31 +26,9 @@ public class Archer extends Entity{ @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))); + + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + int distance = (int) StaticMath.calculateDistance((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer, alpha); if(distance >= 104 && distance <= 184 && counter % 40 == 0){ return true; @@ -91,35 +70,14 @@ public class Archer extends Entity{ Projectile 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; - } - } + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + a = new Projectile(this.xPos + 32, this.yPos + 32, this.lvl, 2, true); - movementX = (int) (6 * Math.cos(alpha)); - movementY = (int) (6 * Math.sin(alpha)); + int tempX = (int) (6 * Math.cos(alpha)); + int tempY = (int) (6 * Math.sin(alpha)); - a.setMovementX(movementX); - a.setMovementY(movementY); + a.setMovementX(tempX); + a.setMovementY(tempY); a.setAngle(alpha); if((alpha >= 0 && alpha <= Math.PI / 2) || (alpha <= 2 * Math.PI && alpha >= 2 * Math.PI - Math.PI / 2)){ diff --git a/core/src/com/dungeoncrawler/model/entities/Player.java b/core/src/com/dungeoncrawler/model/entities/Player.java index 30c01e7..da2aa8b 100644 --- a/core/src/com/dungeoncrawler/model/entities/Player.java +++ b/core/src/com/dungeoncrawler/model/entities/Player.java @@ -5,6 +5,7 @@ */ package com.dungeoncrawler.model.entities; +import com.dungeoncrawler.StaticMath; import com.dungeoncrawler.model.Entity; import com.dungeoncrawler.model.Inventory; import com.dungeoncrawler.model.Item; @@ -20,9 +21,9 @@ public class Player extends Entity { public Player() { super(200, 200, 1); - this.maxhp = 20 * (lvl + 1); + this.maxhp = 20 * lvl; this.hp = this.maxhp; - this.standartMaxHp = 5 * (lvl + 1); + this.standartMaxHp = 5 * lvl; this.dmg = 3*lvl; this.standartDmg = dmg; @@ -61,40 +62,11 @@ public class Player extends Entity { Projectile a = null; if(!isToDelete()){ - float deltaX = xPosPlayer - (int) xPos; - float deltaY = yPosPlayer - (int) yPos; - - double alpha; - if(deltaY == 0){ - if(deltaX < 0){ - alpha = Math.PI; - } - else{ - alpha = 0; - } - } - else 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 Projectile(this.xPos + 32, this.yPos + 32, this.lvl, 2, false); - int tempMovementX = (int) (6 * Math.cos(alpha)); - int tempMovementY = (int) (6 * Math.sin(alpha)); + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + + a = new Projectile(this.xPos + 32, this.yPos + 32, this.lvl, 5, false); + int tempMovementX = (int) (8 * Math.cos(alpha)); + int tempMovementY = (int) (8 * Math.sin(alpha)); a.setMovementX(tempMovementX); a.setMovementY(tempMovementY); diff --git a/core/src/com/dungeoncrawler/model/entities/Swordsman.java b/core/src/com/dungeoncrawler/model/entities/Swordsman.java index 28cbb5e..2a6543d 100644 --- a/core/src/com/dungeoncrawler/model/entities/Swordsman.java +++ b/core/src/com/dungeoncrawler/model/entities/Swordsman.java @@ -1,5 +1,6 @@ package com.dungeoncrawler.model.entities; +import com.dungeoncrawler.StaticMath; import com.dungeoncrawler.model.Entity; public class Swordsman extends Entity { @@ -21,29 +22,7 @@ public class Swordsman extends Entity { @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; - } - } + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); movementX = (int) (3 * Math.cos(alpha)); movementY = (int) (3 * Math.sin(alpha)); diff --git a/core/src/com/dungeoncrawler/model/entities/Wizard.java b/core/src/com/dungeoncrawler/model/entities/Wizard.java index e0a154f..1b91806 100644 --- a/core/src/com/dungeoncrawler/model/entities/Wizard.java +++ b/core/src/com/dungeoncrawler/model/entities/Wizard.java @@ -5,6 +5,7 @@ */ package com.dungeoncrawler.model.entities; +import com.dungeoncrawler.StaticMath; import com.dungeoncrawler.model.Entity; /** @@ -33,31 +34,9 @@ public class Wizard extends Entity{ @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))); + + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + int distance = (int) StaticMath.calculateDistance((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer, alpha); if(distance >= 104 && distance <= 184 && counter % 40 == 0){ return true; @@ -99,35 +78,14 @@ public class Wizard extends Entity{ Projectile 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; - } - } + double alpha = StaticMath.calculateAngle((int) this.xPos, (int) this.yPos, xPosPlayer, yPosPlayer); + a = new Projectile(this.xPos + 32, this.yPos + 32, this.lvl, 4, true); - movementX = (int) (6 * Math.cos(alpha)); - movementY = (int) (6 * Math.sin(alpha)); + int tempX = (int) (6 * Math.cos(alpha)); + int tempY = (int) (6 * Math.sin(alpha)); - a.setMovementX(movementX); - a.setMovementY(movementY); + a.setMovementX(tempX); + a.setMovementY(tempY); a.setAngle(alpha); if((alpha >= 0 && alpha <= Math.PI / 2) || (alpha <= 2 * Math.PI && alpha >= 2 * Math.PI - Math.PI / 2)){ diff --git a/core/src/com/dungeoncrawler/view/EntitySprite.java b/core/src/com/dungeoncrawler/view/EntitySprite.java index 77e2608..38b23ee 100644 --- a/core/src/com/dungeoncrawler/view/EntitySprite.java +++ b/core/src/com/dungeoncrawler/view/EntitySprite.java @@ -24,6 +24,7 @@ public class EntitySprite implements Comparable { private TextureRegion[][][] regions; private int[] frames; private int attackState; + private int secondaryAttackState; private int die; // 0: links, 1: rechts @@ -33,19 +34,20 @@ public class EntitySprite implements Comparable { sprites = new Sprite[1]; regions = new TextureRegion[1][][]; - // 0: idle, 1: walking, 2: attack, 3: die - frames = new int[4]; + // 0: idle, 1: walking, 2: attack, 3: die, 4: secondaryAttack + frames = new int[5]; direction = 0; attackState = 0; + secondaryAttackState = 0; die = 0; 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, sprites[0].getWidth() / 2, sprites[0].getHeight() / 4); } - this.fullCollisionSprite = new Rectangle(0,0,32,64); + this.fullCollisionSprite = new Rectangle(0, 0, collisionSprite.getWidth(), sprites[0].getHeight()); } public void updateAnimation(Entity e){ @@ -62,6 +64,9 @@ public class EntitySprite implements Comparable { else if(attackState == 1){ updateAttack(); } + else if(secondaryAttackState == 1){ + updateSecondaryAttack(); + } else if(moves){ updateWalking(); } @@ -89,6 +94,7 @@ public class EntitySprite implements Comparable { public void updateAttack(){ frames[0] = 0; frames[1] = 0; + frames[4] = 0; if(frames[2] >= 6){ frames[2] = 0; @@ -102,11 +108,27 @@ public class EntitySprite implements Comparable { } } - + public void updateSecondaryAttack(){ + frames[0] = 0; + frames[1] = 0; + frames[2] = 0; + + if(frames[4] >= 3){ + frames[4] = 0; + secondaryAttackState = 2; + } + else{ + frames[4]++; + + sprites[0].setRegion(regions[0][1][frames[4]]); + updateFlip(); + } + } public void updateIdle(){ frames[1] = 0; frames[2] = 0; + frames[4] = 0; if(frames[0] >= 9){ frames[0] = 0; @@ -122,6 +144,7 @@ public class EntitySprite implements Comparable { public void updateWalking(){ frames[0] = 0; frames[2] = 0; + frames[4] = 0; if(frames[1] >= 9){ frames[1] = 0; @@ -146,7 +169,7 @@ public class EntitySprite implements Comparable { public void update(int xPos, int yPos){ for(int i = 0; i < sprites.length; i++){ - sprites[i].setPosition(xPos - 16, yPos); + sprites[i].setPosition(xPos - sprites[0].getWidth() / 4, yPos); } updateCollision(xPos, yPos); @@ -253,6 +276,19 @@ public class EntitySprite implements Comparable { public void startAttack(){ this.attackState = 1; } + + public int getSecondaryAttackState(){ + return this.secondaryAttackState; + } + + public void resetSecondaryAttackState(){ + this.secondaryAttackState = 0; + frames[4] = 0; + } + + public void startSecondaryAttack(){ + this.secondaryAttackState = 1; + } /** * @return the die diff --git a/core/src/com/dungeoncrawler/view/GameScreen.java b/core/src/com/dungeoncrawler/view/GameScreen.java index edcf030..edf3203 100644 --- a/core/src/com/dungeoncrawler/view/GameScreen.java +++ b/core/src/com/dungeoncrawler/view/GameScreen.java @@ -287,6 +287,11 @@ public class GameScreen { tx[0] = new Texture("sprites/spell.png"); entitySprites[i] = new EntitySprite(tx, 16, 16); break; + + case 5: + tx[0] = new Texture("sprites/laser.png"); + entitySprites[i] = new EntitySprite(tx, 36, 15); + break; } entitySprites[i].update((int) e.getxPos() + 32, (int) e.getyPos() + 32);