0

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;
    }

}

image

kleopatra
  • 51,061
  • 28
  • 99
  • 211
L. Kranja
  • 1
  • 2
  • I have never attempted this before, so I could be wrong. I feel like in these situations you should be using `setTranslationX`/`setTranslationY`. – SedJ601 Nov 15 '21 at 04:19
  • You've posted the Bullet2 code twice instead of the enum code. – swpalmer Nov 19 '21 at 15:44

0 Answers0