Skip to content

Commit

Permalink
refactored explosion logic
Browse files Browse the repository at this point in the history
added second player to game
added damage logic for players
added death and respawn logic
  • Loading branch information
awdng committed Jun 8, 2018
1 parent fbc865e commit 19d0136
Show file tree
Hide file tree
Showing 7 changed files with 165 additions and 73 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,25 +25,43 @@ public class GameViewController implements Initializable {
public void initialize(URL url, ResourceBundle rb) {
Game game = Game.getInstance();
game.Initialize(GameBoard);
Player localPlayer = game.getLocalPlayer();
Player player1 = game.getField().getPlayers().get(0);
Player player2 = game.getField().getPlayers().get(1);

GameBoard.setFocusTraversable(true);

GameBoard.setOnKeyPressed(event -> {
switch (event.getCode()) {
case LEFT:
localPlayer.setMovement(Movement.LEFT);
player1.setMovement(Movement.LEFT);
break;
case RIGHT:
localPlayer.setMovement(Movement.RIGHT);
player1.setMovement(Movement.RIGHT);
break;
case UP:
localPlayer.setMovement(Movement.UP);
player1.setMovement(Movement.UP);
break;
case DOWN:
localPlayer.setMovement(Movement.DOWN);
player1.setMovement(Movement.DOWN);
break;
case ENTER:
player1.dropBomb();
break;

case A:
player2.setMovement(Movement.LEFT);
break;
case D:
player2.setMovement(Movement.RIGHT);
break;
case W:
player2.setMovement(Movement.UP);
break;
case SPACE:
localPlayer.dropBomb();
case S:
player2.setMovement(Movement.DOWN);
break;
case SHIFT:
player2.dropBomb();
break;
}
});
Expand All @@ -55,7 +73,16 @@ public void initialize(URL url, ResourceBundle rb) {
event.getCode() == KeyCode.UP ||
event.getCode() == KeyCode.DOWN
) {
localPlayer.setMovement(Movement.IDLE);
player1.setMovement(Movement.IDLE);
}

if (
event.getCode() == KeyCode.A ||
event.getCode() == KeyCode.D ||
event.getCode() == KeyCode.W ||
event.getCode() == KeyCode.S
) {
player2.setMovement(Movement.IDLE);
}
});

