BramV
BramV

Reputation: 59

Move object added to grid over specified number of gridcells in (user-)specified direction

For a game in Java, I want to move the player object in a specified direction with a specified distance. While - using the Java Random API - it works fine to move the player randomly on the board, I can't unfortunately find any suitable method to move the player over a specified distance in the X and Y direction. In the code below are some codes I tried (as comments, with //) , but none of them comes close to working. package high;

Any solutions that work?

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class mov {
int distance=50; 
    private MoveModel MoveModel;
    private Showvisible showvisible;
    public mov() {

        MoveModel = new MoveModel();
        showvisible = new Showvisible(MoveModel);
        showvisible.getButton().addActionListener(e-> movePlayer());
        //showvisible.getButton3(à.addActionListener(e))
    }

    //move player to a random position (works fine) 
    private void movePlayer() {
        final Random rnd = new Random();
        MoveModel.setPlayerX(rnd.nextInt(100));
        MoveModel.setPlayerY(rnd.nextInt(100));
        showvisible.refresh();
    }

    //Move player in the x direction to the East  (doesn't work) 
   private void movePlayer2(int distance) {
       MoveModel.setPlayerX(+50);
    //  MoveModel.setPlayerY(distance++);
       //MoveModel.setPlayerX(distance); 
       //MoveModel.setPlayerX(playerX+distance);    //Many variations tried, none of them works 

        showvisible.refresh(); 
    }


    public static void main(String[] args) {
        new mov();
    }
}

class Showvisible {

    private final static int GAP = 2;
    MoveModel MoveModel;
    private MainPanel mainPanel;

    Showvisible(MoveModel MoveModel){
        this.MoveModel = MoveModel;
        createAndShowGUI();
    }

    void refresh() {
        mainPanel.repaint();
    }

    private void createAndShowGUI() {
        JFrame board = new JFrame("Single Player Game");
        board.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainPanel = new MainPanel();
        board.add(mainPanel);
        board.pack();
        board.setVisible(true);
    }

    JButton getButton() {   return mainPanel.getButton();   }
    JButton getButton2() { return mainPanel.getButton(); } 

    class MainPanel extends JPanel {

        private BottomPanel bPanel;

        MainPanel() {
            setLayout(new BorderLayout(GAP,GAP));
            add(new TopPanel(), BorderLayout.PAGE_START);
            add(new BoardPanel(), BorderLayout.CENTER);
            bPanel = new BottomPanel();
            add(bPanel, BorderLayout.PAGE_START);
        }

        JButton getButton() {   return bPanel.getButton();  }
        JButton getButton2() { return bPanel.getButton2(); } 

    }

    class TopPanel extends JPanel {
        TopPanel() {
            setLayout(new FlowLayout(FlowLayout.CENTER));
            add(new JLabel("This is an amazing game "));
        }
    }

    class BoardPanel extends JPanel {

        Player player;

        BoardPanel()   {

            setBorder(BorderFactory.createLineBorder(Color.BLACK, GAP));
            GridLayout layout = new GridLayout(MoveModel.getBoardRows(), 
            MoveModel.getBoardCols());
            setLayout(layout);

            for (int i = 0; i <MoveModel.getBoardRows(); i++)   {

                for (int j = 0; j < MoveModel.getBoardCols(); j++)  {
                    add(new Tile());
                }
            }

            player = new Player();
            player.setBounds(new Rectangle(1000,1000, 1000,1000));
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            player.paint(g);
        }
    }

    class Tile extends JLabel {

        Tile() {
            setPreferredSize(new Dimension(MoveModel.getSquareSize(), MoveModel.getSquareSize()));
            setBorder(BorderFactory.createLineBorder(Color.ORANGE, GAP));
        }
    }

    class Player extends JLabel{

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.RED);
            g.fillRect(MoveModel.getPlayerX(), MoveModel.getPlayerY(), MoveModel.getPlayerSize(),MoveModel.getPlayerSize());
        }
    }

    class BottomPanel extends JPanel {

        JButton button = new JButton("Random Move");
        JButton button2 =new JButton("move East");


        BottomPanel(){
            add(button);
            add(button2);

        }

        JButton getButton() {   return button;  }
        JButton getButton2() { return button2; } 
    }
}

class MoveModel{

    private int boardRows = 9, boardCols = 9, squareSize = 50;
    int playerX = 0;
    private int playerY = 0;
    private int playerSize =25;
    int getPlayerX() {  return playerX; }

    void setPlayerX(int playerX) {  this.playerX = playerX; }

    int getPlayerY() {return playerY;   }

    void setPlayerY(int playerY) {  this.playerY = playerY; }

    int getPlayerSize() {return playerSize; }

    int getBoardRows() {return boardRows; }

    int getBoardCols() {return boardCols; }

    int getSquareSize() {return squareSize; }

output

Upvotes: 1

Views: 648

Answers (1)

c0der
c0der

Reputation: 18812

In Showvisible change

JButton getButton2() { return mainPanel.getButton(); }

to

JButton getButton2() { return mainPanel.getButton2(); }

In Mov constructor (do not use mov for a class name) assign an action listener to the button:

 showvisible.getButton2().addActionListener(e-> movePlayerX(50));

And add this method to Mov :

//Move player in the x direction to the East (positive) or west (negative 
private void movePlayerX(final int distance) {
    moveModel.setPlayerX(moveModel.getPlayerX() + distance);//get current x and add to it 
    showvisible.refresh();
}

To increment X, you use getPlayerX() to retrieve the current position and add to it.
The complete modified code can be copied from here

Upvotes: 1

Related Questions