I am making TANKS2D game in javafx and the problem is when I shoot a bullet I can only move it once a few spaces and it stays there and cant be removed unless I remove it from a pane but if I do it's like it was never fired in the beginning (plus my tank can't move on that spot because the bullet stays as a node on that place and I can only move my tank on a place that doesn't have a node in it).
package hr.algebra.controller;
import hr.algebra.model.BulletMovement;
import hr.algebra.model.Player1Bullet;
import hr.algebra.model.Player2Bullet;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.ResourceBundle;
import java.util.Spliterator;
import java.util.Timer;
import java.util.function.Consumer;
import javafx.animation.RotateTransition;
import javafx.animation.TranslateTransition;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.Node;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.TilePane;
import javafx.scene.shape.Circle;
import javafx.scene.text.Text;
import javafx.scene.transform.Rotate;
import javafx.util.Duration;
public class GameScreenController implements Initializable {
@FXML
private Pane paneScore;
@FXML
private Text player1Lives;
@FXML
private Text player2Lives;
@FXML
private Text player1Score;
@FXML
private Text player2Score;
@FXML
private GridPane paneBoard;
//0108 zadnji
@FXML
private ImageView ImageView0201;
@FXML
private ImageView ImageView0708;
@FXML
private ImageView Tank1;
@FXML
private ImageView Tank2;
@FXML
private ImageView ImageView1106;
@FXML
private ImageView ImageView21123;
@FXML
private ImageView ImageView21124;
@FXML
private ImageView ImageView21125;
@FXML
private ImageView ImageView21126;
@FXML
private ImageView ImageView216;
@FXML
private ImageView ImageView217;
@FXML
private ImageView ImageView218;
@FXML
private ImageView ImageView219;
@FXML
private ImageView ImageView2110;
@FXML
private ImageView ImageView2120;
@FXML
private ImageView ImageView2121;
@FXML
private ImageView ImageView2122;
@FXML
private ImageView ImageView2123;
@FXML
private ImageView ImageView2124;
@FXML
private ImageView ImageView2125;
@FXML
private ImageView ImageView2126;
@FXML
private ImageView ImageView2127;
@FXML
private ImageView ImageView2129;
@FXML
private ImageView ImageView2130;
@FXML
private ImageView ImageView2131;
@FXML
private ImageView ImageView2132;
@FXML
private ImageView ImageView2133;
@FXML
private ImageView ImageView21161;
@FXML
private ImageView ImageView21162;
@FXML
private ImageView ImageView21163;
@FXML
private ImageView ImageView21164;
@FXML
private ImageView ImageView21165;
@FXML
private ImageView ImageView21166;
@FXML
private ImageView ImageView21167;
@FXML
private ImageView ImageView21168;
@FXML
private ImageView ImageView21251;
@FXML
private ImageView ImageView211641;
@FXML
private ImageView ImageView211642;
@FXML
private ImageView ImageView211643;
@FXML
private ImageView ImageView211644;
@FXML
private ImageView ImageView211645;
@FXML
private ImageView ImageView211646;
@FXML
private ImageView ImageView211647;
@FXML
private ImageView ImageView211648;
@FXML
private ImageView ImageView211649;
@FXML
private ImageView ImageView21169;
@FXML
private ImageView ImageView2116421;
@FXML
private ImageView ImageView2116422;
@FXML
private ImageView ImageView2116423;
@FXML
private ImageView ImageView21331;
@FXML
private ImageView ImageView21332;
@FXML
private ImageView ImageView21333;
@FXML
private ImageView ImageView21334;
@FXML
private ImageView ImageView2128;
@FXML
private ImageView ImageView2134;
@FXML
private ImageView ImageView2135;
@FXML
private ImageView ImageView2136;
@FXML
private ImageView ImageView0411;
@FXML
private ImageView ImageView0910;
@FXML
private ImageView ImageView0208;
@FXML
private ImageView ImageView0505;
@FXML
private ImageView ImageView0803;
@FXML
private ImageView ImageView0111;
@FXML
private ImageView ImageView0503;
@FXML
private ImageView ImageView0408;
@FXML
private ImageView ImageView0813;
@FXML
private ImageView ImageView0514;
@FXML
private ImageView ImageView0613;
@FXML
private ImageView ImageView0911;
@FXML
private ImageView ImageView0812;
@FXML
private ImageView ImageView0809;
@FXML
private ImageView ImageView0807;
@FXML
private ImageView ImageView0906;
@FXML
private ImageView ImageView1110;
@FXML
private ImageView ImageView0103;
@FXML
private ImageView ImageView0213;
@FXML
private ImageView ImageView0104;
@FXML
private ImageView ImageView0205;
@FXML
private ImageView ImageView0300;
@FXML
private ImageView ImageView1102;
@FXML
private ImageView ImageView0701;
@FXML
private ImageView ImageView0303;
@FXML
private ImageView ImageView1210;
@FXML
private ImageView ImageView0310;
@FXML
private ImageView ImageView0507;
@FXML
private ImageView ImageView0108;
@Override
public void initialize(URL url, ResourceBundle rb) {
}
//private List<ImageView> imageViewList = new ArrayList<ImageView>();
private Player1Bullet player1Bullet;
private Player2Bullet player2Bullet;
private String faceUp = "up";
private String faceDown = "down";
private String faceLeft = "left";
private String faceRight = "right";
private BulletMovement movement;
@FXML
private void MoveTankAndShoot(KeyEvent e) throws FileNotFoundException {
int row1 = GridPane.getRowIndex(Tank1);
int column1 = GridPane.getColumnIndex(Tank1);
int row2 = GridPane.getRowIndex(Tank2);
int column2 = GridPane.getColumnIndex(Tank2);
if (e.getCode()
== KeyCode.W && !checkBrickUpper(paneBoard, row1, column1)) {
row1 -= 1;
Tank1.setImage(new Image(new FileInputStream("C:\\Users\\Leon Kranjcevic\\OneDrive - Visoko uciliste Algebra\\Documents\\NetBeansProjects\\TANKS2DFX\\src\\hr\\algebra\\utils\\player1_tank_up.png")));
Tank1.setUserData(movement.UP);
}
if (e.getCode()
== KeyCode.A && !checkBrickLeft(paneBoard, row1, column1)) {
column1 -= 1;
Tank1.setImage(new Image(new FileInputStream("C:\\Users\\Leon Kranjcevic\\OneDrive - Visoko uciliste Algebra\\Documents\\NetBeansProjects\\TANKS2DFX\\src\\hr\\algebra\\utils\\player1_tank_left.png")));
Tank1.setUserData(movement.LEFT);
}
if (e.getCode()
== KeyCode.S && row1 != 14 && !checkBrickDown(paneBoard, row1, column1)) {
row1 += 1;
Tank1.setImage(new Image(new FileInputStream("C:\\Users\\Leon Kranjcevic\\OneDrive - Visoko uciliste Algebra\\Documents\\NetBeansProjects\\TANKS2DFX\\src\\hr\\algebra\\utils\\player1_tank_down.png")));
Tank1.setUserData(movement.DOWN);
}
if (e.getCode()
== KeyCode.D && column1 != 14 && !checkBrickRight(paneBoard, row1, column1)) {
column1 += 1;
Tank1.setImage(new Image(new FileInputStream("C:\\Users\\Leon Kranjcevic\\OneDrive - Visoko uciliste Algebra\\Documents\\NetBeansProjects\\TANKS2DFX\\src\\hr\\algebra\\utils\\player1_tank_right.png")));
Tank1.setUserData(movement.RIGHT);
}
if (e.getCode()
== KeyCode.SPACE) {
player1Bullet = new Player1Bullet(column1, row1);
movebulletPlayer1(player1Bullet);
GridPane.setHalignment(player1Bullet, HPos.CENTER);
GridPane.setValignment(player1Bullet, VPos.CENTER);
paneBoard.add(player1Bullet, player1Bullet.getX(), player1Bullet.getY());
}
if (e.getCode()
== KeyCode.UP && !checkBrickUpper(paneBoard, row2, column2)) {
row2 -= 1;
Tank2.setImage(new Image(new FileInputStream("C:\\Users\\Leon Kranjcevic\\OneDrive - Visoko uciliste Algebra\\Documents\\NetBeansProjects\\TANKS2DFX\\src\\hr\\algebra\\utils\\player2_tank_up.png")));
Tank2.setUserData(movement.UP);
}
if (e.getCode()
== KeyCode.DOWN && row2 != 14 && !checkBrickDown(paneBoard, row2, column2)) {
row2 += 1;
Tank2.setImage(new Image(new FileInputStream("C:\\Users\\Leon Kranjcevic\\OneDrive - Visoko uciliste Algebra\\Documents\\NetBeansProjects\\TANKS2DFX\\src\\hr\\algebra\\utils\\player2_tank_down.png")));
Tank2.setUserData(movement.DOWN);
}
if (e.getCode()
== KeyCode.LEFT && !checkBrickLeft(paneBoard, row2, column2)) {
column2 -= 1;
Tank2.setImage(new Image(new FileInputStream("C:\\Users\\Leon Kranjcevic\\OneDrive - Visoko uciliste Algebra\\Documents\\NetBeansProjects\\TANKS2DFX\\src\\hr\\algebra\\utils\\player2_tank_left.png")));
Tank2.setUserData(movement.LEFT);
}
if (e.getCode()
== KeyCode.RIGHT && column2 != 14 && !checkBrickRight(paneBoard, row2, column2)) {
column2 += 1;
Tank2.setImage(new Image(new FileInputStream("C:\\Users\\Leon Kranjcevic\\OneDrive - Visoko uciliste Algebra\\Documents\\NetBeansProjects\\TANKS2DFX\\src\\hr\\algebra\\utils\\player2_tank_right.png")));
Tank2.setUserData(movement.RIGHT);
}
if (e.getCode()
== KeyCode.L) {
player2Bullet = new Player2Bullet(column2, row2);
movebulletPlayer2(player2Bullet);
GridPane.setHalignment(player2Bullet, HPos.CENTER);
GridPane.setValignment(player2Bullet, VPos.CENTER);
paneBoard.add(player2Bullet, player2Bullet.getX(), player2Bullet.getY());
}
GridPane.setRowIndex(Tank1, row1);
GridPane.setColumnIndex(Tank1, column1);
GridPane.setRowIndex(Tank2, row2);
GridPane.setColumnIndex(Tank2, column2);
paneBoard.getChildren().addAll(Tank1, Tank2);
}
public boolean checkBrickUpper(GridPane paneBoard, int row, int column) {
boolean collide = false;
int rowIznad = row - 1;
ObservableList<Node> childrens = paneBoard.getChildren();
Player1Bullet player1Bullet = new Player1Bullet(row,column);
for (Node node : childrens) {
Integer columnIndex = GridPane.getColumnIndex(node);
Integer rowIndex = GridPane.getRowIndex(node);
if (columnIndex == null) {
columnIndex = 0;
}
if (rowIndex == null) {
rowIndex = 0;
}
if (columnIndex == column && rowIndex == rowIznad) {
collide = true;
}
}
return collide;
}
public boolean checkBrickDown(GridPane paneBoard, int row, int column) {
boolean collide = false;
int rowIspod = row + 1;
ObservableList<Node> childrens = paneBoard.getChildren();
for (Node node : childrens) {
Integer columnIndex = GridPane.getColumnIndex(node);
Integer rowIndex = GridPane.getRowIndex(node);
if (columnIndex == null) {
columnIndex = 0;
}
if (rowIndex == null) {
rowIndex = 0;
}
if (columnIndex == column && rowIndex == rowIspod) {
collide = true;
}
}
return collide;
}
public boolean checkBrickLeft(GridPane paneBoard, int row, int column) {
boolean collide = false;
int columnLeft = column - 1;
ObservableList<Node> childrens = paneBoard.getChildren();
for (Node node : childrens) {
Integer columnIndex = GridPane.getColumnIndex(node);
Integer rowIndex = GridPane.getRowIndex(node);
if (columnIndex == null) {
columnIndex = 0;
}
if (rowIndex == null) {
rowIndex = 0;
}
if (columnIndex == columnLeft && rowIndex == row) {
collide = true;
}
}
return collide;
}
public boolean checkBrickRight(GridPane paneBoard, int row, int column) {
boolean collide = false;
int columnRight = column + 1;
ObservableList<Node> childrens = paneBoard.getChildren();
for (Node node : childrens) {
Integer columnIndex = GridPane.getColumnIndex(node);
Integer rowIndex = GridPane.getRowIndex(node);
if (columnIndex == null) {
columnIndex = 0;
}
if (rowIndex == null) {
rowIndex = 0;
}
if (columnIndex == columnRight && rowIndex == row) {
collide = true;
}
}
return collide;
}
private void movebulletPlayer1(Player1Bullet player1Bullet1) throws FileNotFoundException {
TranslateTransition translate = new TranslateTransition(Duration.millis(3000), player1Bullet1);
if (Tank1.getUserData() == movement.UP && paneBoard.getRowIndex(Tank1) > 0) {
/*for (Node node : paneBoard.getChildren()){
if (!player1Bullet1.getBoundsInParent().intersects(node.getBoundsInParent())) {
paneBoard.add(player1Bullet1,paneBoard.getColumnIndex(Tank1),paneBoard.getRowIndex(Tank1));
translate.setByY(-300);
translate.play();
}
}*/
player1Bullet1.move(faceUp);
} else if (Tank1.getUserData() == movement.DOWN && paneBoard.getRowIndex(Tank1) < 14) {
player1Bullet1.move(faceDown);
} else if (Tank1.getUserData() == movement.LEFT && paneBoard.getColumnIndex(Tank1) > 0) {
player1Bullet1.move(faceLeft);
} else if (Tank1.getUserData() == movement.RIGHT && paneBoard.getColumnIndex(Tank1) < 14) {
player1Bullet1.move(faceRight);
}
}
private void movebulletPlayer2(Player2Bullet player2Bullet1) throws FileNotFoundException {
if (Tank2.getUserData() == movement.UP && paneBoard.getRowIndex(Tank2) > 0) {
player2Bullet1.move(faceUp);
} else if (Tank2.getUserData() == movement.DOWN && paneBoard.getRowIndex(Tank2) < 14) {
player2Bullet1.move(faceDown);
} else if (Tank2.getUserData() == movement.LEFT && paneBoard.getColumnIndex(Tank2) > 0) {
player2Bullet1.move(faceLeft);
} else if (Tank2.getUserData() == movement.RIGHT && paneBoard.getColumnIndex(Tank1) < 14) {
player2Bullet1.move(faceRight);
}
}
}
This is Main class
package hr.algebra;
import java.io.FileNotFoundException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("view/GameScreen.fxml"));
Scene scene = new Scene(root);
primaryStage.setHeight(660);
primaryStage.setWidth(800);
primaryStage.setResizable(false);
primaryStage.setTitle("Tank 2D");
primaryStage.setScene(scene);
primaryStage.show();
scene.getRoot().requestFocus();
}
public static void main(String[] args) throws FileNotFoundException {
launch(args);
}
}
This is Bullet1
package hr.algebra.model;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
public class Player1Bullet extends Circle {
private int x, y;
public Player1Bullet(int x, int y) {
super(5, Color.YELLOW);
this.x = x;
this.y = y;
}
public void move(String face) {
if (face.equals("right")) {
x += 1;
} else if (face.equals("left")) {
x -= 1;
} else if (face.equals("up")) {
y -= 1;
} else {
y += 1;
}
}
public int getX() {
return (int) x;
}
public int getY() {
return (int) y;
}
}
This is Bullet2
package hr.algebra.model;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
public class Player2Bullet extends Circle {
private int x, y;
public Player2Bullet(int x, int y) {
super(5, Color.ORANGE);
this.x = x;
this.y = y;
}
public void move(String face) {
if (face.equals("right")) {
x += 1;
} else if (face.equals("left")) {
x -= 1;
} else if (face.equals("up")) {
y -= 1;
} else {
y += 1;
}
}
public int getX() {
return (int) x;
}
public int getY() {
return (int) y;
}
}
This is ENUM
package hr.algebra.model;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
public class Player2Bullet extends Circle {
private int x, y;
public Player2Bullet(int x, int y) {
super(5, Color.ORANGE);
this.x = x;
this.y = y;
}
public void move(String face) {
if (face.equals("right")) {
x += 1;
} else if (face.equals("left")) {
x -= 1;
} else if (face.equals("up")) {
y -= 1;
} else {
y += 1;
}
}
public int getX() {
return (int) x;
}
public int getY() {
return (int) y;
}
}