Expand Down
23 changes: 17 additions & 6 deletions BM_scenebuilder_msot/src/application/game/Bomb.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@ public class Bomb extends GameObject {

private List<Rectangle2D> explosion = new ArrayList<>();

private int explosionTime = 2;
private int explosionCountdown = 2;
private int explosionDuration = 2;

private long droppedAt = 0;
private long explosionStart = 0;

public Bomb(Image image) {
Expand All @@ -22,11 +25,19 @@ public Bomb(Image image) {
this.setFitHeight(60);
}

public void update() {
public void update(long now) {
if (!isExploding()) {
if (droppedAt == 0) {
droppedAt = now;
}
if (timestampToSeconds(now - droppedAt) >= explosionCountdown) {
explode(now);
}
}
}

public boolean exploded() {
return ((System.currentTimeMillis() / 1000L) - this.explosionStart) >= explosionTime;
public boolean exploded(long now) {
return timestampToSeconds(now - explosionStart) >= explosionDuration;
}

public boolean withinExplosion(GameObject gameObject) {
Expand All @@ -39,7 +50,7 @@ public boolean withinExplosion(GameObject gameObject) {
return false;
}

public void explode() {
public void explode(long now) {
// explosion right
this.explosion.add(new Rectangle2D(getX()+getFitWidth(), getY(), 250, getFitHeight()));
// explosion left
Expand All @@ -49,7 +60,7 @@ public void explode() {
// explosion down
this.explosion.add(new Rectangle2D(getX(), getY()+getFitHeight(), getFitWidth(), 250));

this.explosionStart = System.currentTimeMillis() / 1000L;
this.explosionStart = now;
}

public boolean isExploding() {
Expand Down
40 changes: 34 additions & 6 deletions BM_scenebuilder_msot/src/application/game/Field.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@ public Field(AnchorPane fieldPane) {
}

public double getWidth() {
return fieldPane.getWidth();
return fieldPane.getMaxWidth();
}

public double getHeight() {
return fieldPane.getHeight();
return fieldPane.getMaxHeight();
}

public boolean isCollidingWithStaticElement(Node node) {
Expand All @@ -44,23 +44,43 @@ public boolean isCollidingWithStaticElement(Node node) {
return false;
}

public void update() {
public void update(long now) {
Bomb removeBomb = null;
for (Bomb b : this.bombs) {
b.update(now);
if (b.isExploding()) {
for (Player p : this.players) {
// if player is not alive we can skip the check
if (!p.isAlive()) {
break;
}
if (b.withinExplosion(p)) {
// player is within explosion
System.out.println("Player is within explosion");
p.damage(100);

// is player still alive after damage ?
if (!p.isAlive()) {
// player is within explosion
System.out.println("Player died");
p.triggerRespawn(now);
}
}
}
if (b.exploded()) {

// remove exploded bomb
// todo: remove multiple in one frame
if (b.exploded(now)) {
fieldPane.getChildren().remove(b);
removeBomb = b;
}
}
}

// cleanup Objects
this.bombs.remove(removeBomb);

for (Player p : this.players) {
p.update(now);
}
}

public void add(Node node) {
Expand All @@ -76,4 +96,12 @@ public void addBomb(Bomb bomb) {
this.add(bomb);
this.bombs.add(bomb);
}

public List<Bomb> getBombs() {
return bombs;
}

public List<Player> getPlayers() {
return players;
}
}
23 changes: 7 additions & 16 deletions BM_scenebuilder_msot/src/application/game/Game.java
Original file line number Diff line number Diff line change
@@ -1,23 +1,18 @@
package application.game;

import application.manager.AssetManager;
import javafx.geometry.Point2D;
import javafx.scene.image.Image;
import javafx.scene.layout.AnchorPane;

import java.util.ArrayList;
import java.util.List;

public class Game {

private static Game Instance;

private GameAnimationTimer gameAnimationTimer;
private AssetManager assetManager = new AssetManager();
private Player localPlayer;
private Field field;

public List<GameObject> gameObjectList = new ArrayList<>();

/**
* Singleton Pattern for Game Instance
* @return Game Instance
Expand All @@ -33,29 +28,25 @@ public void Initialize(AnchorPane pane) {
this.field = new Field(pane);
assetManager.loadAssets();


localPlayer = createPlayerObject();
field.addPlayer(localPlayer);
gameObjectList.add(localPlayer);
// first player upper left
field.addPlayer(createPlayerObject(new Point2D(0,0)));
// second player lower right
field.addPlayer(createPlayerObject(new Point2D(field.getWidth()-Player.WIDTH, field.getHeight()-Player.HEIGHT)));
}

public void Start() {
gameAnimationTimer = new GameAnimationTimer();
gameAnimationTimer.start();
}

public Player getLocalPlayer() {
return localPlayer;
}

public Field getField() {
return this.field;
}

// todo: move to factory pattern
private Player createPlayerObject() {
private Player createPlayerObject(Point2D initialPos) {
Image playerImage = assetManager.getImageAsset("player");
Player player = new Player(field, playerImage, assetManager.getImageAsset("bomb"));
Player player = new Player(field, playerImage, assetManager.getImageAsset("bomb"), initialPos);
return player;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,6 @@ public class GameAnimationTimer extends AnimationTimer {
*/
@Override
public void handle(long now) {
for (GameObject go : game.gameObjectList) {
go.update();
}

game.getField().update();
game.getField().update(now);
}
}
6 changes: 5 additions & 1 deletion BM_scenebuilder_msot/src/application/game/GameObject.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,13 @@
import javafx.scene.image.ImageView;

abstract class GameObject extends ImageView {
public abstract void update();
public abstract void update(long now);

public Point2D getCenterPosition() {
return new Point2D(getX()+(getFitWidth()/2), getY()+(getFitHeight()/2));
}

public int timestampToSeconds(long now) {
return (int)(now / 1000 / 1000 / 1000);
}
}
Loading

0 comments on commit 19d0136

Please sign in to comment.